티스토리 뷰
다형성이란? 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미
한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있다.
Java에서 다형성은 상속과 인터페이스를 통해 이루어지며,
인터페이스가 상속보다 다형성에 더욱 유연함을 제공합니다.
참조변수의 형변환
- 기본형 변수와 같이 참조변수도 형변환이 가능하다.
서로 상속관계에 있는 클래스 사이에서만 가능하다.
형변환 | 생략 여부 |
자손타입 -> 조상타입 (Up-casting) |
형 변환 생략 가능 |
자손타입 <- 부모타입 (Down-casting) |
형 변환 생략 불가능 |
다형성의 upcasting과 downcasting을 실습으로 공부하겠습니다.
upcasting,downcasting을 사용하는 main 클래스
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 추상클래스
public abstract class Shape { protected double area; public abstract void makeArea(); }
Shape클래스를 상속받은 Square 클래스
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 클래스
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
'프로그래밍 > Java' 카테고리의 다른 글
자바 ! 사용자 정의 예외처리 ( Exception, RuntimeException, try ~ catch ~ finally ) (0) | 2017.05.09 |
---|---|
자바 ! 예외처리 ( Exception , try ~ catch ~ finally) (0) | 2017.05.08 |
자바 ! Object 클래스 ( toString(), equals() 메소드 등..) (0) | 2017.05.01 |
자바 ! 인터페이스 (interface) (0) | 2017.04.30 |
자바 ! 오버라이딩, 추상클래스 (overriding, abstract) (1) | 2017.04.26 |
댓글