상속
public class cat extends animal{
//... do something
}
- 상속 관계에서 상위 클래스를 변경하면 코드 손상의 위험이 있다.
- 상속을 통해서 생성된 Class와 Objects는 밀접하게 결합되어 있다.(tightly coupled)
- 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있으며, 그 여파로 코드 한 줄 건드리지 않은 하위 클래스가 오동작할 수 있다.
컴포지션
컴포지션(Composition)은 구성요소라는 뜻으로 기존 클래스가 새로운 클래스의 구성요소로 쓰인다는 뜻이다.
public class House {
private Bedroom bedroom;
private LivingRoom livingRoom;
//... do something
}
- private 필드로 기존 클래스의 인스턴스를 참조
- 컴포지션의 경우 컴포지션을 통해 생성된 클래스와 객체는 느슨하게 결합되어(loosely coupled) 코드를 손상시키지 않고 구성 요소들을 바꿀 수 있다.
상속을 사용하는 경우는 언제일까?
상위 클래스와 하위 클래스가 “ is a ” 관계인 경우. “is a kind of” 가 좀 더 명확하다
- A cat is an animal , A cat is a kind of an animal
- A car is a vehicle, A car is a kind of a vehicle
class Vehicle {
String brand;
String color;
double speed;
void move() {
System.out.println("The vehicle is moving");
}
}
public class Car extends Vehicle {
String licensePlateNumber;
String owner;
String bodyStyle;
public static void main(String... inheritanceExample) {
System.out.println(new Vehicle().brand);
System.out.println(new Car().brand);
new Car().move();
}
}
컴포지션을 사용하는 경우는 언제일까?
one object가 또 다른 object를 “has” or “is part of” 하는 경우 컴포지션을 사용할 수 있다.
- A car has a battery (a battery is part of a car).
- A person has a heart (a heart is part of a person).
public class CompositionExample {
public static void main(String... houseComposition) {
new House(new Bedroom(), new LivingRoom());
// The house now is composed with a Bedroom and a LivingRoom
}
static class House {
Bedroom bedroom;
LivingRoom livingRoom;
House(Bedroom bedroom, LivingRoom livingRoom) {
this.bedroom = bedroom;
this.livingRoom = livingRoom;
}
}
static class Bedroom { }
static class LivingRoom { }
}
JDK에서 확인할 수 있는 상속에 대한 좋은 예시
예시
class IndexOutOfBoundsException extends RuntimeException {...}
class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException {...}
class FileWriter extends OutputStreamWriter {...}
class OutputStreamWriter extends Writer {...}
interface Stream<T> extends BaseStream<T, Stream<T>> {...}
Reference 및 참고 :
이펙티브 자바 Effective Java 3/E (조슈아블로크)
'IT 도서 > 이펙티브 자바' 카테고리의 다른 글
[클래스와 인터페이스] 추상 클래스보다는 인터페이스를 우선하라 (0) | 2023.08.01 |
---|---|
생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2023.07.02 |
생성자 대신 정적 팩토리 메소드를 고려하라 (0) | 2023.07.02 |