📍 발생한 문제

- 위의 ERD(
Entity Relationship Diagram
) 같이 Item
엔티티를 상속하는 Album
, Book
, Movie
엔티티가 있다.
Item
엔티티의 멤버변수 name
, price
, stockQuantity
는 접근 제어자가 private
으로 설정되어 있다.
- 하위 객체에서 상위 객체(
Item
)의 멤버 변수의 값을 변경하는 방법은 상위 객체 내부에서 멤버 변수의 값을 변경하는 메서드를 생성한 후 갱신하는 것 뿐이었다.
Item
멤버변수를 변경하는 경우는 2가지 경우가 존재했다.
Item
객체를 생성한 후 멤버변수의 값을 초기화하는 경우
- 기존의
Item
객체의 멤버변수 값을 업데이트하는 경우
- 객체의 생성과 업데이트를 위해
Item
엔티티 내부에 멤버변수를 초기화하는 메서드(setItem()
)와 멤버변수를 업데이트하는 메서드(updateItem()
)를 작성하였다.
public void setItem(String name, int price, int stockQuantity){
this.name = name;
this.price = price;
this.stockQuantity = stockQuantity;
}
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;
album.price = price;
album.stockQuantity = stockQuantity;
album.artist = artist;
album.etc = etc;
return album;
}
}
Album
객체에서 상위 객체인 Item
의 멤버변수에 직접 접근이 가능해졌으므로 굳이 setItem()
메서드를 사용하지 않아도 되고, 코드 중복의 문제를 해결할 수 있었다.
📍 고찰
protected
접근 제어자가 상속에서 발생한 문제를 해결하기 위해 존재하는 접근 제어자인 것 같다.
- 하지만, 현재 문제에서의 최고의 해결 방법인지는 잘 모르겠다.
- 계속 코드를 수정하면서 어떤 방법이 최적의 방법인지를 찾아봐야할 것 같다.