상속
목표
자바의 상속에 대해 학습하세요.
학습할 것 (필수)
- 자바 상속의 특징
- super 키워드
- 메소드 오버라이딩
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 추상 클래스
- final 키워드
- Object 클래스
자바 상속의 특징
상속의 개념을 알기전에 객체지향의 특징인 다형성을 알아야 하는데,
다형성(Polymorphism)
같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질
(동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.)
상속(Inheritance)
부모 클래스에서 클래스의 행동과 정의를 가져다 사용할 수 있게 해준다.
기존의 정의와 상태를 상속받아 사용할 수 있으며, 새로운 행동을 추가하거나 새로운 타입에 대한 행동을 오버라이드 할 수 있다.
상속을 통해 부모가 가지는 행동을 추가 또는 재정의함으로써 다형성을 구현할 수 있다.
상속의 특징
- 부모 클래스의 private 접근자를 갖는 필드와 메소드는 상속대상에서 제외
- 부모 클래스가 다른 패키지에 있을 경우, default 저근자를 갖는 필드와 메소드는 상속대상에서 제외
- 자식 클래스가 한 개가 여러 부모 클래스를 상속받을 수 없다.
super 키워드
생성자를 통해 자식 클래스를 만들 경우
힙영역에서는 자동으로 부모객체와 자식객체 두 개를 생성하는데,
이건 자식객체에서 super(); 를 부른것 과 같다.
자, 그럼 super 키워드란?
상속 관계에서 슈퍼 클래스(부모)의 메소드나 필드를 명시적으로 참조하기 위해서 사용된다.
메소드 오버라이딩
자바 상속의 특징에서 다형성(Polymorphism)에 대해 언급했었는데, 그걸 위해 직접적으로 사용되는게
"메소드 오버라이딩" 이다.
오버라이딩(Overriding)?
상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메소드도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다. 하지만, 하위 클래스에서 메소드를 재정의해서 사용할 수 있다.
상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술을 오버라이딩(Overriding) 이라고 한다.
다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
상당히 생소한 주제..
다이나믹 디스패치를 좀 더 쉽게 이해하기 위해서는 Static Dispatch의 개념에 대해 이해해야 한다.
※ Static Dispatch란?
컴파일 시점에 컴파일러가 어떤 클래스의 메소드를 실행해야하는지 알고 바이트코드로도 남는다.
(참고로 메소드 오버로딩의 경우 static dispatch를 사용한다.)
public class Dispatch{
public void run(){
System.out.println("run");
}
public static void main(String[] args) {
new Dispatch().run();
}
}
※ Dynamic Dispatch란?
추상 타입의 메소드를 호출하는것만 인지하고 있고, 컴파일 시점에선 어떤 메소드를 호출하는지 모르는 메소드일 경우는 런타임 시점에 할당된 객체의 타입을 보고 실행할 메소드를 결정하는게 다이나믹 디스패치
public class Dispatch{
static abstract class Service{
abstract void run();
}
static class ServiceTest extends Service{
@Override
void run() {
System.out.println("ServiceTest run");
}
}
public static void main(String[] args) {
Service svc = new ServiceTest();
svc.run();
}
}
추상 클래스
추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다.
추상 메소드는 선언만 있고 본체는 없는 함수이며 선언부에 ‘abstract’ 라는 키워드를 붙인다. 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 ‘abstract’키워드를 붙여야 한다.
그렇다면 일반 클래스와 무슨 차이가 있는가? 거의 없다 단지 추상 메소드를 선언하여 상속을 통해서
자식 클래스에서 완성하도록 유도하는 클래스라고 볼 수 있다.
일반 클래스가 설계도 라면 추상 클래스는 미완성 설계도라고 보면 이해가 빠를 것 같다.
그렇다면 왜? 사용할까?
1. 공통화
추상클래스에서 미리 정의한 필드와 메서드가 있다면, 실체클래스는 추상클래스의 필드와 메서드명을 변경할 수 없고 무조건 해당 명명으로 구현해야한다. 따라서, 필드와 메소드 이름을 통일하여 유지보수성을 높이고 통일성을 유지할 수 있다.
2. 시간 절약
추상클래스에서 실체클래스를 구현할 때,강제로 주어지는 필드와 메소드를 가지고 나만의 스타일대로 구현만 하면 된다. 구현하는데만 집중할 수 있으므로 시간이 절약된다.
3. 규격에 맞는 실체 클래스의 구현
실체클래스 구현시 추상클래스를 상속 받고 하면 아무리 자기 스타일대로 클래스를 구현한다고 한들, 그것도
결국 추상클래스의 기본 규격안에서 구현하는 것이 된다.
참고자료(추상클래스 vs 인터페이스)
[JAVA] 추상클래스 VS 인터페이스 왜 사용할까? 차이점, 예제로 확인 :: 마이자몽
추상클래스 인터페이스 왜... 사용할까? 우리는 추상클래스와 인터페이스에 대해서 알고 있냐고 누가 물어본다면 알고 있다고 대답을 하고있습니다. 그런데 이론적인 내용 말고 정작 "왜 사용하
myjamong.tistory.com
final 키워드
평소에는 변수에만 사용하고 있어 변수에 대한 용도 목적만 알았지,
이걸 메소드나 클래스에 적용하는 방법도 있다는걸 알게 되었다.
우선 final 키워드란?
상수(정해진 값)를 표현하기 위한 예약어
1. 변수의 final
2. 메소드의 final
3. 클래스의 final