상속 (수평적구조 VS 수직적구조)

Kyu·2021년 1월 18일
0

Java 공부기록

목록 보기
14/40

어떤 클래스를 설계할떄 초보자는 기본적으로 수평적으로 설계할 것이다.

앞으로 클래스를 설계할때는 수직적구조로 설계하도록 노력해보자

어떻게 해야 수직적 구조로 설계할 수 있을까?

상속을 쓰면 된다.

수평적 설계의 단점
1. 수평적설계에서는 코드의 중복이 발생할 수 있다.
2. 새로운 요구사항에 대한 코드의 수정이 불가피하다. (유지보수)
3. 관리하기가 어렵다. 부모와 자식의 관계를 생각했을때 부모가 있을때는 자식을 일정부분 관리해줄수있기때문에 자식은 혜택을 받을수있겠지만 부모가없으면 자식이 모든 부분을 해결해야하기때문에 힘들수가있다

이런 문제를 해결하기 위해서 수평적 설계를 수직적 설계로 바꾸면 어느정도 그 문제를 해결할수있따
중복적인 코드를 Animal이라는 클래스에 넣고, 고유 특성은 Dog, Cat 이렇게 나누어서 관리할수있을것이다.
1. 수평적 설계의 단점을 극복 할 수 있다.
2. 확장을 쉽게 할 수 있다. (extends)
3. 코드가 복잡해 진다. (대신에 이점이 많다)

모든클래스의 최상위클래스(root)는 Object 클래스이다.
모든 클래스는 부모클래스가 있어야하는데 extends Object가 생략되어있다.
부모자식이 연결되려면 생성자에서 super() 라는 핵심키워드를 이해해야한다.

클래스를 만들고 부모클래스를 상속받으면 먼저 기본생성자를 불러오도록 되어있다.
super() 라고 하면 부모 클래스의 생성자를 의미하게 된다.

자식 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 자식 클래스의 고유 멤버뿐만 아니라 부모 클래스의 모든 멤버까지도 포함되어 있습니다.

따라서 부모 클래스의 멤버를 초기화하기 위해서는 자식 클래스의 생성자에서 부모 클래스의 생성자까지 호출해야만 합니다.

이러한 부모 클래스의 생성자 호출은 모든 클래스의 부모 클래스인 Object 클래스의 생성자까지 계속 거슬러 올라가며 수행됩니다.

따라서 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫 줄에 자동으로 다음과 같은 명령문을 추가하여, 부모 클래스의 멤버를 초기화할 수 있도록 해줍니다.

super();

참고: http://www.tcpschool.com/java/java_inheritance_super

자식보다 부모가 먼저 있어야한다. 이런 상속관계에서 객체는 어떤방식으로 생성이될까?
결론은 부모먼저 만들어진다.

질문: super()에 의해서 자신의 생성자에서 부모의 생성자를 호출하는데, 그러면 자식이 부모를 낳는 격아닌가?

답변: 부모의 생성자를 호출하면, 먼저 생성자에 의해서 메모리에 부모가 올라오고 그다음에 super가 끝나면 자식 생성자에 의해서 자식 클래스가 메모리에 올라간다. 예를들어서 Object, Parent, Child 라는 상속관계의 클래스가 있다. Child의 기본생성자에서 메모리에 올라가기전에 super()에 의해서 부모 생성자를 호출한다. 부모 생성자가 실행되면서 부모 생성자 안의 super()가 Object 생성자를 호출한다. Object는 최상위 클래스이기때문에 super()가 없고, Object가 가장 먼저 실제로 메모리에 올라오게 된다. 그런 뒤에 부모클래스의 super()가 동작이 끝났으므로 부모클래스의 생성자또한 생성자에 의해서 메모리에 올라온다. 그런 식으로 자식도 마지막으로 메모리에 올라온다. (상속체이닝기법)

상속이 중요한건 나중에 자바에서 API를 사용할때 잘 쓸 수 있다.

profile
TIL 남기는 공간입니다

0개의 댓글