[자바] 다형성(Polymorphism)

Gammi·2022년 10월 26일
0

JAVA

목록 보기
20/35
post-thumbnail

다형성 (Polymorphism)


  • 하나의 데이터타입으로 여러 인스턴스를 참조하는 특성

  • 어떤 인스턴스를 업캐스팅해서 슈퍼클래스 타입 변수로 다루면 하나의 슈퍼클래스 타입으로 여러 서브클래스 타입 인스턴스 다룰 수 있음


⭐ 예제


  • 저 위에 설명만 보면 도대체 무슨 소리를 하는 건지 모르겠어서 예제 추가...ㅎㅎ

여러 도형의 특징을 공통적으로 포함하는 슈퍼클래스 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() 메서드는 공통이기 때문에 호출 가능
  }
}
profile
개발자가 되었어요⭐️

0개의 댓글