상속(Inheritance)
상속은 객체 지향 프로그래밍의 핵심 원칙 중 하나로, 코드의 재사용성을 높여주고, 유지보수를 쉽게 만들어주는 강력한 기능입니다.
1. 상속이란?
자바에서 상속은 클래스가 다른 클래스의 특성과 동작을 물려받는 것을 말합니다.
이로 인해 기존 클래스의 모든 멤버 변수와 메서드를 새로운 클래스에서 사용할 수 있게 됩니다.
상속을 통해 기존 클래스의 기능을 수정하거나 확장하여 새로운 클래스를 정의할 수 있습니다.
- 상위 클래스
- 상위(super), 부모(parent), 기본(base) 클래스라고 부릅니다.
- 하위 클래스
- 하위(sub), 자식(child), 유도(derived) 클래스라고 부릅니다.
2. 상속의 장점
- 코드의 재사용성 증가
- 기존의 클래스를 재활용하여 새로운 클래스를 생성할 수 있기 때문에, 중복 코드를 피하고 개발 시간을 단축할 수 있습니다.
- 이는 프로그램의 유지보수를 편리하게 만들어 줍니다.
- 계층적 구조의 설계
- 상속을 통해 클래스 간 계층적인 구조를 형성할 수 있습니다.
- 이는 객체 지향 프로그래밍의 유연한 설계를 가능케 합니다.
- 상위 클래스에서는 공통적인 특성을 정의하고, 하위 클래스에서는 상위 클래스의 특성을 확장하거나 변경하여 더 구체적인 기능을 구현할 수 있습니다.
- 다형성 지원
- 상속을 통해 다형성을 구현할 수 있습니다.
- 다형성은 한 객체가 여러 형태를 가질 수 있는 능력을 의미하며, 이는 코드의 유연성을 증가시키고 확장성을 높여줍니다.
3. 자바에서 상속 사용법
자바에서 상속은 'extends' 키워드를 사용하여 구현합니다.
아래는 상속을 통해 새로운 클래스를 정의하는 간단한 예제 코드입니다.
- 스마트 TV는 TV이다.
- TV: 상위 클래스, 스마트TV: 하위 클래스
상위 클래스
public class BasicTv {
// 필드
private boolean powerOn;
private int channel;
private int volume;
// 메서드
public void powerOnOff() {
if (powerOn) {
powerOn = false;
System.out.println("TV OFF");
} else {
powerOn = true;
System.out.println("TV ON");
}
}
public void printInfo() {
System.out.printf("TV(powerOn : %s, channel : %d, volume : %d\n",
this.powerOn, this.channel, this.volume);
}
}
하위 클래스
// 스마트TV는 TV이다.
// -> 스마트 TV는 기본 TV를 확장한다.
public class SmartTv extends BasicTv {
private String ip;
public String getIp() {
return this.ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
위 예제에서는 BasicTv 클래스를 상속받아 SmartTv 클래스를 정의하였습니다.
SmartTv 클래스는 BasicTV 클랫의 모든 멤버 변수와 메서드를 사용할 수 있습니다.
4. 주의할 점
다이아몬드 문제
다이아몬드 문제(Diamond Problem)는 객체 지향 프로그래밍에서 다중 상속을 지원하는 언어에서 발생할 수 있는 문제입니다.
이 문제는 두 개 이상의 클래스가 같은 부모 클래스를 상속하고,
그 후손 클래스가 이 두 개의 클래스를 모두 상속할 때 발생합니다.
이러한 상황에서 각 클래스들이 동일한 메서드나 멤버 변수를 가지게 되면 어떤 부모 클래스의 멤버를 상속받아야 하는지 모호해지는 문제가 발생합니다.
이런 상황에서 언어가 다이아몬드 모양으로 보이는 상속 구조를 가진다고 해서 "다이아몬드 문제"라고 불립니다.
다이아몬드 모양은 아래와 같은 구조를 의미합니다.
A
/ \
B C
\ /
D
여기서 A 클래스를 상속하는 B와 C 클래스가 있고, 이 두 클래스가 각각 D 클래스를 상속받을 때,
D 클래스는 A 클래스의 멤버를 두 번 상속받는 문제가 발생합니다.
이 경우 D 클래스에서 A 클래스의 멤버를 호출할 때 어떤 A 클래스의 멤버를 사용해야 할지 알 수 없어서 모호성이 발생합니다.
C++과 같은 몇몇 언어는 다중 상속을 지원하므로 이러한 다이아몬드 문제가 발생할 수 있습니다.
자바와 같은 언어는 다중 상속을 지원하지 않아 다이아몬드 문제를 직접적으로 해결할 수 있습니다.
자바에서는 클래스 간 상속 관계가 항상 계층적이며, 각 클래스는 하나의 직접적인 부모 클래스만을 가질 수 있습니다.
다이아몬드 문제를 해결하는 방법 중 하나는 다이아몬드 상속 구조를 허용하지 않는 것입니다.
이를 위해 일부 언어에서는 다중 상속을 지원하지 않거나, 다중 상속을 사용할 수 있지만 상속받은 클래스들 중에서 가장 가까운 클래스의 멤버를 사용하도록 하는 규칙을 정의합니다.
이러한 규칙은 다중 상속을 사용하는 언어에서 중요한 설계 문제이며, 프로그래머들은 상속 관계를 잘 이해하고 클래스들 간의 관계를 신중하게 설계해야 합니다.
또한, 다이아몬드 상속 문제를 해결하기 위해 인터페이스(interface)와 같은 다른 방법을 활용할 수도 있습니다.
인터페이스는 다중 구현이 가능하므로 다이아몬드 문제를 피할 수 있는 대안이 될 수 있습니다.
의도하지 않은 상속 문제
모든 클래스가 상속을 받을 수 있도록 하면 코드의 복잡성이 증가할 수 있으므로,
상속이 필요한 경우에만 사용하는 것이 좋습니다.
또한, 상속 받은 클래스가 기본 클래스의 내부 구현에 의존하는 경우,
기본 클래스를 수정할 때 예상치 못한 문제가 발생할 수 있습니다.
이런 경우, 상속보다는 인터페이스를 활용하는 것이 더 적합할 수 있습니다.
자바의 상속은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 코드의 재사용성과 유지보수성을 향상시키는 강력한 기능입니다.
하지만 상속을 남용하거나 오용하는 것은 오히려 코드를 복잡하게 만들 수 있으므로,
상속을 사용할 때는 신중하게 고려해야 합니다.
잘못된 정보는 댓글로 알려주시면 감사하겠습니다.
'Java' 카테고리의 다른 글
Java - 30. 자바의 super 키워드 (0) | 2023.08.01 |
---|---|
Java - 29. 자바의 this 키워드 (0) | 2023.07.31 |
Java - 27. 자바 싱글톤 패턴(Singleton Pattern) (0) | 2023.07.29 |
Java - 26. 자바의 인스턴스 멤버(Instance Member)와 스태틱 멤버(Static Member) (0) | 2023.07.28 |
Java - 25. 자바의 인스턴스(Instance) (0) | 2023.07.27 |