suniverse 2022. 12. 5. 22:47

<상속 Inheritance>

 

- 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용) 

- 두 클래스를 부모와 자식으로 관계를 맺어주는 것 

- 자손은 조상(부모의 부모)의 모든 멤버를 상속받는다(생성자, 초기화블럭 제외)

- 자손의 멤버 개수는 조상보다 적을 수 없다(같거나 많다) 

자손의 멤버개수는 부모보다 많다는데 왜 0개냐? 0개가 아니다. 자신의 멤버가 없을 뿐이지 부모의 멤버를 상속받았기 때문에 멤버가 1개다

- 자손의 변경은 조상에 영향을 미치지 않는다 

 

이렇게 자식에 새로운 메서드를 추가해도 부모엔 영향을 안 끼친다. 이 경우 부모는 멤버 1개, 자식은 멤버 2개(자식멤버 1개, 상속멤버1개)

 

--> 왼쪽은 Point와 관계가 없기 때문에 클래스를 수정해도 멤버엔 변화가 안 생긴다. 하지만 오른쪽은 Point 클래스를 상속받았기 때문에, Point클래스를 수정하면 멤버의 개수가 바뀐다. 

왼쪽 오른쪽은 상속유무의 차이는 있지만, 객체로 만들면 똑같은 결과가 나온다 

부모의 변경은 자손에 영향을 미치고, 자손의 영향은 부모에 영향은 안 미친다. 

부모 멤버를 주석처리하면 이렇게 에러가 난다

 

-----------------------------------------------------------------------------

<ch7-3,4 클래스 간의 관계, 상속과 포함> 

 

클래스의 관계는 크게 상속과 포함, 이렇게 2가지로 나눌 수 있다 (실제로는 좀 더 세분화 되어 있다)

 

 

 

<ch7-3 포함 관계>

- 포함(composite)이란? 

클래스의 멤버로 참조변수를 선언하는 것 

작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다 

 

Circle이 Point를 포함
왼쪽 오른쪽 전부 저장공간이 3개로 똑같지만, 구조적인 차이가 있다. (왼쪽에 알파벳 z가 아니라 r이다! 오타임)

왼쪽은 c.x c.y c.r

오른쪽은 c.c.x c.c.y c.r 

 

---> Car클래스가 Engine과 Door를 포함. 멤버를 다 쓰기 보다, 엔진이나 도어 처럼 작은 클래스들을 포함시키는게 자동차를 만들면 복잡도가 줄어든다. 그리고 나중에 엔진이나 도어 클래스가 재사용될수도 있다. 

 

<ch7-4 클래스 간의 관계 결정하기> 

 

- 상속관계: '~은 ~이다. (is-a)" 

- 포함관계 '~은 ~을 가지고 있다. (has-a)'

원은 점을 가지고 있다 라는 문장이 더 적합하다. 그러니 포함 관계이다.

 

(상속은 여러가지 제약이 많으니 꼭 필요할때만 사용하도록하자) 

둘 다 멤버는 3개. 구조만 다르다

 

상속

 

포함

 

-------------------------------------------------

<ch7-5,6 단일상속, Object 클래스> 

 

- 단일 상속(Single Inheritance)

- 자바는 단일상속만을 허용한다. --> 하나의 부모만 상속 C++은 다중상속허용 

 

- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다. 

<Object클래스 - 모든 클래스의 조상> 

 

- 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다. 

 

컴파일러가 Object 자동으로 추가해준다

- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다. 

toString(), equals(Object obj), hashCode(), ........

상속계층도

 

+++ toString 중요 !!!

toString이라는 메서드가 없는데도 아무 문제가 없다. 왜? 자동으로 상속된 Object 클래스로 부터 11개의 메서드를 상속받았기 때문이다.
toString이 문자열을 반환

 

--> Circle@2a139a55 

클래스 이름 Circle과 객체 주소값을 보여준다. (정확히 말하자면 객체주소값은 아니지만 객체주소라고 하자 여기선) 

객체를 하나 더 만들면? 서로 다르게 출력되겠지
toString을 안 쓰고 c만 써줘도 결과가 똑같이 나온다

--> c.toString을 호출하다 그냥 참조변수 c를 호출하나 결과는 똑같다. 이건 println 메서드의 기능이다. 

println이 여기에 참조변수가 들어오면 내부적으로 toString을 호출한다. 

일단 여기선 저 두 문장이 동일하다는 것만 알면된다.