[JAVA] 접근 제한자 protected의 사용을 통한 코드 중복 해결

김상현·2022년 11월 1일
0

JAVA

목록 보기
1/3
post-thumbnail

📍 발생한 문제

  • 위의 ERD(Entity Relationship Diagram) 같이 Item 엔티티를 상속하는 Album, Book, Movie 엔티티가 있다.
  • Item 엔티티의 멤버변수 name, price, stockQuantity는 접근 제어자가 private 으로 설정되어 있다.
  • 하위 객체에서 상위 객체(Item)의 멤버 변수의 값을 변경하는 방법은 상위 객체 내부에서 멤버 변수의 값을 변경하는 메서드를 생성한 후 갱신하는 것 뿐이었다.
  • Item 멤버변수를 변경하는 경우는 2가지 경우가 존재했다.
    • Item 객체를 생성한 후 멤버변수의 값을 초기화하는 경우
    • 기존의 Item 객체의 멤버변수 값을 업데이트하는 경우
  • 객체의 생성과 업데이트를 위해 Item 엔티티 내부에 멤버변수를 초기화하는 메서드(setItem())와 멤버변수를 업데이트하는 메서드(updateItem())를 작성하였다.
	/** Item 객체 초기화 **/
    public void setItem(String name, int price, int stockQuantity){
        this.name = name;
        this.price = price;
        this.stockQuantity = stockQuantity;
    }

    /** Item 객체 업데이트 **/
    public void updateItem(String name, int price, int stockQuantity){
        this.name = name;
        this.price = price;
        this.stockQuantity = stockQuantity;
    }
  • 📌 객체 초기화 메서드(setItem())와 객체 업데이트 메서드(updateItem())는 이름은 다르지만 하는 역할은 완전히 동일해지는 코드 중복이 발생했다.

📍 해결 방법

  • JAVA의 상속과 관련된 정보들을 계속 구글링 하다가 접근 제어자 protected 를 발견하게 되었다.
  • protected 접근 제어자는 자신의 패키지 내에서만 멤버에 액세스할 수 있고 또한 다른 패키지에 있는 해당 클래스의 하위 클래스에서만 액세스할 수 있음을 지정 한다.
    → 📒 Oracle JAVA Documentation
  • Item의 멤버변수들의 접근 제어자를 모두 protected로 변경하면 하위 객체인 Album, Book, Movie 에서 상위 객체인 Item의 멤버변수에 직접 접근할 수 있다.

📌 Item 객체

public abstract class Item {
    protected String name;
    protected int price;
    protected int stockQuantity;
}

📌 Item 객체를 상속받는 Album 객체

public class Album extends Item{
    private String artist;
    private String etc;

    public static Album createAlbum(String name, int price, int stockQuantity, String artist, String etc){
        Album album = new Album();
        album.name = name; // Item 객체의 멤버변수 name에 직접 접근
        album.price = price; // Item 객체의 멤버변수 price 직접 접근
        album.stockQuantity = stockQuantity; // Item 객체의 멤버변수 stockQuantity 직접 접근
        album.artist = artist;
        album.etc = etc;
        return album;
    }
}
  • Album 객체에서 상위 객체인 Item 의 멤버변수에 직접 접근이 가능해졌으므로 굳이 setItem() 메서드를 사용하지 않아도 되고, 코드 중복의 문제를 해결할 수 있었다.

📍 고찰

  • protected 접근 제어자가 상속에서 발생한 문제를 해결하기 위해 존재하는 접근 제어자인 것 같다.
  • 하지만, 현재 문제에서의 최고의 해결 방법인지는 잘 모르겠다.
  • 계속 코드를 수정하면서 어떤 방법이 최적의 방법인지를 찾아봐야할 것 같다.
profile
목적 있는 글쓰기

0개의 댓글