목표
자바의 상속에 대해 학습하세요.
학습할 것
- 자바 상속의 특징
- super 키워드
- 메소드 오버라이딩
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 추상 클래스
- final 키워드
- Object 클래스
자바 상속의 특징
상속의 개념
상속(Inheritance)이란 물려준다는 의미이다. 어떤 객체가 있을 때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속이라고 한다.
상속의 장점
- 기존의 작성된 클래스를 재활용할 수 있다.
- 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않아도 된다.
- 클래스 간의 계층적 관계를 구성함으로 다형성의 문법적 토대를 마련한다.
- 하위 클래스에서 상위 클래스의 특성을 포함하고 확장해서 사용할 수 있다.
자바 상속의 특징
- 다중 상속을 지원하지 않는다.
- 상속 횟수에 제한을 두지 않는다.
- 최상위 클래스는 Object 클래스이다.
이제 코드를 살펴보겠습니다.
Parent 클래스와 Child 클래스를 생성하고, Child 클래스는 Parent 클래스를 상속받도록 만들어 보았습니다.
상속의 키워드는 extends를 이용해서 상속받고자 하는 클래스를 뒤에 작성해 주시면 됩니다.
위 예제의 결과 값입니다.
분명 Child 객체만 생성하였는데 Child 생성자만 호출된 게 아니라 Parent 즉 부모 생성자가 먼저 호출된 이후에 Child 생성자가 호출되는 것을 확인하실 수 있습니다. 위와 같은 결과는 아래 super 키워드에서 설명드리도록 하겠습니다.
super 키워드
super의 경우 자식클래스가 부모클래스로부터 상속받은 맴버를 사용하고자 할 때 사용됩니다.
사실 저 Child() 생산자에 super() 메소드가 숨겨져있어서 super() 메소드를 이용해서 Parent 클래스의 생성자를 호출하였던 것입니다.
super()를 명시적으로 작성해 주지 않으면 컴파일 단계에서 자동으로 추가가 되기 때문에 위와 같은 결과가 나올 수 있었습니다.
** super() 메소드는 자식 생정자의 맨 첫 줄에 생성이됨 그 외에는 에러 발생
super() 메소드를 명시적으로 작성해 준 코드입니다. 결과값은 위와 동일합니다.
super 키워드를 이용해서 Parent 클래스의 원하는 생성자로 초기화할 수 있고 Parent 변수에도 접근할 수 있습니다.
메소드 오버라이딩
상속은 부모의 메소드를 가져다 사용할 수도 있고, 이를 재정의하여 사용할 수도 있습니다.
'메소드 재정의'라고 할 수 있습니다.
substract 메소드인 경우는 Parent 클래스에 메소드를 가져다 사용하였지만 add 메소드 경우 오버라이딩하여서 Child 클래스에서 재정의해서 사용하였습니다.
이렇게 부모의 메소드를 가져다가 재정의 해서 사용하는 것을 메소드 오버라이딩이라고 부릅니다.
@Override는 애노테이션이라고 부르는데 다음 12주차에 공부할 예정입니다.
지금은 부모의 클래스를 오버라이딩할 때 위에 붙여주어서 '저 메소드가 부모의 클래스를 재정의 했구나' 명시적으로 확인 가능하게 해준다고만 생각하고 넘어가셔도 될 것 같습니다.
- 추가적으로 @Override 메소드를 이용해서 오버라이딩이 된 메소드인지 검증이 가능하다.
다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
다이나믹 메소드 디스패치는 크게 두 가지로 나뉩니다..
컴파일 타임에 호출할 때 메소드를 알 수 있으면 정적
컴파일 타임이 아닌 런타임에 호출할 메소드를 알 수 있으면 동적이라고 합니다.
다형적이지 않은 Code 13, 21, 53 번은 어떤 클래스에 메소드를 사용할지 컴파일 단계에서 알 수 있습니다.
이런 경우를 정적 메소드 디스패치라고 부르고, Code 37번과 같이 실제 사용되는 객체에 대한 정보를 알 수 없을 경우를 동적 메소드 디스패치라고 부릅니다.
동적 메소드 디스패치 경우 컴파일 시점이 아닌 런타임 시점에 어떤 객체의 메소드를 사용할지 결정됩니다.
추상 클래스
추상 클래스는 구체적이지 않은 클래스를 말합니다.
실체 클래스의 공통적인 부분을 추출해 가이드라인을 잡아놓은 추상적인 클래스입니다.
추상 클래스 포인트
1. 실체 클래스의 공통적인 부분(변수, 메소드)를 추출해서 선언한 클래스
2. 추상 클래스는 객체를 생성할 수 없다. 아직은 실체성이 벗고 구체적이지 않기 때문에
3. 추상 클래스와 실체 클래스는 상속관계이다.
4. 하나 이상의 추상 메서드를 포함한다.
추상 메서드란
메서드의 선언부만 작성하고 구현부는 미완성인 채로 남겨두는 메소드를 말합니다.
각 구현부는 상속받는 자식 클래스에서 다르게 구현됩니다.
코드로 살펴보겠습니다.
추상 클래스는 abstract 키워드를 class 앞에 붙여서 사용합니다.
add() 메소드에 abstract 키워드를 붙여줌으로서 추상 클래스를 상속받는 클래스들에게 add() 메소드 구현을 강제화합니다. 추가적으로 추상 클래스에 일반 메소드도 사용 가능하고 상속받은 클래스에서 구현할 필요도 없습니다.
추상 클래스를 상속받아서 add()라는 메소드를 재정의 해줘야 합니다. 만약 재정의를 하지 않으면 에러가 발생하게 됩니다.
위에서 설명했듯이 추상 클래스는 객체를 생성할 수 없습니다.
final 키워드
final 키워드는 더 이상 수정할 수 없음을 의미합니다.
클래스, 메소드, 변수 모두에서 사용이 가능합니다.
위 코드의 빨간 줄 표시에서 확인 할 수 있듯이 IDE에서 에러를 보여주고 있습니다.
클래스에 final 키워들 사용하면 상속을 막고, 메소드에 사용하면 오버라이딩을 막고, 변수에 할당하면 변수 값의 재정의를 막습니다.
Object 클래스
- Object 클래스는 자바 모든 클래스의 최상위 클래스이다.
- 그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서이다.
- 따로 상속 받지 않더라도 모든 클래스에서 Object 클래스를 상속받기 때분에 Object 클래스의 기본 메서드를 사용할 수 있다.
참조
www.tcpschool.com/java/java_inheritance_concept
'JAVA > Study' 카테고리의 다른 글
백기선님 자바 스터디 1주차 (0) | 2021.01.10 |
---|---|
백기선님 자바 스터디 8주차 - Interface (0) | 2021.01.10 |
백기선님 자바 스터디 7주차 (0) | 2020.12.27 |
백기선님 자바 스터디 5주차 (0) | 2020.12.19 |
백기선님 자바 스터디 4주차 (0) | 2020.12.06 |