들어가며
자바에는 상속이라는 개념이 있다. 우테코 과제를 진행하면서 상속을 사용했더라면 더 좋았을텐데.. 했지만 시간의 부족함으로 처리하지 못했다. 그래서 상속을 한번 정리해보기로 했다.
상속
자바에는 부모클래스와 자식클래스가 있다. 자식 클래스는 부모 클래스의 멤버를 상속받아 그대로 사용할 수 있다.
상속을 하는 이유 ?
이미 만들어져 있는 클래스를 재사용 할 수 있어서 효율적이고 중복된 코드가 줄어든다.
유지보수가 쉽고, 확장성이 용이하고, 재사용이 가능하고, 코드가 간결해진다.
클래스 상속
자식 클래스 이름 앞에 extends 키워드를 사용한다.
다중상속을 허용하지 않는다.
//부모
public class Parent { ... };
//상속받은 자식
public class Child extends Parent { ... };
super 키워드
자식 클래스에서 부모 클래스를 가리킬 때 사용하는 키워드이다.
주로 부모 클래스 필드에 접근,메소드 호출시 사용한다.
public class Player {
private final Name name;
private final Cards cards;
public Player(String name) {
this.name = new Name(name);
this.cards = new Cards();
}
}
//Player를 상속받는
public class Dealer extends Player {
public Dealer() {
super(NAME);
}
}
이런식으로 작성하였었다.
하지만 2단계를 구현하게 되면서 Player와 Dealer의 역할이 달라졌고 Player는 베팅금액을 갖고 있어야하지만 Dealer는 갖고있지 않아도 됐다. 그래서 코드를 수정하게 되었다.
public class Participant {
private final Name name;
private final Cards cards;
public Participant(Name name) {
this.name = name;
this.cards = new Cards();
}
}
//딜러
public class Dealer extends Participant {
public Dealer() {
super(new Name(NAME));
}
}
//플레이어
public class Player extends Participant {
private static final int BLACK_JACK = 21;
private final BettingMoney bettingMoney;
public Player(String name, BettingMoney money) {
super(new Name(name));
this.bettingMoney = money;
}
}
이런식으로 공통의 Participant를 만들고 딜러와 플레이어가 각각 상속하는 방식으로 구현하였다.
상속의 장점
부모 클래스에서 구현한 속성과 메소드를 자식 클래스에서 그대로 사용하여 재사용성이 높다.
유지보수가 용이하다.
코드 구조가 명확해질 수 있다.
상속의 단점
부모 클래스와 자식클래스가 결합되면서 결합도가 높아진다. 계층 구조가 복잡하다면 코드가 이해하기 어렵다.
상위 클래스의 구현이 하위 클래스에게 노출되는 상속은 캡슐화를 깨뜨릴 수 있다.
인터페이스 상속
인터페이스는 implements키워드를 통해 상속할 수 있다.
다중상속이 가능하다.
public class Parent implements Interface1, Interface2
상속받은 자식 클래스는 상속받은 인터페이스의 메소드를 오버라이딩 해야한다!
조합
조합은 기존 클래스가 새로운 클래스의 구성요소로 쓰인다.
public class Participants {
private final Dealer dealer;
private final Players players;
public Participants(Dealer dealer, Players players) {
this.dealer = dealer;
this.players = players;
}
}
인스턴스 변수를 줄여보기 위해 dealer와 players를 갖는 participants를 생성해보았다.
조합의 장점
메소드를 호출하는 방식이기에 캡슐화가 깨지지 않는다.
기존 클래스 변화에 영향이 적어지고 안전하다.
조합의 단점
조합은 확장을 고려한 is-a 관계일 때 여야한다.
- 위의 예시에선 dealer와 player는 Participants이기에 조합을 사용하였다.
결함이 하위 클래스까지 전파돼도 괜찮은 경우 사용한다.
나가며
상속을 잘 사용해보자..
'코코코딩공부 > JAVA' 카테고리의 다른 글
[Gradle] dependency 차이점 (CompileOnly, RuntimeOnly, api, implementation) (0) | 2023.03.27 |
---|---|
[JAVA] 캐싱 (0) | 2023.03.19 |
[JAVA] VO(Value Object) 란 무엇인가 ? (0) | 2023.03.12 |
[JAVA] 제네릭 Generic (1) | 2023.03.04 |
[JAVA] 예외 처리 (0) | 2023.02.26 |