포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로,
클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미합니다.
클래스 간의 관계를 설정하는 데 있어서 상속관계를 맺어 줄 것 인지 포함 관계를 맺어 줄 것인지를 어떤 기준으로 판별
클래스 간의 관계가 ‘~은 ~이다(IS-A)’ 관계(상속관계)인지 ~은 ~을 가지고 있다(HAS-A) 관계(포함관계)인지 문장을 만들어 생각
(참조변수 선언)
클래스명 참조변수명;
(포함도 마찬가지로)
다른 클래스명 참조변수명;
별개로
인스턴스 생성 후, 객체 주소를 참조 변수에 저장
참조변수명 = new 생성자();
이해안되는 부분. 여태 this()없이도 괜찮았잖아?!
모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 선언되어야 한다는 것입니다.
만약 super()가 없는 경우에는 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입합니다.
이때 상위클래스에 기본생성자가 없으면 에러가 발생하게 됩니다.
따라서 클래스를 만들 때는 자동으로 기본 생성자를 생성하는 것을 습관화하는 것이 좋습니다.
-서칭한 답:
생성자의 첫 줄에서 조상클래스의 생성자를 호출해야하는 이유는 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 하기 때문이다.
이러한 조상 클래스 생성자의 호출은 클래스의 상속관계를 거슬러 올라가서 모든 클래스의 최고 조상인 Object 클래스의 생성자인 Object()까지 가서 끝난다. 그래서 Object 클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다. 그렇지 않다면 컴파일러는 생성자의 첫 줄에 super();를 자동적으로 추가한다.
super 키워드가 헷갈렸는데
상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 붙여서 구별할 수 있다.
조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 this를 사용할 수 있다. (이부분을 직접 코드 수정하면서 확인) 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고 super와 this는 근본적으로 같다. 모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.
Object 클래스의 대표적인 몇 가지 메서드
반환 타입 | 메서드명 | |
String | toString() | 객체 정보를 문자열로 출력 |
boolean | equals(Object obj) | 등가 비교 연산(==)과 동일하게 스택 메모리값 비교 |
int | hashCode() | 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단 |
void | wait() | 현재 thread? pause |
void | notify() | 일시정지 중인 thread? rework |
Object 메소드
protected Object clone() | 해당 객체의 복제본을 생성하여 반환함. |
boolean equals(Object obj) | 해당 객체와 전달받은 객체가 같은지 여부를 반환함. |
protected void finalize() | 해당 객체를 더는 아무도 참조하지 않아 가비지 컬렉터가 객체의 리소스를 정리하기 위해 호출함. |
Class<T> getClass() | 해당 객체의 클래스 타입을 반환함. |
int hashCode() | 해당 객체의 해시 코드값을 반환함. |
void notify() | 해당 객체의 대기(wait)하고 있는 하나의 스레드를 다시 실행할 때 호출함. |
void notifyAll() | 해당 객체의 대기(wait)하고 있는 모든 스레드를 다시 실행할 때 호출함. |
String toString() | 해당 객체의 정보를 문자열로 반환함. |
void wait() | 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함. |
void wait(long timeout) | 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지날 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함. |
void wait(long timeout, int nanos) | 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지나거나 다른 스레드가 현재 스레드를 인터럽트(interrupt) 할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함. |
접근 제어자접근 제한 범위
접근제어자 | 범위 |
private | 동일 클래스에서만 |
default | 동일 패키지 내에서만 |
protected | 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능 |
public | 접근 제한 없음 |
'부트캠프 TIL' 카테고리의 다른 글
22.11.10 JAVA 컬렉션 (0) | 2022.11.10 |
---|---|
22.11.08 JAVA 객체지향 다형성, 추상화 (0) | 2022.11.08 |
22.11.04 JAVA 객체지향 생성자, 내부 클래스 (0) | 2022.11.04 |
22.11.03 Blogging & 클래스와 객체 & 필드와 메서드 (0) | 2022.11.03 |
22.10.28 Git 기초 (0) | 2022.10.28 |