본문 바로가기
[JAVA]/[자바 기초]

[자바 기초] 다형성

by 북방바다코끼리표범 2023. 8. 9.

복습

https://shins99.tistory.com/32

 

[JAVA] 상속

복습 https://shins99.tistory.com/25 [자바 기초] 배열 복습 https://shins99.tistory.com/23 [자바 기초] static 복습 https://shins99.tistory.com/21 [자바 기초] C R U D 의 개념 복습 https://shins99.tistory.com/20 [자바 기초] this

shins99.tistory.com


💡 학습 목표 

1. 다형성에 대한 개념을 이해하자. 
2. 업캐스팅이란 무엇일까? 
3. 다운캐스팅이란 무엇일까?
4. instanceof 연산자를 이해하자.

다형성 (Polymorphism)

- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것

(자료형을 다양한 형태로 볼 수 있다)

- 같은 코드에서 여러  실행 결과가 나옴

- 정보 은닉, 상속과 더불어 객체 지향 프로그래밍의 가장 큰 특징 중 하나

- 다향성을 잘 활용하면 유연하고 확장성 있는, 유지보수가 편리한 프로그램 만들 수 있음

 

하나의 타입을 다양한 형태로 바라볼 수 있다.

package ch05;

public class Animal {
	
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
	
	public void eating() {
		System.out.println("동물이 먹이를 먹습니다.");
	}
	
} // end of Animal class 

class Tiger extends Animal {
	
	@Override  // 오버라이드 
	public void move() {
		System.out.println("호랑이가 네발로 움직입니다");
	}
	
	@Override
	public void eating() {
		System.out.println("호랑이가 사냥을 합니다");
	}
	
}

class Human extends Animal {
	
	@Override
	public void move() {
		System.out.println("사람이 두발로 걸어 다닙니다.");
	}
	
	@Override
	public void eating() {
		System.out.println("밥을 먹습니다.");
	}
	
	public void readBooks() {
		System.out.println("사람이 책을 읽습니다.");
	}
	
}

 

참조형 형 변환 (Reference Type Casting)

- 상속 관계에서 부모 클래스, 자식 클래스간의 형 변환

 

업 캐스팅

- 부모 클래스 타입으로 변수 선언, 자식 클래스의 생성자로 인스턴스 생성

- 해당 참조변수는 자식 클래스의 멤버변수에 접근 불가

: 컴파일 시점에 컴파일러가 부모 클래스만 확인하기 때문 - 다운 캐스팅 필요

// 다형성, 업캐스팅
		// 업 캐스팅은 하위 클래스의 객체를 상위 클래스 타입으로 변환하는 것
		// 이 경우에는 데이터 손실이 없다.
		// 업 캐스팅은 자동적으로 이루어짐으로 별도의 형 변환 연산자가 필요없다.
		Animal animal = new Bird(); // 업캐스팅.

다운 캐스팅

- 부모 클래스의 참조를 자식 클래스의 참조로 변환하는 과정

- 업 캐스팅된 참조변수에 대해, 자식 클래스로 사용하겠다고 컴파일러에게 명시하는 과정

- 자식 클래스에 정의된 메서드, 멤버변수 사용하기 위해 씀

- 강제 형 변환과 유사

// 다운 캐스팅
		// 다운 캐스팅은 업캐스팅 된 객체를 다시 원래의 하위 클래스 타입으로 변환하는 것
		// 다운 캐스팅은 수동적으로 형 변환 연산자를 사용해야 함. 
		// 업캐스팅 된 객체를 하위 클래스의 메서드, 속성을 사용하기 위해 필요
		Bird bird = (Bird)animal; // 다운캐스팅
		bird.fly();

instanceof

어떤 객체가 특정한 클래스의 인스턴스인지 확인하는 용도로 사용

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        if (animal1 instanceof Dog) {
            System.out.println("animal1은 개입니다!");
        }

        if (animal2 instanceof Cat) {
            System.out.println("animal2는 고양이입니다!");
        }
    }
}