JAVA

[JAVA]다형성

당고개 2023. 10. 19. 21:02

객체지향 언어의 특정중 하나인 다형성에 대해서 알아봅시다.

다형성이란 여러가지 형태에 속할 수 있는 성질, 하나의 객체 인스턴스가 여러가지 자료형을 가질 수 있는 것을 말합니다.

다형성을 논할 때 is - a 관계에 대해서 익숙해져야 합니다.

  • 산소는 기체이다. 기체는 산소이다.
  • 웰시코기는 개이다. 개는 웰시코기이다.
  • Java 는 프로그래밍 언어이다. 프로그래밍 언어는 Java이다.
public class Dog {
    protected String color;

    public void bite() {
        System.out.println("깨물다");
    }

    public void bark() {
        System.out.println("짖는다");
    }
}

public class Bulldog extends Dog {

}

public class Retriever extends Dog {
    public void swim() {
        System.out.println("수영하다");
    }
}

Bulldog 클래스는 Dog 클래스를 상속받고 있고, Retriever 클래스도 Dog 클래스를 상속받고 있습니다. 이러한 상속 구조가 있을 때 다형성을 이용할 수 있습니다.

Bulldog bulldog = new Bulldog();
Dog dog = new BullDog();

// 또는

Retriever retriever = new Retriever();
Dog dog = new Retriever();

다형성을 가지고 무엇을 할 수 있을까요? 라고 궁금하실 수 있습니다. 이 부분은 이후의 강의에서 추상화라는 개념과 결합이 되므로 그때 더 자세히 얘기가 진행됩니다.

자식 객체는 부모 객체의 요소를 가지고 메모리 공간에 적재

Retriever 인스턴스를 생성 시 부모 클래스인 Dog 클래스의 요소도 포함된 만큼 메모리를 할당하여 적재됩니다. 그리고 참조 자료형 변수는 단순히 인스턴스에 접근할 수 있는 메모리 주소만 저장합니다.

객체의 형 변환

인스턴스를 생성할 때 자료형을 따라가는 것이 아니라 new 키워드를 이용하여 생성한 인스턴스가 메모리에 적재됩니다.

객체의 형 변환은 '형 변환하는 자료형으로 사용하겠다' 라는 '의미'만 존재합니다.

인스턴스 자체가 변환되는 것이 아닙니다. 그 이유는 참조 자료형은 단순히 참조값만 저장하기 때문에 실제로는 생성했던 인스턴스를 사용하기 때문입니다.

Dog dog = new Retriever();
Retriever retriever = (Retriever)dog;
retriever.swim();

Dog dog = new Bulldog();
Bulldog bulldog = (Bulldog)dog;

Dog dog = new Dog();
Retirever retriever = (Retriever)dog; // 에러 발생, 개는 리트리버가 될 수 없다.

instanceof 연산자

(변수 또는 인스턴스) instanceof (클래스이름)

instanceOf 연산자는 해당 인스턴스가 특정 인스턴스가 맞는지 확인할 수 있는 연산자이며 맞으면 true, 틀리면 false를 반환합니다.

Dog dog = new Retriever();

System.out.println(dog instanceof Retriever); // true
System.out.println(dog instanceof Dog); // true
System.out.println(dog instanceof Bulldog); // false

 

 

 

출처 : https://www.codelatte.io/courses/java_programming_basic/VYY9TWYJ2EVK561A

'JAVA' 카테고리의 다른 글

[JAVA]추상화  (0) 2023.10.24
[JAVA]오버라이드(Override)  (0) 2023.10.23
[JAVA]상속과 생성자  (0) 2023.10.18
[JAVA]상속  (0) 2023.09.21
[JAVA]String 메서드  (0) 2023.09.21