클래스의 관계
일반화 관계(Generalization)
- 상속관계 (is a 관계)
- 부모클래스를 상속 받아 자식클래스에서 사용
ex) 사원클래스 / 관리자 클래스
→ 관리자는 사원이다. (O)
→ 사원은 관리자다. (X)
실체화 관계(Realization)
- 인터페이스를 상속 받아 자식클래스에서 재정의하여 사용
- 부모클래스의 은닉화 선언된 필드 또는 메소드는 상속되지만 접근은 불가능
- 부모 인스턴스 생성 후 자식 인스턴스 생성
ex) 도형 인터페이스 >> 원클래스 or 삼각형클래스
연관 관계(Association) 또는 직접 연관 관계(Direct Association)
- 포함관계 (has a 관계)
- 클래스 안에 필드를 참조변수로 선언하여 사용 - 인스턴스 정보 저장
ex) Computer << CPU + Mainboard + Memory
집합 연관 관계(Aggregation)
- UML2.0에서는 연관관계로 표현
- 포함 관계의 인스턴스와 생명주기 다른 경우
ex) 컴퓨터 << 프린터
복합 연관 관계(Compostion)
- 포함 관계의 인스턴스와 생명주기 같은 경우
ex) 게임 << 캐릭터
의존 관계(Dependency)
- 메소드의 파라메터로 선언되어 사용되는 참조변수
- 일시적으로 메소드에서 인스턴스를 사용할 경우
ex) TV << 리모콘
※ ObjectAid 설치(이클립스의 확장 프로그램) ↓↓
https://www.objectaid.com
상속(Inheritance)
: 클래스를 물려받아 사용하는 기능
★상속을 사용하는 이유★
- 기존 클래스를 활용하여 보다 빠르게 새로운 클래스 작성 : 프로그램의 생산성 증가
ex) 자료실 → 게시판(상속) + 파일처리
- 공통적인 속성과 기능을 정의한 클래스를 생성하여 상속 받아 사용 : 유지보수 효율성 증가
ex) 사람 >> 학생,강사,직원
- 물려주는 클래스 : 부모클래스, 선조클래스, 슈퍼클래스, 기본클래스
- 물려받는 클래스 : 자식클래스, 후손클래스, 서브클래스, 파생클래스
- 부모클래스의 생성자는 자식클래스에게 상속 불가능
- 부모클래스의 은닉화 선언된 필드 또는 메소드는 상속 되지만 접근 불가능
- 상속 방법 : 단일 상속 >> 부모클래스가 하나만 존재
public class 자식클래스 extends 부모클래스 { //부모클래스의 필드 및 메소드 사용 가능 }
- 자식클래스로 인스턴스를 생성할 경우 자식클래스의 생성자가 실행되기 전에 부모클래스 생성자가 먼저 실행
→ 부모 인스턴스 생성 후 자식 인스턴스 생성
super 키워드
: 자식클래스의 메소드에서 부모 인스턴스를 표현할 때 사용하는 키워드
- 자식클래스의 메소드에서 부모 인스턴스의 필드 또는 메소드에 접근하기 위해 사용
- 자식클래스의 필드 또는 메소드가 아닌 경우 자동으로 부모클래스의 필드 또는 메소드 사용 : super 생략 가능
★super 키워드를 사용하는 경우★
- 자식클래스의 생성자에서 부모클래스 생성자를 호출하기 위해 사용
- 자식클래스의 생성자가 호출되기 전에 super 키워드에 의해 부모클래스의 생성자가 먼저 호출
- super 키워드로 생성자 호출하는 명령은 생성자에서 최초의 명령으로 반드시 작성
- super 키워드로 부모클래스의 생성자 호출이 생략된 경우 기본 생성자 호출
형식) super(값, ...);
- 오버라이드 선언되어 숨겨진 부모클래스의 메소드에 직접 접근해야 할 경우 사용
형식) super.메소드명(값, ...);
메소드 오버라이드(Method Override)
- 부모클래스의 메소드를 자식클래스에서 재선언 하는 기능
- 부모클래스의 메소드는 숨겨지고 자식클래스의 메소드만 사용
- 상속관계에서만 구현 가능
- 부모클래스의 메소드의 머릿부를 동일하게 선언
- 접근지정자, 반환형, 메소드명, 파라메터, 예외전달이 반드시 동일
@override : 오버라이드 선언 메소드를 표현하기 위한 어노테이션 (Annotation)
→ 오버라이드 선언 규칙을 지키지 않을 경우 에러 발생
★상속 관계에서 참조변수(레퍼런스변수)와 인스턴스의 사용법★
⑴ 부모클래스 참조변수 = new 부모클래스(); [가능]
→ 참조변수는 부모클래스 요소에 접근 가능
⑵ 자식클래스 참조변수 = new 자식클래스(); [가능]
→ 참조변수는 자식클래스의 요소 및 부모클래스의 요소에 접근 가능
→ 부모인스턴스와 자식인스턴스를 생성하여 자식인스턴스를 참조변수에 저장
⑶ 자식클래스 참조변수 = new 부모클래스(); [불가능]
→ 자식인스턴스가 존재하지 않아 참조변수에 저장할 경우 에러 발생
★ ⑷ 부모클래스 참조변수 = new 자식클래스(); [가능]
→ 참조변수는 기본적으로 부모클래스의 요소에 접근 가능
→ 객체 형변환을 이용하면 자식클래스의 요소에 접근 가능
→ 부모인스턴스와 자식인스턴스를 생성하여 부모인스턴스를 참조변수에 저장
★객체형변환★
객체형변화 : 상속관계의 클래스에서 구현
⑴ 명시적 형변환 (강제형변환)
- cast 연산자 이용
- (자식클래스명 )참조변수 → 참조변수의 자료형을 상속관계의 자식클래스로 잠시 변환
((MemberEvent)member4).setEmail("aaa@google.com");
→ 자식인스턴스로 변경하여 저장 (자식클래스 접근 가능)
⑵ 묵시적 형변환(자동형변환)
- 메소드 오버라이딩을 이용
<메소드 오버라이드에 의한 다형성>
☞ 부모참조변수에 저장된 자식인스턴스에 따라 자식인스턴스의 메소드 호출
☞ 부모참조변수에 저장된 자식인스턴스를 JVM이 자동으로 구분하여 처리
★instanceof 연산자★
- 부모참조변수로 객체 형변환 가능한 자식인스턴스을 구분하기 위한 연산자
형식) 참조변수 instanceof 자식클래스
→ 참조변수가 자식클래스로 객체 형변환 가능한 경우 true 제공
★java.lang.Objetc 클래스★
- 모든 클래스가 반드시 상속 받는 최선조클래스
- 모든 인스턴스는 Object 클래스의 메소드 사용 가능
- 클래스를 선언할 때 상속받는 클래스가 없을 경우 자동으로 Object 클래스 상속
- 참조변수의 인스턴스 정보를 출력하면 Object 클래스의 toString() 메소드 자동 호출
- Object 클래스의 toString() 메소드를 오버라이드 선언하여 사용
final 키워드
⑴ final 필드
형식) 접근지정자 final 자료형 필드명 = 값;
- 필드값 변경 불가능
※ final 필드명은 모두 대문자로 작성하며 단어 구분자로 _ 사용
※ 상수필드(Constant Field) : 상수 대신 사용하기 위한 고유명칭
public static final 필드명 = 값;
ex) java.lang.Math 클래스 - public static final double PI
→ API 문서에서 Constant Field Values 에서 저장된 값 확인
⑵ final 메소드
접근지정자 final 반환형 메소드명(파라메터,...) {
명령;
...
}
→ 메소드 오버라이드 선언 불가능
ex) java.lang.Object 클래스 - public final void notify() 메소드
⑶ final 클래스
접근지정자 final class 클래스명 { }
- 상속 불가능 → 부모클래스로 사용 불가능
ex) java.lang.System 클래스 - public final class System extends Object
추상클래스(Abstract Class)
- 추상클래스는 인스턴스 생성 불가능 → 상속 목적의 클래스
형식) 접근지정자 abstract class 클래스명 { }
- 추상메소드를 1개라도 가지고 있으면 반드시 추상클래스 선언
추상메소드(Abstract Method)
추상메소드 : 영역이 없는 불완전한 메소드 (명령 미존재)
형식) 접근지정자 abstract 반환명 메소드명(파라메터,...);
- 추상메소드가 존재하는 추상클래스를 상속받은 자식클래스는 모든 추상메소드를 반드시 오버라이드 선언
- 추상메소드를 오버라이드 선언하지 않을 경우 자식클래스도 추상클래스로 작성
★추상메소드를 만드는 이유★
자식클래스에서 반드시 선언해야 되는 메소드와 작성규칙 제공 : 작업명세서
추상클래스(부모)로 참조변수를 만들어 자식인스턴스의 정보 저장 (객체 형변환 이용)
패키지(package)
패키지(pachage) : 디렉토리(폴더)와 동일 → 파일을 구분하여 저장하기 위해 사용
- 같은 기능의 참조형을 그룹화 하기 위해 패키지 사용
※ 참조형 : 개발자가 선언할 수 있는 자료형 → class, interface, enum
- 참조형에 대한 소스파일 처음에 패키지 선언
- 형식) package 패키지명;
- → 패키지에 참조형이 선언 되었음을 표현
- 패키지명은 도메인(Domain)을 역방향으로 나열하여 작성하는 것을 권장
- ※ 도메인 : 인터넷에서 개인 또는 그룹이 사용할 수 있는 주소(고유값)
- 패키지 마지막에는 작업그룹명을 작성하는 것을 권장
import
- 참조형을 사용하기 위해서는 패키지명을 포함한 참조형으로 표현
- 패키지에 같은 경우 패키지명을 미포함하여 표현 가능
- 패키지명을 포함한 참조형을 import 처리하면 패키지명을 미포함하여 표현
- 형식) import 패키지명.참조형;
- package 명령 아래 및 참조형 선언 위에 작성
- 이클립스에서는 참조형을 자동 완성한 경우 자동 import 처리
- 형식) import 패키지명.*;
- 패키지에 존재하는 모든 참조형 import 처리
- java.lang 패키지는 자동으로 import 처리되어 있으므로 java.lang 패키지의 참조형은 사용 가능
- 같은 이름의 참조형이 존재하므로 import 처리 주의
※ import를 정리하는 단축키 : Ctrl+Shift+O
→ 필요한 참조형을 import 처리하거나 불필요한 참조형의 import 처리 제거
지정자(Modifier) : 접근의 유무 제어
- 접근지정자 ☞ private , public , protected , package
- 클래스지정자 ☞ static
- 추상지정자 ☞ abstract
- 파이널지정자 ☞ final
접근지정자(Access Modifier)
접근지정자(Access Modifier) : 참조형의 구성요소에 접근 유무 제어
⑴ private : 참조형의 구성요소를 숨겨 접근 불가능 (은닉화)
- 가장 제한적인 접근지정자
- 참조형 내부에서만 접근 가능하며 외부에서는 접근 불가능
- 필드에 잘못된 정보가 저장되는 것을 방지하기 위해 사용 → Getter & Setter(캡슐화)
※ 생성자 또는 메소드를 private 선언 가능
⑵ public
- 무조건 접근 가능한 접근지정자
- 참조형 내부 및 동일 패키지 또는 다른 패키지의 참조형 어디서나 접근 가능
- 생성자 또는 메소드를 public 선언 >> 상수필드(Constant Field) 선언
참조형을 선언할 때 public 키워드를 붙이는 이유??
다른 패키지의 참조형에서 접근 가능하도록 선언
참조형에 public 키워드가 없는 경우 다른 패키지에서 접근 불가능
※ 소스파일에는 public 키워드가 선언된 참조형 하나만 선언 가능
→ 소스파일명은 반드시 public 키워드가 선언된 참조형의 이름으로 저장
⑶ package(default)
- 접근지정자 관련 키워드를 사용하지 않고 선언한 경우
- 참조형 내부 및 동일 패키지의 참조형에서는 접근 가능
- 다른 패키지의 참조형에서는 접근 불가능
⑷ protected
- 참조형 내부 및 동일 패키지의 참조형에서는 접근 가능
- 다른 패키지의 참조형에서는 접근 불가능
but 다른 패키지의 클래스에서 상속 받은 경우에는 접근 가능
인터페이스(Interface)
인터페이스(Interface) : 상수필드(Constant Field) + 추상메소드(Abstract Method)
JDK 1.8이상에서는 기본메소드(Default Method)와 정적메소드(Static Method) 선언 가능
public interface 인터페이스명 {
자료형 변수명=값; //public static final 생략
...
반환형 메소드명(매개변수,...); //public abstract 생략
...
}
- 인터페이스를 이용하여 인스턴스 생성 불가 → 생성자가 선언되어 있지 않기 때문
- 인터페이스는 클래스가 상속받아 사용 → 클래스의 부모 역할 수행
- 클래스에서 인터페이스를 상속받는 방법 → 다중상속 가능
public class 클래스명 implements 인터페이스명,인터페이스명,... {
}
※ 클래스는 단일상속만 가능하지만 인터페이스 다중상속 가능
- 인터페이스를 상속받은 클래스는 반드시 인터페이스의 모든 추상메소드를 오버라이드 선언 (실체화 작업)
- 인터페이스를 이용하여 참조변수를 생성하고 자식인스턴스 정보를 저장하여 객체 형변환으로 접근 가능
- 인터페이스는 기존 인터페이스 상속 가능 (다중상속 가능)
public interface 인터페이스명 extends 인터페이스명,... {
}
★인터페이스 존재 이유★
- Java 프로그램 작성시 단일상속의 문제점을 보완하기 위해 인터페이스 사용
- 클래스의 단일상속 문제로 프로그램 작성의 어려움 발생
예를 들어서,
public class 늑대인간 extends 인간,늑대 [불가능]
public class 늑대인간 extends 인간 implements 늑대 [가능]
public class 흡혈늑대인간 extends 인간 implements 늑대,흡혈귀 [가능]
- 작업명세서의 역할
- 인터페이스를 상속받은 모든 자식클래스에 동일한 메소드 작성 규칙을 제공받아 작성
- 클래스 간의 결합도를 낮춰 시스템 변경에 대한 프로그램 유지보수의 효율성 증가
나열형(Enum)
: 상수필드(Constant Field)
public enum 나열명 { //나열형 상수(Enum Constant) - 필드값 생략 가능
필드명,필드명,...; //public static final int 생략
}
- 나열형 상수에는 내부적으로 0부터 1씩 증가되는 정수상수 자동 저장
- 나열형 상수에 다른 자료형을 선언하거나 원하는 상수를 저장하고 할 경우 필드와 생성자 선언
- 필드와 생성자는 반드시 private 접근지정자로 선언
- 나열형 상수 설정시 반드시 생성자로 상수를 전달하여 저장
- 생성자 선언할 때 매개변수에 값을 전달받아 상수필드에 초기값 저장
- 생성자 선언한 경우 상수필드에 초기값을 전달해야만 상수필드 생성
ex) 필드명(초기값), 필드명(초기값), ... ;
- 상수필드값을 확인하기 위한 getter 메소드 선언
- 인터페이스의 상수필드에서 고유값으로 표현되지 않는 문제점을 해결하기 위해 사용
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 객체지향 프로그래밍에 대한 이해 (1) (0) | 2020.12.19 |
---|---|
웹 서버 :: 이클립스 WAS 설치(Apache Tomcat) 및 사용방법 (0) | 2020.12.17 |
신입 개발자 기술면접 준비하기 (2) - Java (0) | 2020.12.16 |
신입 개발자 기술면접 준비하기 (1) - Java (0) | 2020.12.16 |
이클립스(eclipse) 다운로드 및 실행 (0) | 2020.09.26 |