-
클래스 상속
- 새로운 클래스를 정의할 때 이미 구현된 클래스를 상속받아서 속성이나 기능을 확장하여 클래스를 구현함
- 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할 때 기존 클래스를 상속함
상속을 구현하는 경우
- 상위 클래스는 하위 클래스 보다 더 일반적인 개녕과 기능을 가짐
- 하위 클래스는 상위 클래스 보다 더 구체적인 개녕과 기능을 가짐
- 하위 클래스가 상위 클래스의 속성과 기능을 (extends) 한다는 의미
용어정리
- 상속하는 클래스 : 상위 클래스, parent class, super class
- 상속받는 클래스 : 하위 클래스, child class, subclass
상속 활용 예제
일반 고객 클래스 구현
- 고객의 속성 : 고객 아이디, 고객 이름, 고객 등급 보너스 포인트, 포인트 적립비율
- 일반 고객의 경우 물품 구매시 1%의 보너스 포인트 적립
public class Customer { private int customerId; private String customerName; private 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 + "입니다."; } }
골드 고객 클래스 구현
- 매출에 더 많은 기여를 하는 단골 고객
- 보너스 포인트는 제품 가격의 5%를 적립해 줌
- 담당 전문 상담원이 배정됨
- Customer에 구현된 내용과 중복되는 부분은 Customer를 상속하여 구현
public class GoldCustomer extends Customer { private int agentID; double salesRatio; public GoldCustomer() { customerGrade = "GOLD"; bonusRatio = 0.05; salesRatio = 0.1; } public int getAgentId() { return agentID; } }
접근 제어 지시자
- 상위 클래스에 선언된 private 멤버 변수는 하위 클래스에서 접근할 수 없음
- 외부 클래스는 접근 할 수 없지만, 하위 클래스는 접근할 수 있도록 protected 접근 제어 지시자 사용
protected int customerId; protected String customerName; protected String customerGrade;
get()/set() 구현
- 접근 제어 지시자로 인해 접근할 수 없는 멤버변수에 접근하기위해 getter setter를 이용해 접근
public int getCustomerId() { return customerId; } public void setCustomerId(int customerId) { this.customerId = customerId; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public String getCustomerGrade() { return customerGrade; } public void setCustomerGrade(String customerGrade) { this.customerGrade = customerGrade; }
클래스 사용
- GoldCustomer 클래스로 생성한 인스턴스도 Customer 클래스에 생성된 매개변수나 메서드를 사용할 수 있다.
public class MainTest { public static void main(String[] args) { Customer customer_Lee = new Customer(); customer_Lee.setCustomerName("이성계"); customer_Lee.setCustomerId(10010); customer_Lee.bonusPoint = 1000; System.out.println(customer_Lee.showCustomerInfo()); GoldCustomer customer_jung = new GoldCustomer(); customer_jung.setCustomerName("정몽주"); customer_jung.setCustomerId(10020); customer_jung.bonusPoint = 10000; System.out.println(customer_jung.showCustomerInfo()); } }
상속에서 클래스 생성 과정과 형변환
하위클래스 생성 과정
- 하위 클래스를 생성하면 상위 클래스가 먼저 생성
- new GoldCustomer()클래스를 호출하면 그 부모 클래스인 Customer() 생성자가 먼저 호출
- 클래스가 상속 받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스 생성자를 호출
public Customer() { customerGrade = "SILVER"; bonusRatio = 0.01; System.out.println("Customer클래스 생성자 호출"); } public GoldCustomer() { customerGrade = "GOLD"; bonusRatio = 0.05; salesRatio = 0.1; System.out.println("GOLD Customer클래스 생성자 호출"); }
- new GoldCustomer()클래스를 호출 시
- Customer 클래스 생성자가 먼저 호출되는 것을 확인할 수 있음
Customer클래스 생성자 호출
GOLD Customer클래스 생성자 호출
Super 키워드
- 하위 클래스에서 가지는 상위 클래스에 대한 참조 값
- super()는 상위 클래스의 기본 생성자를 호출 함
- 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 super()가 호출됨 (이때 반드시 상위 클래스의 기본 생성자가 존재 해야함)
- 상위 클래스의 기본생성자가 없는 경우 (다른 생성자가 있는 경우) 하위 클래스에서는 생성자에서 super를 이용하여 명시적으로 상위클래스의 생성자를 호출 함
- super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메서드나 멤버변수에 접근할 수 있음
//부모 클래스의 생성자에 디폴트 생성자를 없애고 매개변수가 있는 생성자 추가 public Customer(int customerID, String customerName) { this.customerId = customerID; this.customerName = customerName; customerGrade = "SILVER"; bonusRatio = 0.01; System.out.println("Customer클래스 생성자 호출"); } //자식 클래스의 생성자도 부모클래스의 생성자와 같은 형태를 유지해야함 //super 키워드를 이용하여 명시적으로 호출 public GoldCustomer(int customerID, String CustomerName) { super(customerID,CustomerName); customerGrade = "GOLD"; bonusRatio = 0.05; salesRatio = 0.1; System.out.println("GOLD Customer클래스 생성자 호출"); }
형 변환 (업 캐스팅)
- 상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성
Customer Customer_1 = new GoldCustomer(10030,"고객1");
- 상위 클래스 타입의 변수에 하위 클래스 변수 대입
- 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형 변환이 가능함
- 상속 관계에서 모든 하위 클래스는 상위 클래스로 형변환(업 캐스팅) 됨 (역은 성립하지 않음)
형 변환과 메모리
Customer Customer_1 = new GoldCustomer(10030,"고객1");
- GoldCustomer() 생성자에 의해 GoldCustomer 클래스의 모든 멤버 변수에 대한 메모리는 생성되었지만, 변수의 타입이 Cusomer 이므로 실제 겁근 가능한 변수나 메서드는 Customer의 변수와 메서드이다.
메서드 재정의하기(overring)
- 오버라이딩(overriding): 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있다.
- GoldCustomer클래스는 Customer클래스와 할인율이 다르기때문에 메서드를 재정의 해야함
@Override public int calcPrice(int price) { bonusPoint +=price *bonusRatio; return price - (int)(price * salesRatio); }
@overriding 어노테이션(annotation)
- 애노테이션은 원래 주석이라는 의미
- 컴파일러에게 특별한 정보를 제공해주는 역활
- @overriding 애노테이션은 재정의 된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가남
형 변환과 오버라이딩 메서드 호출
Customer Customer_1 = new GoldCustomer(10030,"고객1");
Customer_1변수의 타입은 Customer지만 인스턴스의 타입은 GoldCustomer임 자바에서는 항상 인스턴스의 메서드가 호출됨
'Java' 카테고리의 다른 글
[Java] 추상 클래스 (0) 2023.09.04 [Java] 다형성 (0) 2023.08.30 [Java] Class 만들기 (0) 2023.08.21 [Java] C R U D (0) 2023.08.21 [Java] 배열 (0) 2023.08.21