[JAVA] 상속 클래스 다형성 적용

김상현·2022년 12월 21일
0

JAVA

목록 보기
2/3
post-thumbnail

📒 [실전! 스프링 부트와 JPA 활용 - 김영한] 프로젝트를 완성한 후 부족한 기능을 개선한 후 정리하는 글입니다.


📍 문제 발견

  • Item 은 부모 클래스로 Album, Book, Movie 클래스를 자식 클래스로 갖는다.
  • Item Entity를 수정하기 위해서는 JPA를 활용하여 해당 Entity를 영속성 상태로 정의한 후 Entity의 속성 값을 변경해주면 더티 체킹(dirty checking)을 통해 변경된 값을 수정할 수 있다.
  • 문제는 Item Entity의 자식 클래스(Album, Book, Movie)의 속성을 변경할 때 다운 캐스팅(down casting)을 적용해야 하는데 적용하는 방식에서 불필요해 보이는 반복적인 코드가 눈에 밟혔다.

🧷 수정하기 전 updateService

if(item instanceof Album){
    Album album = (Album) item;
    album.updateAlbum(form.getName(), form.getPrice(), form.getStockQuantity(), form.getArtist(), form.getEtc());
} else if (item instanceof Book) {
    Book book = (Book) item;
    book.updateBook(form.getName(), form.getPrice(), form.getStockQuantity(), form.getAuthor(), form.getIsbn());
} else if (item instanceof Movie) {
    Movie movie = (Movie) item;
    movie.updateMovie(form.getName(), form.getPrice(), form.getStockQuantity(), form.getDirector(), form.getActor());
}
  • 현재 Item Entity의 클래스 타입을 확인하기 위해 모든 경우에 instanceof 를 이용한 조건문을 만들고 해당 클래스로 다운 캐스팅을 적용하였다.
  • 다운 캐스팅을 매번 적용하는 것이 개방 폐쇄 원칙에 위반되고, 비슷한 유형의 반복적인 코드로 작성된 것이 개발자로서 그냥 지나칠 수 없었다.

📍 기능 개선

📒 참고한 사이트 : instanceof의 사용을 지양하자

  • 문제를 해결한 방법은 다형성(Polymorphism) 사용이었다.

🧷 부모 클래스(Item)의 추상화 함수

/** 하위 객체 업데이트 **/
public abstract void updateItem(ItemForm form);

public void updateBaseItem(String name, int price, int stockQuantity){
    this.name = name;
    this.price = price;
    this.stockQuantity = stockQuantity;
}

🧷 자식 클래스(Album)의 함수 구현

@Override
    public void updateItem(ItemForm form) {
        super.updateBaseItem(form.getName(), form.getPrice(), form.getStockQuantity());
        this.artist = form.getArtist();
        this.etc = form.getEtc();
    }
  • Item 클래스에 추상화 함수(updateItem)를 생성하고 자식 클래스(Album, Book, Movie)에서 @Override를 통해 업데이트 함수를 구현하면 instanceof 와 다운 캐스팅을 사용하지 않고 정보 업데이트를 적용할 수 있다.
  • 객체지향적 프로그래밍을 개념적으로는 알고 있었지만 다형성을 실제 코드에 적용해보니 이해도가 한층 높아진 것 같다.
profile
목적 있는 글쓰기

0개의 댓글