[Chap 8] 8.1 상속이란? ~ 8.3 오버라이딩
extends 예약어
extends
예약어는 상위 클래스가 하위 클래스로 기능이 확장된다는 의미이다. 상속받은 하위 클래스는 상위 클래스에 있는 매서드들은 모두 사용할 수 있다. 다만 상위 클래스에서 private 형이라면 하위 클래스라도 사용이 불가능하다. extends 예약어 예시는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package inheritance; public class VIPCustomer extends Customer{ private int agentID; double saleRatio; public VIPCustomer () { customerGrade = "VIP"; bonusRatio = 0.05; saleRatio = 0.1; } public int getAgentID() { return agentID; } } | cs |
protected 예약어
protected
예약어는 외부 클래스에서는 사용할 수 없지만 하위 클래스는 사용할 수 있도록 지정하는 예약어입니다. 상위 클래스의 private 변수를 protected 변수로 바꾸어 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package inheritance; public class Customer { protected int customerID; protected String customerName; protected String customerGrade; int bonusPoint; double bonusRatio; public Customer() { customerGrade = "SILVER"; bonusRatio = 0.01; } 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 int calcPrice(int price) { bonusPoint += price * bonusRatio; return price; } public String getCustomerInfo() { return customerName + "님의 등급은 " + customerGrade + "이며, 보너스 포인트는" + bonusPoint + "입니다."; } } | cs |
상위 클래스, 하위 클래스 이용 예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package inheritance; public class CustomerTest { public static void main(String[] args) { //상위 클래스 Customer.java 이용 Customer customerLee = new Customer(); customerLee.setCustomerID(10010); customerLee.setCustomerName("이순신"); customerLee.bonusPoint = 1000; System.out.println(customerLee.showCustomerInfo()); //하위 클래스 VIPCustomer.java 이용 VIPCustomer customerKim = new VIPCustomer(); customerKim.setCustomerID(10020); customerKim.setCustomerName("김유신"); customerKim.bonusPoint = 10000; System.out.println(customerKim.showCustomerInfo()); } } | cs |
하위 클래스에서도 상위 클래스의 변수를 쓸 수 있는 이유
그 이유는 항상 상위 클래스가 먼저 호출되기 때문이다. 호출이 되면서 멤버 변수들의 메모리가 생성되기 때문에 하위 클래스는 이 값들을 사용할 수 있는 것이다.
super 예약어
super
을 호출하면 상위 클래스의 디폴트 생성자 또는 매서드가 호출됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package inheritance; public class Customer { protected int customerID; protected String customerName; protected String customerGrade; int bonusPoint; double bonusRatio; /* public Customer() { customerGrade = "SILVER"; bonusRatio = 0.01; } */ //매개변수가 있는 생성자 public Customer(int customerID, String customerName) { this.customerID = customerID; this.customerName = customerName; customerGrade = "SILVER"; bonusRatio = 0.01; System.out.println("Customer(int, String) 생성자 호출"); } 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 int calcPrice(int price) { bonusPoint += price * bonusRatio; return price; } public String showCustomerInfo() { return customerName + "님의 등급은 " + customerGrade + "이며, 보너스 포인트는" + bonusPoint + "입니다."; } } | cs |
만약에 상위 클래스에서 디폴트 생성자가 아닌 매개변수가 있는 생성자를 만들었다면 하위 클래스에서는 반드시 명시적으로 생성자를 호출해야된다. 호출하는 방법은 super(상위 클래스의 매개변수) 로 불러올 수 있다. 코드 예시를 보면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package inheritance; public class VIPCustomer extends Customer{ private int agentID; double saleRatio; / public VIPCustomer () { customerGrade = "VIP"; bonusRatio = 0.05; saleRatio = 0.1; } */ //customer에서 새로운 생성자를 만들었으므로 하위 클래스에 반드시 명시적으로 다른 생성자를 호출해야된다. public VIPCustomer(int customerID, String customerName, int agentID) { super(customerID, customerName); //상위 클래스 생성자 호출 customerGrade = "VIP"; bonusRatio = 0.05; saleRatio = 0.1; this.agentID = agentID; System.out.println("VIPCustomer(int String) 생성자 호출"); } public int getAgentID() { return agentID; } public String showVIPInfo() { return super.showCustomerInfo() + "담당 상담원 아이디는" + agentID + "입니다."; //this 에약어와 비슷하게 상위 클래스의 매서드도 super 에약어를 통해서 불러올 수 있다. } } | cs |
또한 super 에약어를 통해서 매서드를 불러오는 방법은 this 예약어와 비슷하게 super.상위 클래스 매서드 이름 을 통해서 불러올 수 있다.
메서드 오버라이딩
오버라이딩을 하기 위해서는 반환형, 매서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야 한다.
1 2 3 4 5 6 7 | //하위 클래스.java @Override //-> 애노테이션: 컴파일러에게 오버라이딩이라는 것을 명확하게 알려주는 기능 //오버라이딩 하려면 반환형, 매서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야 한다. public int calcPrice(int price) { bonusPoint += price * bonusRatio; return price - (int)(price * saleRatio); } | cs |
댓글남기기