[자바] 상속, 추상클래스, 인터페이스
상속이란?
기존 클래스의 속성과 기능을 새로운 클래스에서 재사용할 수 있도록 하는 기능
상속 시 메모리 공간
자식 클래스 인스턴스를 생성할 때, 부모 클래스 인스턴스도 함께 생성된다. 이 때 실제로 메모리에 할당되는 객체는 자식 클래스의 인스턴스 하나로 이 인스턴스 안에는 부모 클래스의 멤버(필드와 메서드)가 포함되어 있음.
즉 부모에서 자식까지의 모든 메타 정보를 가진 하나의 인스턴스를 생성한다.
(물리적으로 하나로 생성된다 할지라도, 다형성 개념을 이해하기 위해서 논리적으로는 분리해서 생성된다고 이해하는 것이 편하다)
super 키워드
super
→ 부모와 자식의 필드명이 같은 경우나 메서드가 오버라이딩 되어있을 때 자식에서 부모의 필드나 메서드를 호출할 수 없음. 이런 상황에서 super 키워드를 사용하면 부모를 참조할 수 있음
super()
→ 상속 관계의 인스턴스를 생성하면 메모리 내부에 자식과 부모 클래스가 만들어짐. 즉 자식 클래스에서 부모 클래스의 생성자를 반드시 호출함.
→ 부모 클래스의 생성자가 기본 생성자인 경우 생략 가능
추상 클래스
상속을 목적으로 부모 클래스를 제공하지만 실제로는 생성되지 않는 클래스. 즉 인스턴스가 존재하지 않는 추상적인 클래스(ex.. Animal)
- 부모 클래스를 상속받는 자식 클래스가 반드시 오버라이딩 해야하는 메서드를 부모 클래스에 정의할 수 있으며 이러한 메서드를 추상 메서드라고 함. 추상 메서드는 실체가 존재하지 않고 바디가 없음
- public abstract void 메소드명();
- 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야함.
- 추상 클래스를 자식이 상속받았을 때 자식에서 추상 메서드를 오버라이딩 안하면 자식 클래스로 추상 클래스로 선언해야함.
- → 추상 메서드는 실체가 없기 때문.
- 자식 클래스에서 실수로 메서드 오버라이딩 하지 않을 상황을 방지.
- 모든 메서드가 추상 메서드일 경우 순수 추상 클래스라고 하며 역시 인스턴스를 생성할 수 없고, 상속 시 모든 자식이 메서드를 오버라이딩 해야하며 다형성을 위해 사용.
- 순수 추상 클래스 → 즉 부모의 기능을 재사용한다는 개념보다는 어떠한 규격을 정해놓고 쓰기 위함. (부모 타입의 역할만 하는 껍데기일 뿐)
인터페이스 : 순수 추상 클래스를 더 편리하게 사용할 수 있도록 제공
위에서 말한 순수 추상클래스와 동일하며 인터페이스는 추가 편의 기능이 더 제공
- 인터페이스 내 모든 메서드는 public abstract 이며 이는 생략 가능
- 다중 구현(상속) 지원. 인터페이스는 보통 부모의 기능 재사용이 목적이 아닌 한 규격에서 구현하는 것이 목적이므로 구현이라고 한다. 인터페이스 내의 메서드는 모두 추상 메서드이므로 가능함.
- 인터페이스 내의 모든 멤버변수는 public static final(상수)이며 역시 생략 가능 → 안정성과 일관성 제공을 위함.
- (예를 들어 계산기 인터페이스에서 PI 멤버 변수가 있는데 이를 상수로 하지 않아 인터페이스에서 구현하는 계산기들이 PI를 바꿀 경우 규격을 벗어나게 됨.)
순수 추상 클래스라면 인터페이스를 사용할 것! 왜냐하면 추상 클래스로 작성한다면 이후에 구현되어 있는 메서드를 클래스 내에 작성할 수도 있으므로 명확하지 않게 됨
자바8 default 메서드, 자바9의 private 메서드를 사용하면 interface 내에서도 실행 가능한 메서드를 구현할 수 있지만 이는 예외적인 경우.
인터페이스 vs 추상클래스
인터페이스는 구현이 전혀 없이 형식(규격)만 제공할 때 사용, 추상 클래스는 일부 메서드의 구현이 필요할 때 사용
클래스, 인터페이스, 추상클래스 모두 메모리 구조는 동일
참고 : 추상 클래스 + static = 이 클래스는 객체를 생성하지 말고, static에 있는 기능만 사용하라는 의미