hyeonga_code

Java_48_오버라이드 본문

Java

Java_48_오버라이드

hyeonga 2023. 10. 12. 05:59
반응형


- 오버라이드
    @Override
    - 상위 클래스의 메소드의 이름과 동일한 메소드를 재정의 한 것입니다.
    - 접근 제한자 법칙
        private < default < protected < public
    - 조건
        - 하위 클래스의 메소드는  하위 클래스의 메소드보다 반드시 크커나 같아야 합니다.
        - 상위 클래스와 같아야 하는 것
            - 메소드 이름
            - 메소드의 선언부
            - 반환 타입
        - 접근 제한자는 상위 클래스의 메소드와 같거나 보다 더 넓은 범위로 지정해야 합니다.
        - 예외 범위는 상위 클래스의 메소드보다 작아야 합니다.
    - 예외 전가 법칙
        - 상위 클래스에 없는 예외 전가를 하위 클래스가 생성할 수 없습니다.
=====

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
class A07{
    int a;
    int b;
    public A07() {
        a = 10;
        b = 20;
    }
    public void disp() {
        // 하위 클래스와 이름이 같은 메소드
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}
class B07 extends A07{
    int c;
    public B07() {
        c = 30;    
    }
    public void disp() {
        // 상위 클래스와 이름이 같은 메소드
        //protected void disp() {
        // 오류: Cannot reduce the visibility of the inherited method from A07.
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("c = " + c);
    }
}
public class same {
    public static void main(String[] args) {
        B07 ap = new B07();
        ap.disp();
    }
}
/*
*  a = 10
*  b = 20
*  c = 30
*/




'VIPCustomer.java'
    '''
        // 가격 계산에 기능을 추가해야 합니다.
        @Override      // - 상위 클래스와 같은 이름의 메소드를 재정의하여 우선권을 가지게 되는 역할입니다.
        public int calcPrice(int price) {
            // 상위 클래스에서 메소드를 가져와 사용할 수 있으나 내부의 코드는 사용할 수 없습니다.
            
            this.point += price * this.ratio;
            
            return price - (int)( price * this.saleRatio );
                // saleRatio가 실수형이므로 정수형으로 형변환 해야합니다.
        }
    '''
=====

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
package oop.inheritance;
 
public class VIPCustomer extends Customer {
    // Customer 클래스를 상속받아 접근합니다.
    
    private double saleRatio;    // 적용할 할인률을 선언합니다.
    
    // 기본 생성자
    public VIPCustomer() {    
        this.grade = "VIP";    // 상위 클래스에서 SILVER 이었던 정보를 수정합니다.
        this.ratio = 0.15;    // 상위 클래스에서 0.1 이었던 정보를 수정합니다.
        this.saleRatio = 0.1;    // 하위 클래스에서 선언한 변수의 정보를 초기화합니다.
    }
    
    // 가격 계산에 기능을 추가해야 합니다.
    @Override    // - 상위 클래스와 같은 이름의 메소드를 재정의하여 우선권을 가지게 되는 역할입니다.
    public int calcPrice(int price) {
        // 상위 클래스에서 메소드를 가져와 사용할 수 있으나 내부의 코드는 사용할 수 없습니다.
        
        this.point += price * this.ratio;
        
        return price - (int)( price * this.saleRatio );
            // saleRatio가 실수형이므로 정수형으로 형변환 해야합니다.
    }
 
    // toString() 추가하기
    @Override
    public String toString() {
        return "VIPCustomer [saleRatio=" + saleRatio + ", id=" + id + ", name=" + name 
                + ", grade=" + grade + ", point=" + point + ", ratio=" + ratio + "]";
    }
    
}






'CustomerApp.java'
    '''
            // VIP 구매
            vip1.calcPrice(3000);
            System.out.println(vip1.toString());
    '''
=====

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
49
50
51
52
53
54
55
56
57
58
59
package oop.inheritance;
//모든 클래스는 패키지 안에 생성합니다.
 
public class CustomerApp {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    public static void main(String[] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
        
        // 생성자 호출
        Customer cust1 = new Customer();
        
        // 값 지정
        cust1.id = 1010;
        cust1.name = "cus1";
        
        // 출력.toString();
        System.out.println(cust1.toString());
            /*
                Customer [id=1010, name=cus1, grade=SILVER, point=0, ratio=0.0]
             */
        
        Customer cust2 = new Customer(1020,"cus2");
        System.out.println(cust2.toString());
            /*
                Customer [id=1020, name=cus2, grade=SILVER, point=0, ratio=0.0]
             */
        
        Customer cust3 = new Customer(1030,"cus3",500);
        System.out.println(cust3.toString());
            /*
                Customer [id=1030, name=cus3, grade=SILVER, point=500, ratio=0.0]
             */
        
        // 계산
        cust2.calcPrice(3000);    // 5000원짜리 상품을 구매했습니다.
        System.out.println(cust2.toString());
            /*
                Customer [id=1020, name=cus2, grade=SILVER, point=300, ratio=0.1]
             */
        
        // VIP
        VIPCustomer vip1 = new VIPCustomer();
        vip1.id = 2010;
        vip1.name = "vip_1";
        System.out.println(vip1.toString());
            /*
                 Customer [id=2010, name=vip_1, grade=SILVER, point=0, ratio=0.1]
             */
        
        // VIP 구매
        vip1.calcPrice(3000);
        System.out.println(vip1.toString());
            /*
              VIPCustomer [saleRatio=0.1, id=2010, name=vip_1, grade=VIP, point=450, ratio=0.15]
                    - Customer보다 포인트가 더 많이 적립됩니다.
             */
    }
}
반응형

'Java' 카테고리의 다른 글

Java_50_인터페이스  (0) 2023.10.13
Java_49_super  (0) 2023.10.12
Java_47_상속  (0) 2023.10.11
Java_46_toString  (0) 2023.10.09
Java_45_클래스_중첩 클래스  (0) 2023.10.08