Ocean_
꾸준한 프로그래밍
Ocean_
전체 방문자
오늘
어제
  • 분류 전체보기 (174)
    • About Me (4)
    • 우아한테크코스 (27)
    • C & LINUX (50)
    • Operating System (12)
    • Database (25)
    • Computer Vision (0)
    • Problem Solving (0)
      • Programmers (0)
      • BOJ (0)
    • 코코코딩공부 (44)
      • Spring (12)
      • JAVA (14)
      • 디자인 패턴 (4)
      • 책 읽기 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • Linux
  • 원시값 포장
  • 자바
  • 1259
  • Spring
  • 우아한형제들
  • OS
  • 블랙잭
  • 백준
  • 인덱스
  • 우아한테크코스
  • OperatingSystem
  • 정규화
  • 우테코 체스
  • Operating System
  • bean
  • C++
  • 운영체제
  • DB
  • BOJ
  • 우테코
  • 우테코5기
  • signal
  • 데이터 조작어
  • SIGINT
  • C
  • 트랜잭션
  • 우아한테크코스5기
  • 리눅스
  • 프로세스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Ocean_

꾸준한 프로그래밍

코코코딩공부/JAVA

[JAVA] 상속 과 조합

2023. 3. 13. 15:41

들어가며

자바에는 상속이라는 개념이 있다. 우테코 과제를 진행하면서 상속을 사용했더라면 더 좋았을텐데.. 했지만 시간의 부족함으로 처리하지 못했다. 그래서 상속을 한번 정리해보기로 했다.


상속

자바에는 부모클래스와 자식클래스가 있다. 자식 클래스는 부모 클래스의 멤버를 상속받아 그대로 사용할 수 있다.

상속을 하는 이유 ?

이미 만들어져 있는 클래스를 재사용 할 수 있어서 효율적이고 중복된 코드가 줄어든다.

유지보수가 쉽고, 확장성이 용이하고, 재사용이 가능하고, 코드가 간결해진다.


클래스 상속

자식 클래스 이름 앞에 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
    '코코코딩공부/JAVA' 카테고리의 다른 글
    • [Gradle] dependency 차이점 (CompileOnly, RuntimeOnly, api, implementation)
    • [JAVA] 캐싱
    • [JAVA] VO(Value Object) 란 무엇인가 ?
    • [JAVA] 제네릭 Generic
    Ocean_
    Ocean_
    dongVeloper

    티스토리툴바