[JAVA] 객체지향 - 다형성

2024. 9. 1. 01:28·Back-End/Java

[작성일: 2023. 01. 29]

 

목차

     

    다형성(Polymorphism)

    • 여러 가지 형태를 가질 수 있는 능력
    • 조상 타입 참조변수로 자손 타입 객체를 다루는 것
    • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수는 없음.
    int i = 10;
    double d = i;
    
    double b = 10.34;
    int j = b; // (X) 넓은 곳에서 좁은 곳으로 갈 수 없음.
    INT J = (int)b; // 가능.
    class Tv {
      boolean power;
      int channel;
        
      void power() { power = !power; }
      void channelUp() { ++channel; }
      void channelDown() { --channel; }
    }
    
    class SmartTv extends Tv { // 
      String text; 
      void caption() { /*내용생략*/ }
    }
    
    
    Tv t = new Tv();
    SmartTv s = new SmartTv(); 
    // 일반적으로는 타입이 일치하게 해줘야 하지만,
    
    Tv t = new SmartTv(); // 타입 불일치해도 괜찮은 게 다형성.
    // SmartTv의 멤버가 더 많기 때문에 객체로 사용 가능해짐.(일부만 사용)
    // 조상 타입 참조변수로 자손 타입 인스턴스 참조
    
    SmartTv s = new Tv(); // 에러. 허용 안 됨.

     

     

     

     

     

     

    Q&A

    Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?

        A. NO. 일치하는 것이 보통이지만 일치하지 않을 수도 있음. (다형성)

    SmartTv s = new SmartTv(); // 참조 변수와 인스턴스의 타입 일치
    Tv t = new SmartTV(); // 조상 타입 참조변수로 자손 타입 인스턴스 참조

     

    Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?

        A. 참조변수로 사용할 수 있는 멤버의 개수가 달라짐.

     

    Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있는가?

        A. NO. 허용되지 않음.

    Tv t = new SmartTv(); // 허용
    SmartTv s = new Tv(); // 에러

     

     

     

     

     

    매개변수의 다형성

    • 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음.
    • 다형적 매개변수
    class Product {
      int price; // 제품 가격
      int bonusPoint; // 보너스 점수
    }
    
    class Tv extends Product {}
    class computer extends Product {}
    class Audio extends Product {}
    // 자손들
    
    class Buyer { // 물건 사는 사람
      int money = 1000; // 소유 금액
      int bonusPoint = 0; // 보너스 점수
    }
    
    // 메서드 추가
    void buy(Tv t) {
      money -= t.price;
      bonusPoint += t.bonusPoint;
    }
    
    // 오버로딩1
    void buy(Computer c) {
      money -= t.price;
      bonusPoint += t.bonusPoint;
    }
    
    // 오버로딩2
    void buy(Audio a) {
      money -= t.price;
      bonusPoint += t.bonusPoint;
    }
    
    
    // 오버로딩이 많아지면 불편하므로 아래와 같이 메서드를 변경함.
    // 조상타입 사용, 메서드 하나로 여러 물건을 살 수 있음.(다형성)
    void buy(Product p) {
      money -= p.price;
      bonusPoint += p.bonusPoint;
    }

     

     

     

     

     

    여러 종류의 객체 배열로 다루기

    • 조상타입의 배열에 자손들의 객체를 담을 수 있음.
    Product p1 = new Tv();
    Product p2 = new Computer();
    Product p3 = new Audio();
    
    
    // 배열로 바꾸기 -> 다형성으로 자손들이 들어올 수 있음
    Product p[] = new Product[3];
    p[0] = new Tv();
    p[1] = new Computer();
    p[2] = new Audio();
    
    
    // 예시
    class Buyer {
      int money = 1000;
      int bonusPoint = 0;
        
      Product[] cart = new Product[10];
        
      int i=0;
        
      void buy(Product p) {
        if(money < p.price) {
          System.out.println("잔액 부족");
          return;
        }
            
        money -= p.price;
        bonusPoint += p.bonusPoint;
        cart[i++] = p;
      }
    }

     

     

     

     

     

     

     

     

     

     


    🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
    🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.

     

    저작자표시 비영리 변경금지 (새창열림)
    'Back-End/Java' 카테고리의 다른 글
    • [JAVA] 객체지향 - 추상클래스, 추상메서드
    • [JAVA] 객체지향 - 참조변수의 형변환
    • [JAVA] 객체지향 - 오버라이딩
    • [JAVA] 객체지향 - 제어자, 접근 제어자, 캡슐화
    뚜비
    뚜비
    1년차 백엔드&iOS 개발자의 감자 탈출 블로그 🥔🥔
    • 뚜비
      뚜비의 개발로그
      뚜비
    • 전체
      오늘
      어제
    • 글쓰기     관리
      • Devlog
        • Back-End
          • Java
          • Spring
          • JPA
          • HTTP
          • Security
          • Back-End
          • Front-End
        • 알고리즘
        • iOS
          • Swift
        • Database
        • Tips
          • Git & GitHub
          • A to Z
        • 프로젝트
        • 생각정리
    • 태그

      Security
      html
      DB
      최주호
      객체
      sql
      Database
      Spring Security
      백준
      김영한
      MVC
      자바스크립트
      자바
      성능최적화
      게시판만들기
      JPA
      프로그래머스
      Java
      스프링
      javascript
      생성자
      jsp
      데이터베이스
      다형성
      알고리즘
      변수
      HTTP
      Swift
      의존성주입
      spring
    • hELLO· Designed By정상우.v4.10.0
    뚜비
    [JAVA] 객체지향 - 다형성
    상단으로

    티스토리툴바