-
[Java ] 클래스 상속 및 상속을 사용하는 이유프로그래밍/Java 2022. 3. 20. 10:37반응형
상속
- 상속이란? 미리 정의된 내용을 하위 클래스에서 받아서 재정의 및 재사용하는 행위를 일컸는다.
- JAVA에서 상속 클래스 하나당 한번씩만 상속이 가능하다. 여러번 상속받는 개념은 인터페이스에서 가능하다.
- 상속에서 구현할 내용은 상위 클래스 속성을 private 을 사용하지 않고 같은 패키지나 하위 클래스에서 사용가능한protected를 사용한다.
- 상위 클래스의 내용을 재정의 할 때는 super()로 정의 한 다음 작성하지 않는 경우 JVM에서 임의로 컴파일 한다.
- 상속받는 하위 클래스에서 생성자는 기본적으로 묵시적 생성이 되지만, 변화가 있을 경우 명시적으로 표현해 주어야한다.
고객관리 프로그램 예제
상품을 파는 쇼핑몰에서 Customer라는 객체가 있고 이는 일반 고객이다. Customer라는객체를 상속받아 더 높은 등급의 고객인 VIPCustomer, GoldCustomer라는 객체를 생성하고 할인율과 포인트 제공율을 다른게 설정해 보세요.
//Customer.java public class Customer { //하위 패키지나 클래스에서 사용가능하도록 속성은 Protected를 사용한다. protected int customerID; protected String customerName; protected String customerGrade; int bonusPoint; double bonusRatio; public Customer() { customerGrade = "SILVER"; bonusRatio = 0.01; } public int calcPrice(int price) { bonusPoint += price * bonusRatio; return price; } public String showCustomerInfo() { return customerName + "님의 등급은 " + customerGrade + "이며, 보너스 포인트는" + bonusPoint + "입니다."; } getter, setter~~~ }
클래스 다이어그램에서 그린 그림 처럼 Customer에 공통적으로 사용할 내용을 정의 하고 상속받는 객체들에서 임의로 정의해서 사용할 내용은 각자 작성한다.
public class VIPCustomer extends Customer { //위에 상속받은 내용이 있기 때문에 //*customerID, customerName, customerGrade*/이라는 내용은 작성하지 않는다. //추가하고 싶은 부분만 작성한다. double salesRatio; private String agentID; public VIPCustomer() { customerGrade = "VIP"; //등급 VIP로 설정 bonusRatio = 0.05; //적립금 5퍼 적용 salesRatio = 0.1; //상품 구매시 10퍼 할일율 적용 } getter, setter~~~ }
public class GoldCustomer extends Customer{ double salesRatio; private String agentID; public GoldCustomer() { customerGrade = "GOLD"; bonusRatio = 0.1; salesRatio = 0.2; } }
필드들 정의하기
- customer를 구체화하기 위해서 상속을 받아서 사용하기 때문에 위 클래스에서만 사용가능 하도록 protected를 사용하여 처리 한다.
- 상속받은 내용이 있기 때문에 'customerID, customerName, customerGrade'이라는 내용은 작성하지 않는다.
- 추가하고 싶은 부분만 작성한다
//Customer 필드들 protected int customerID; protected String customerName; protected String customerGrade; int bonusPoint; double bonusRatio; //VIPCustomer 필드들 double salesRatio; private String agentID;
생성자 정의하기
- 생성자에서 필요한 내용만 재정의 하여 사용한다.
- 등급과 할인율 적립금이 등급별로 다르기 때문에 재정의 한 모습이다.
public Customer() { customerGrade = "SILVER"; bonusRatio = 0.01; } public VIPCustomer() { customerGrade = "VIP"; //등급 VIP로 설정 bonusRatio = 0.05; //적립금 5퍼 적용 salesRatio = 0.1; //상품 구매시 10퍼 할일율 적용 }
생성자가 동일하지 않는 경우 Super()사용하기
- 생성자를 동일하게 맞춰주지 않고 다르게 만들었을 경우 오류가 나게 되는데 이런 경우 명시적으로 재정의 하여 형식을 맞춰 주어야한다.
//형식을 갖춘 생성자로 정의 한 경우 public Customer(int customerID, String customerName) { this.customerID = customerID; this.customerName = customerName; customerGrade = "SILVER"; bonusRatio = 0.01; } --------------------------------------------------------------------------------------- //아래와 같이 작성하면 상속관계에 맞지 않아 오류가 발생한다. 형식을 맞춰주어야한다. public VIPCustomer() { customerGrade = "VIP"; //등급 VIP로 설정 bonusRatio = 0.05; //적립금 5퍼 적용 salesRatio = 0.1; //상품 구매시 10퍼 할일율 적용 } //변수가 있는 생성자를 활용하기 위해서는 super()라는 상위 생성자 함수를 호출 해주어사용한다. public VIPCustomer(int customerID, String customerName) { super(customerID, customerName); <<<<<----- 이부분을 꼭 작성하여 형식을 맞춰주어야 사용 가능하다. customerGrade = "VIP"; bonusRatio = 0.05; salesRatio = 0.1; }
상속 관계 객체 생성 주기
- Customer를 상속받아 사용하는 VIPCustomer는 생성주기가 Cutomer를 생성한 후 VIPCustomer를 생성해주는 순서로 작동한다.
- 2번 3번 상속을 받아 사용하는 경우도 Customer-GoldCustomer-VIPCustomer 이렇게 되어도 마찬가지로 상속받은 순서대로 생성이 순차 적용된다.
public Customer() { System.out.println("Customer() Call"); } public VIPCustomer() { System.out.println("VIPCustomer() Call"); } //위와 같이 표현 해주었다면. 호출 되는 순서가 생성주기이다. ------------------------------------------------------------ //main.java에서 print실행 한 결과 VIPCustomer customerKim = new VIPCustomer(); customerKim.setCustomerName("김유신"); //출력 //Customer() Call //VIPCustomer() Call
반응형'프로그래밍 > Java' 카테고리의 다른 글
[JAVA abstract]추상화 클래스 , 메서드 알아보기 (0) 2022.03.20 [Java Overriding] 오버라이딩과 다형성 (0) 2022.03.20 [Java 객체지향 입문 ] 객체간의 협력 (0) 2022.03.17 [Java] 객체지향언어 입문 (0) 2022.03.16 eclipse font 변경하기 (0) 2022.03.16