프로그래밍/Java

[Java] 9. 다형성

Jepetto 2023. 3. 1. 11:53

다형성

이전 객체 포스팅에서 다룬 객체 지향 프로그래밍의 3대 특징 중 하나이다.

말 자체는 여러 개의 형태를 갖는다는 의미이고 하나의 행동으로 여러 가지 일을 수행하는 개념이다.

상속을 이용해서 조상으로부터 파생된 여러 가지 타입의 후손 객체를

조상 클래스 타입 하나로 다룰 수 있다.

 

클래스도 변수처럼 형변환이 가능한데 이를 업/다운 캐스팅이라 한다.

업 캐스팅은 상속 관계에 있는 조상, 후손 클래스 간에 조상타입의 참조형 변수가

모든 후손 타입의 객체 주소를 받을 수 있으며 이 때 후손의 정보는 원래 조상타입이었던 멤버만 참조 가능하다.

다운 캐스팅은 후손 객체의 주소를 받은 조상 참조형 변수를 가지고 후손의 멤버를 참조해야 할 경우

조상 클래스 타입의 참조형 변수를 후손 클래스 타입으로 형 변환하는 것이다.

이것은 자동으로 처리되지 않아서 반드시 후손 타입을 명시해서 형변환을 해야한다.

당연하게도 반드시 상속 관계에 있는 클래스끼리만 가능하다.

 

이러한 다형성을 사용하면 상속 관계에 있는 하나의 조상 클래스 타입 배열 공간의 다양한 종류의

후손 클래스 객체 저장이 가능하다.

메소드 호출 시 조상 타입의 변수 하나만 사용해서 후손 타입의 객체를 받을 수도 있게 된다.

 

instanceof 연산자

참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인할 때 사용하는 연산자로 클래스 타입이

맞다면 true, 맞지 않다면 false를 반환한다.

 

바인딩

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

프로그램이 실행되기 전에 컴파일이 되면서 모든 메소드는 정적 바인딩이 된다.

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

동적 바인딩 이라한다. 성립하기 위해서는 상속 관계로 이루어져 다형성이 적용된 경우

메소드 오버라이딩이 되어 있으면 정적으로 바인딩 된 메소드 코드보다

오버라이딩 된 메소드 코드를 우선적으로 수행하게 된다.

 

추상 클래스

바디가 없는 메소드를 추상 메소드라하고 추상 메소드의 선언부에 abstract를 사용한다.

상속 시 반드시 구현해야할 오버라이딩이 강제화 되는 메소드이다.

이 추상메소드를 포함한 클래스를 추상 클래스라하며 클래스 선언부에 abstract를 사용한다.

 

미완성 클래스이기 때문에 자체적으로 객체 생성이 불가능하고 상속해서 객체를 생성해야만 한다.

추상 메소드가 포함된 클래스는 반드시 추상 클래스이지만 추상 메소드가 없더라도 추상 클래스 선언은 가능하다.

클래스 내에 일반 변수나 메소드를 포함해도 관계없으며 객체 생성이 안될뿐 참조형 변수 타입으론 사용 가능하다.

 

일관된 인터페이스를 제공하고 꼭 필요한 기능을 강제화시키기 위해서 사용한다.

 

인터페이스

상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체이다.

메소드 통일성을 부여하기 위해서 추상 메소드만 따로 모아놓은 것으로 상속 할 때 인터페이스 내에

정의된 모든 추상메소드를 구현해야 한다.

 

모든 인터페이스의 메소드는 묵시적으로 public abstract을 갖는다.

변수는 public static final을 가지며 이 때문에 인터페이스의 변수 값을 변경하려하면 컴파일 시 에러가 발생한다.

추상 클래스와 마찬가지로 객체 생성은 불가능하지만 참조형 변수로는 가능하다.

 

상위 타입 역할로 다형성을 지원해서 연결하며 해당 객체가 다양한 기능을 제공하더라도

인터페이스에 해당하는 기능만을 사용하게 제한할 수 있다.

공통적인 기능의 일관성 그리고 공동 작업을 위한 인터페이스를 제공한다.