티스토리 뷰

다형성이란? 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미

 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있다.



Java에서 다형성은 상속과 인터페이스를 통해 이루어지며, 

인터페이스가 상속보다 다형성에 더욱 유연함을 제공합니다.




참조변수의 형변환

 - 기본형 변수와 같이 참조변수도 형변환이 가능하다.

서로 상속관계에 있는 클래스 사이에서만 가능하다.



형변환 

생략 여부

자손타입 -> 조상타입 (Up-casting)

형 변환 생략 가능

자손타입 <- 부모타입 (Down-casting)

형 변환 생략 불가능




다형성의 upcastingdowncasting을 실습으로 공부하겠습니다.


upcasting,downcasting을 사용하는 main 클래스

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
public class ExamplePolymorphism {
    public static void main(String[] args) {
 
        // UpCasting
        // 자식 is a 부모가 성립된다.(문법X, 논리O)
 
        Shape s = new Circle(10); // 원을 만들고 이걸 도형이라고 부른다.
        s.makeArea(); // 도형의 넓이를 구해라 => 원의 넓이를 구해라.
 
        System.out.println(s); // 원을 도형으로 부르겠다. 도형을 객체로 불러서
                                // 객체의 정보를 출력해라. -> 원에 대한 정보를 출력해라.
                                // println(Object x)
 
        // DownCasting
        // 부모 is a 자식 (문법X, 논리X) -> 컴파일 에러...
        // Cirlce c = new Shape(); // 추상클래스가 아니더라도 논리적으로 알맞지 않기 떄문에 컴파일 에러
        // 도형은 원이다...(X)
 
        // 하지만 도형이 애초에 어떠한(원 or 사각형)도형으로 만들어져 있었다면 논리적으로 맞다.
        // 이 도형은 원이다.
 
        Circle c = (Circle) s; // 이 도형은 원이다.
        Shape s1 = new Square(10, 20);
        Square sq = (Square) s1; // 이 도형은 사각형이다. (문법O, 논리O)
                                    // 애초에 도형이 원으로 만들어져 있기 때문에
 
        Square sq1 = (Square) s; // 컴파일에서는 에러가 안나지만, 실행 시에 에러가 난다.
                                    // (잘못된 DownCasting)
                                    // ClassCastException (형 변환 예외)
 
    }
}



Shape 추상클래스

1
2
3
4
5
6
7
public abstract class Shape {
 
    protected double area;
 
    public abstract void makeArea();
 
}



Shape클래스를 상속받은 Square 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Square extends Shape {
 
    private int width;
    private int height;
 
    public Square(int width, int height) {
        this.height = height;
        this.width = width;
    }
 
    @Override
    public void makeArea() {
        super.area = this.height * this.width;
    }
    @Override
    public String toString() {
        return "Square [width="+this.width+" height="+this.height+" area="+super.area+"]";
    }
}



Shape클래스를 상속받은 Circle 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Circle extends Shape {
 
    private int r;
 
    public Circle(int r) {
        this.r = r;
    }
 
    @Override
    public void makeArea() {
        super.area = Math.pow(this.r, 2) * Math.PI;
    }
 
    @Override
    public String toString() {
        return "Circle [r=" + this.r + " area=" + super.area + "]";
    }
}


반응형
LIST
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
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
글 보관함