하나의 데이터타입으로 여러 인스턴스를 참조하는 특성
어떤 인스턴스를 업캐스팅해서 슈퍼클래스 타입 변수로 다루면 하나의 슈퍼클래스 타입으로 여러 서브클래스 타입 인스턴스 다룰 수 있음
여러 도형의 특징을 공통적으로 포함하는 슈퍼클래스 Shape
class Shape {
pulbic void draw() {
System.out.println("도형 그리기!");
}
}
Shape 클래스를 상속받는 다른 도형 클래스 정의
class Circle extends Shape {
@override
pulbic void draw() {
System.out.println("도형 그리기!");
}
pulbic void cdraw() {
System.out.println("원 그리기!");
}
}
class Rectangle extends Shape {
@override
pulbic void draw() {
System.out.println("도형 그리기!");
}
pulbic void rdraw() {
System.out.println("사각형 그리기!");
}
}
class Triangle extends Shape {
@override
pulbic void draw() {
System.out.println("도형 그리기!");
}
pulbic void tdraw() {
System.out.println("삼각형 그리기!");
}
}
서브클래스 인스턴스 생성하기
⭐ 입력
Circle c = new Circle();
c.cdraw();
Rectangle r = new Rectangle();
r.rdraw();
Triangle t = new Triangle();
t.tdraw();
📌 출력
원 그리기!
사각형 그리기!
삼각형 그리기!
슈퍼클래스 메서드 상속받아 오버라이딩
위에서 인스턴스를 생성해서 출력한 것과 같은 결과
코드의 통일성 향상됨
c.draw();
r.draw();
t.draw();
업캐스팅을 이용하여 draw() 메서드 호출하기
메서드를 상속받은 것보다 코드의 통일성이 더 향상됨
-> s.draw()
로 세 개 모두 같은 코드를 사용하지만 결과값은 다름
Shape s = new Circle();
s.draw();
Shape s = new Rectangle();
s.draw();
Shape s = new Triangle();
s.draw();
다형성을 배열에 적용시키기
Shape[] sArr = {
new Circle().
new Rectangle(),
new Triangle()
};
for(int i = 0; i < sArr.length; i++) {
sArr[i].draw();
}
메서드에 다형성을 활용하기 1
public class Polymorphism {
public static void main(String[] args) {
Draw(sArr);
// 호출해서 바로 사용 가능
}
public static void Draw(Shape[] sArr) {
// 메인 메서드에서 바로 사용할 수 있게 static 붙이기
for(int i = 0; i < sArr.length; i++) {
sArr[i].draw();
}
}
메서드에 다형성을 활용하기 2
public class Polymorphism {
public static void main(String[] args) {
Draw(c);
Draw(r);
Draw(t);
// 여기까지는 위에 변수 선언이 되어 있어야지 사용 가능
// 만약에 변수 선언을 안했다면
Draw(new Circle());
Draw(new Rectangle());
Draw(new Triangle());
// 로 바로 사용 가능
// 밑에 메서드에서 파라미터가 Shape인데
// 어떻게 서브클래스가 들어가지 했는데
// 입력하면 알아서 업캐스팅이 되는 거래
// 똑똑한 자바
}
public static void Draw(Shape s) {
s.draw();
// 어떤 인스턴스가 오더라도
// draw() 메서드는 공통이기 때문에 호출 가능
}
}