최대 1 분 소요

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

태그:

카테고리:

업데이트:

댓글남기기