[자바의 정석] - 다형성

2023. 9. 25. 23:09·📝 끄적끄적/🖥️ 자바의 정석

다형성

객체지향에서 제일 중요한 개념이다.

다형성을 이해 못 하면 추상클래스, 인터페이스 이해를 못 할 것이다.

 

  • 여러 가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
class SmartTv extends Tv {}

Tv t = new SmartTv(); //타입 불일치.

 

❓ 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이

 

가정

`Tv` 클래스의 멤버(참조변수, 메서드): 5개

`SmartTv` 클래스의 멤버(참조변수, 메서드): 7개

 

`SmartTv s = new SmartTv();`

타입이 일치할 때는 멤버 7개를 다 사용할 수 있다.

 

`Tv t = new SmartTv();`

일치하지 않을 때는 멤버 5개만 사용할 수 있다.

  • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.

`SmartTv s = new Tv();`

 

왜?

부모 타입의 멤버보다 자손 타입의 멤버가 더 많다.

사용할 수 없는 것을 호출하는것이기 때문이다.

 

매개변수의 다형성

  • 참조형 매개변수를 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.

다형성 파트에서 배웠던 다형성을 사용할 때의 장점 2가지를 드디어 배워보는 시간이다.

 

1. 다형적 매개변수

class Product {
	int price;			// 제품의 가격
	int bonusPoint;		// 제품구매 시 제공하는 보너스점수
}

class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {}

Class Buyer { //물건사는 사람
	int money = 1000;
}

 

가정

`Product`라는 조상 클래스가 있다.

`Product`를 상속받는 `Tv`, `Computer`, `Audio` 자식 클래스가 있다.

1000원을 가진 `Buyer`라는 클래스가 있다.

 

`Buyer`가 물건을 살 수 있게 메서드를 추가해 보자.

void buy(Tv t) {
	money -= t.price;
} 

이렇게 매개변수 타입을 `Tv`로 하면 `Tv`만 들어올 수 있다. → `Tv`만 살 수 있다.

 

❓ 만약 `Computer`와 `Audio`도 사고 싶다면

void buy(Tv t) {
	money -= t.price;
} 

void buy(Computer c) {
	money -= t.price;
} 
void buy(Audio a) {
	money -= t.price;
} 

이렇게 `buy`메서드를 오버로딩해서 타입 개수만큼 메서드를 만들어줘야 한다.

 

❓ 여기서 매개변수 타입을 조상인 `Product`로 받는다면

void buy(Product p) {
	money -= t.price
}
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();

이렇게 다형성을 이용하면 메서드 여러 개 받을 필요 없다.

이게 바로 다형적 매개변수의 장점이다!

 

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

보통 하나의 배열에 같은 종류를 저장하는데, 다형성을 이용하면 하나의 배열에 여러 종류 객체를 저장할 수 있다.

 

  • 조상타입의 배열에 자손들의 객체를 담을 수 있다.
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();

이 두 코드는 같은 것이다.

이 변수 3개를 묶어놓는 게 배열이다.

저작자표시 비영리 (새창열림)

'📝 끄적끄적 > 🖥️ 자바의 정석' 카테고리의 다른 글

[자바의 정석] - 인터페이스(interface)  (1) 2023.09.26
[자바의 정석] - 추상 클래스와 추상메서드  (0) 2023.09.25
[자바의 정석] 참조변수의 형변환, instanceof 연산자  (0) 2023.09.24
[자바의 정석] 제어자, 캡슐화  (0) 2023.09.24
[자바의 정석] 상속, 참조변수 super, 생성자 super()  (0) 2023.09.23
[자바의 정석] 생성자, 변수/멤버 변수의 초기화  (0) 2023.09.22
'📝 끄적끄적/🖥️ 자바의 정석' 카테고리의 다른 글
  • [자바의 정석] - 인터페이스(interface)
  • [자바의 정석] - 추상 클래스와 추상메서드
  • [자바의 정석] 참조변수의 형변환, instanceof 연산자
  • [자바의 정석] 제어자, 캡슐화
현주먹
현주먹
대구 불주먹 출신 현주먹의 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (165) N
      • 👶🏻 CS (15)
        • Operating System (8)
        • Database (4)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • JPA (5)
        • Test Code (1)
        • Database (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (60) N
        • 후기 및 회고 (5)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
        • 📖 가상 면접 사례로 배우는 대규모 시스템 설계 .. (3) N
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL repository
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 태그

    f-lab 후기
    jsp
    백준
    코딩테스트준비
    ==와 equals()
    til
    C
    로또 미션
    자바의신절판
    데브클럽
    오블완
    개발자멘토링
    JPA
    NextSTEP
    TDD 클린 코드 with Java
    티스토리챌린지
    항해99
    99클럽
    백준10250
    에프랩 후기
    개발자취업
    에프랩
    객체지향
    코테스터디
    오라클
    PostGreSQL함수
    인프런 특정문자뒤집기
    F-Lab
    인프런 단어뒤집기
    자바의정석
  • hELLO· Designed By정상우.v4.10.2
현주먹
[자바의 정석] - 다형성
상단으로

티스토리툴바