TIL (다형성)

이우진·2023년 7월 27일

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

클래스 형변환

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

ex)
// 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 mofning();

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

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

}

public void driveCar(Car c) {}

바인딩

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

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

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

동적 바인딩 성립 요건

상속 관계로 이루어져 다형성이 적용된 경우,메소드 오버라이딩이 되어 있으면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행

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

표현식

profile
이우진

0개의 댓글