관리 메뉴

CASSIE'S BLOG

[슈퍼코딩] 34-2강 객체 상속 실무 (부제: 백화점 관리 시스템) 본문

PROGRAMMING/슈퍼코딩 강의 정리

[슈퍼코딩] 34-2강 객체 상속 실무 (부제: 백화점 관리 시스템)

ITSCASSIE1107 2023. 12. 14. 13:50
반응형

핵심은 다형성을 사용해서 따로 로직을 만드는게 아니라 각자의 똑같은 메소드로 이 결제요청과 진행을 하는 것이였음.

 

 

 

Customer를 부모 클래스, VIP Customer를 자식클래스로 만들 예정 
VIP Customer가 좀 더 확장된 걸 가져가니까 

 

Array는 같은 타입밖에 안되기 때문에 줄서는 것도 배열로 만들려고 하면은 일단 상속을 하게 만들어야 그 다음 작업을 할 수 있다. 

 

 

중복된거를 일단 없애면서 해야하는데 상속관계를 만들 때
customerID 같은 경우에는 왼쪽에 private으로 만들었는데
자식객체가 그거를 이어서 사용하게 하려면
private은 자기 혼자만 사용하는거라서 
protected 키워드로 좀 열어놓고 자식도 사용할 수 있게 만들어줘야한다.

 

 

부모 클래스 이어 받을 수 있는 속성 customerID, name, customerGrade는 삭제해준다. 자식 클래스인 VIPCustomer에서 
부모 자식 동일한 부분에서 공통된 부분 자식클래스에서 없애고 부모에서 proitected로 열어준다

자식클래스의 agentID, discountRatio 의 경우에는 부모클래스에 없다. 그대로 나둬야한다. 

확장된 변수로 보면 될 것 같습니다. 

 

그리고 부모 자식 똑같은 메소드 이름이 있으면 자식 클래스의 그 동일 메소드는 Override 해준다.


 

 

자식 클래스에만 있는 메소드는 그냥 아무것도 안하고 자식 클래스에 그냥놔두면 된다. 

 

빨간줄이 뜨는데 자식 클래스는 생성자를 만들 때 
무조건 부모클래스의 생성자를 실행하고 실행합니다.

 

 

 

이걸 이렇게  바꿈 그러면 VIP만 붙고 출력된다고함. 

 

 

 

아예 몰랐던 부분

 

 

이게 좀 어려운 부분이라함.. 
나는 뭐가 문제가 있는지 못 찾겠어. 

많이 실수했을 것 갍은 건데 
VIP Customer에서 
static int serialNums = 1; 
이거 부모클래스랑 중복되니까 지웠을거라는데
static은 아예 클래스 "설계도"에 속한 친구다. 
설계도인 친구다. 
Customer라는거를 extends할 때는 
설계도의 필드는 공통된게 아니다. 
설계도는 그냥 2개가 있는거다. 
실제 인스턴스가 이거를 부모의 속성과 행위를 이어받는거지. 
그리고 정확히 말하면은 속성과 행위는 
"인스턴스의" 변수다. 

 

클래스 변수라고함. 

 

 

부모

package exercise.chapter_34;

public class Customer {
    // 속성
    static int serialNums = 1;

    protected String customerID;
    protected String name;
    protected String customerGrade;

    protected int bonusPoint;
    protected double bonusPointRatio;

    // 행위
    public int calculatePrice(int price){
        this.bonusPoint += price * bonusPointRatio;
        return price;
    }

    Customer(){}
    public Customer(String name){
        this.customerID = "Customer" + serialNums++;
        this.name = name;
        this.customerGrade = "SILVER";
        this.bonusPointRatio = 0.01;
        this.bonusPoint = 0;
    }

    public void printMyInfo(){
        System.out.printf("Customer(customerId=%s, name=%s, customerGrade=%s, bonusPoint=%d)\n",
                          this.customerID, this.name, this.customerGrade, this.bonusPoint);
    }

}

 

자식

package exercise.chapter_34;

public class VIPCustomer extends Customer {
    static int serialNums = 1;
    // 속성
    private String agentID;
    private double discountRatio;

    // 행위
    @Override
    public int calculatePrice(int price){
        this.bonusPoint += price * bonusPointRatio;
        price -= price * discountRatio;
        return price;
    }

    public void callAgent(){
        System.out.println("담당직원 " + this.agentID + "님 문의드릴게 있어요~");
    }

    public VIPCustomer(String name){
        super();
        this.customerID = "VIP" + serialNums++;
        this.name = name;
        this.customerGrade = "VIP";
        this.bonusPoint = 0;
        this.bonusPointRatio = 0.05;
        this.discountRatio = 0.1; //이게 추가됨 필드가
    }

    public void setAgentID(String agentID) {
        this.agentID = agentID;
    }

    @Override
    public void printMyInfo(){
        System.out.print("VIP");
        super.printMyInfo();
    }

}

 

항상 기억해야한다.

 

static 이거는 이어받지 않는다.

 

설계도는 각각 가지고 있어야한다. 

 

생성자에서. 

자식 요소에서 부모의 serialNums의 뭘하고 싶다 그러면
super.serialNums 이런 식으로 부르면 된다고함. 
그런 일이 잘 없데 근데 

 

public VIPCustomer(String name){
    super();
    this.customerID = "VIP" + super.serialNums++;
    this.name = name;
    this.customerGrade = "VIP";
    this.bonusPoint = 0;
    this.bonusPointRatio = 0.05;
    this.discountRatio = 0.1; //이게 추가됨 필드가
}

 

그 다음에 super.serialNums의 ctrl 누르고 커서 따라가면 부모의 serialNums에 접근됨. 

그냥 serialNums는 여기서 내꺼라는 거 (VIPCustomer 것)

 

반응형