hyeonga_code

Java_51_인터페이스_다형성_다형성 멤버 필드 법칙, 업 캐스팅, 다운 캐스팅, 다형성 멤버 메소드 법칙 본문

Java

Java_51_인터페이스_다형성_다형성 멤버 필드 법칙, 업 캐스팅, 다운 캐스팅, 다형성 멤버 메소드 법칙

hyeonga 2023. 10. 13. 06:59
반응형


- 다형성
    - 객체의 연산자
         - Java에서 객체의 연산은 대입연산자 뿐
         - 대입 연산자
               - 같은 클래스
               - 상속 관계(클래스)
    - 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
    - 기본 사용 형식
        A ap = new A();
        A bp = new B();
    - 다형성에서의 형식
        - 상위 클래스 = 하위 클래스
            A ap = new B();
        - 하위 클래스는 상위 클래스로 객체를 생성할 수 없습니다.
            B bp = new A();
            runtime error : 논리는 맞으나 상황에 맞지 않아 오류가 발생합니다.
    - 다형성으로 받아들였을 때 달라지는 것
        class A{ 
            x=5;
            a();
            b();
        }

        class B{
            x=10;
            a();
            c();
        }

        - 멤버 호출 시 상위 클래스의 x를 호출합니다.
        - 메소드 호출 시 하위 클래스의 a()를 호출합니다.
            A ap = new B()
                - B 클래스의 오버라이딩 된 a()를 호출합니다.
                - A 클래스의 b()를 사용할 수 있습니다.
                - B 클래스의 c()를 사용할 수 없습니다.
                - ap의 자료형은 A 입니다.
=====

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 Point2d {
    int x;
    int y;
    public Point2d(){
        x = 100;
        y = 125;
    }
    public void disp() {
        System.out.printf("Location : [ %d , %d ]\n", x, y);
    }
}
 
class Point3d extends Point2d {
    // Point2d를 상속받은 Point3d
    int z;
    public Point3d() {
        z = 150;
    }
    public void disp() {
        System.out.printf("Location : [ %d, %d, %d ] \n", x, y, z);
    }
}
 
public class same {
    public static void main(String[] args) {
        Point2d ap = new Point2d();
        Point2d bp = ap;
        // 같은 클래스 이므로 대입연산이 가능
        // bp 는 ap의 주소값을 받은 것 = C_포인터
        ap.disp();    // Location : [ 100 , 125 ]
        bp.disp();    // Location : [ 100 , 125 ]
        ap.x = 1000;
        // ap의 x값 갱신
        ap.disp();    // Location : [ 1000 , 125 ]
        bp.disp();    // Location : [ 1000 , 125 ]
        // bp는 ap와 같은 클래스이므로 같이 변경된다.
    }
}




       - 다형성 멤버 필드 법칙
          - 업 캐스팅
                     - 자동 형 변환
                  - 하위 클래스의 생성자로 상위 클래스의 객체를 생성할 수 있음
                  - 상위 클래스는 하위 클래스의 변수에 접근할 수 없음
                  - 상위 클래스가 하위 클래스의 객체를 생성할 수 없음
=====

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
class Point2d {
    int x;
    int y;
 
    public Point2d() {
        x = 100;
        y = 125;
    }
 
    public void disp() {
        System.out.printf("Location : [ %d , %d ]\n", x, y);
    }
}
 
class Point3d extends Point2d {
    // Point2d를 상속받은 Point3d
    int z;
 
    public Point3d() {
        z = 150;
    }
 
    public void disp() {
        System.out.printf("Location : [ %d, %d, %d ] \n", x, y, z);
    }
}
 
public class same {
    public static void main(String[] args) {
        Point3d p3 = new Point3d();
        Point2d p2 = p3;
        // 하위 클래스의 생성자로 상위 클래스의 객체를 생성할 수 있음
        // 업 캐스팅 : 자동 형 변환
 
        p3.disp();    // Location : [ 100, 125, 150 ] 
        p2.disp();    // Location : [ 100, 125, 150 ] 
 
        System.out.println("p2.x = " + p2.x);    // 
        System.out.println("p2.y = " + p2.y);    // 
        // System.out.println("p2.z = " + p2.z);
        // p2는 상위 클래스이므로 p3에 접근할 수 없음
        System.out.println("p3.x = " + p3.x);    // 
        System.out.println("p3.y = " + p3.y);    // 
        System.out.println("p3.z = " + p3.z);    // 
    }
}




            - 다운 캐스팅
               - 업 캐스팅 된 상위클래스의 객체를 하위 클래스의 객체로 만들 수 있다.
=====

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
class Point2d {
    int x;
    int y;
    public Point2d() {
        x = 100;
        y = 125;
    }
    public void disp() {
        System.out.printf("Location : [ %d , %d ]\n", x, y);
    }
}
 
class Point3d extends Point2d {
    // Point2d를 상속받은 Point3d
    int z;
    public Point3d() {
        z = 150;
    }
    public void disp() {
        System.out.printf("Location : [ %d, %d, %d ] \n", x, y, z);
    }
}
public class same {
    public static void main(String[] args) {
        /*
        Point2d p2 = new Point2d();
        (1) 
        Point3d p3 = p2;
        // 오류 : Type mismatch: cannot convert from Point2d to Point3d.
               
        (2)
        Point3d p3 = (Point3d)p2;
        // 강제 형 변환  >> 오류 : Point2d cannot be cast to Point3d.
        // 변수 z값을 불러올 수 없으므로 오류가 나는 것
        */
 
        //(3)
        Point2d p2 = new Point3d();
        // 하위 클래스 객체를 상위 클래스로 생성
        Point3d p3 = (Point3d)p2;
 
        p3.disp();    // Location : [ 100, 125, 150 ] 
        p2.disp();     // Location : [ 100, 125, 150 ] 
    }
}




         - 다형성 멤버 메소드 법칙
            - 하위 클래스가 상위 클래스의 메소드를 오버라이드 시,
                업 캐스팅 상태의 상위 클래스의 객체에서 해당 메소드를 실행하는 경우
                하위 클래스의 메소드가 실행됨
=====

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
import java.util.Scanner;
 
class Animal{
    public void run() {
        System.out.println("run function");
    }
    public void move() {
        System.out.println("Move function");
    }
}
 
class Rabbit extends Animal{
    public void run() {
        System.out.println("Rabbit run");
    }
    public void move() {
        System.out.println("Rabbit Move");
    }
}
 
class Dog extends Animal{
    public void run() {
        System.out.println("Dog run");
    }
    public void move() {
        System.out.println("Dog Move");
    }
}
public class same {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        
        Animal ani;
        System.out.print("1.Rabbit 2.Dog : ");
        int select1 = in.nextInt();
        System.out.print("1.Run 2.Move : ");
        int select2 = in.nextInt();
        
        if (select1 == 1 ) {
            ani = new Rabbit();
        }else {
            ani = new Dog();
        }
        if (select2 == 1) {
            ani.run();
        }else {
            ani.move();
        }
    }
}













































반응형

'Java' 카테고리의 다른 글

Java_53_추상화  (0) 2023.10.15
Java_52_extends, implements 의 차이  (0) 2023.10.14
Java_50_인터페이스  (0) 2023.10.13
Java_49_super  (0) 2023.10.12
Java_48_오버라이드  (0) 2023.10.12