다형성(Polymorphism)

웃음인·2025년 4월 15일

Java

목록 보기
19/37
post-thumbnail

다형성(Polymorphism)

객체 지향 언어의 특징 중 하나
‘다양한 형태를 갖는다’라는 뜻 → 하나의 행동으로 여러 가지 일을 수행하는 개념
상속을 이용한 기술로 부모 클래스 타입 참조변수 하나로
상속 관계에 있는 여러 타입의 자식 객체를 참조할 수 있는 기술


클래스 형변환

업 캐스팅(Up Casting)

상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가
모든 자식 타입 객체의 주소를 참조할 수 있음

// Sonata 클래스는 Car 클래스의 후손
Car c = new Sonata();
// Sonata클래스형에서 Car 클래스형으로 바뀜

* 자식 객체의 주소를 전달받은 부모 타입의 참조변수를 통해서
  접근할 수 있는 객체의 정보는 부모로 부터 상속받은 멤버만 참조 가능


다운 캐스팅(Down Casting)

자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우
부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형변환 하는 것
자동으로 처리되지 않기 때문에 반드시 자식 타입을 명시하여 형변환

// Sonata 클래스는 Car 클래스의 후손
Car c = new Sonata();
((Sonata)c).moveSonata();

* 클래스 간의 형 변환은 반드시 상속 관계인 클래스 끼리만 가능


객체배열과 다형성

다형성을 이용하여 상속 관계에 있는 하나의 부모 클래스 타입의 배열 공간에
여러 종류의 자식 클래스 객체 저장 가능

Car[] carArr = new Car[5]; 

carArr[0] = new Sonata();
carArr[1] = new Avante();
carArr[2] = new Grandure();
carArr[3] = new Spark();
carArr[4] = new Morning();

매개변수와 다형성

다형성을 이용하여 메소드 호출 시
부모타입의 변수 하나만 사용해 자식 타입의 객체를 받을 수 있음

public void execute() {
	driveCar(new Sonata()); 
	driveCar(new Avante());
	driveCar(new Grandure());
}

public void driveCar(Car c) {}

바인딩

실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것

정적 바인딩

프로그램이 실행되기 전 컴파일 단계에서 메소드와 메소드 호출부를 연결


동적 바인딩

컴파일 시 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는 것

  • 동적 바인딩 성립 요건
    상속 관계로 이루어져 다형성이 적용된 경우, 메소드 오버라이딩이 되어 있으면
    정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행
Car c = new Bentley();
c.drive();

instanceof 연산자

현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인 할 때 사용
클래스 타입이 맞으면 true, 맞지 않으면 false 반환

if(레퍼런스 instanceof 클래스타입) {
	// true일때 처리할 내용, 해당 클래스 타입으로 down casting
}

if(c instanceof Sonata) {
	((Sonata)c).moveSonata();
} else if (c instanceof Avante){
	((Avante)c).moveAvante();
} else if (c instanceof Grandure){
	((Grandure)c).moveGrandure();
}



🔗 업캐스팅 / 다운캐스팅 / 바인딩

0개의 댓글