본문 바로가기
Dev/Java

다형성 (Polymorphism)

by 세대교체 2024. 10. 30.

다형성 (Polymorphism)

다형성이란 하나의 객체에 여러 가지 타입을 대입할 수 있다는 것을 의미한다.

자바에서는 다형성으로 인해 객체 지향 프로그래밍의 이점을 극대화할 수 있다. 하나씩 알아보자.

 

 

오버로딩

오버로딩은 같은 이름의 메서드를 매개변수의 개수나 타입에 따라 여러 형태로 정의하는 방식이다.

 

 

오버라이딩

오버라이딩은 상속받은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 방식이다.

 

 

추상 클래스

추상 클래스는 부모 클래스는 제공하지만, 실제 생성되면 안 되는 클래스를 추상 클래스라 한다.

 

추상 클래스는 이름 그대로 추상적인 개념을 제공하는 클래스다. 따라서 실체인 인스턴스가 존재하지 않는다.

대신에 상속을 목적으로 사용되고 부모 클래스 역할을 담당한다.

 

 

인터페이스

인터페이스를 구현하는 곳에서 인터페이스의 메서드를 반드시 구현해야 되는 규약(제약)을 줄 수 있다.

인터페이스의 규약(제약)은 반드시 구현해야 하는 것이다.

 

그런데 추상 클래스의 경우 미래에 누군가 그곳에 실행 가능한 메서드를 끼워 넣을 수 있다. 이렇게 되면 추가된 기능을 자식 클래스에서 구현하지 않을 수도 있다.

인터페이스는 모든 메서드가 추상 메서드이다. 따라서 이런 문제를 원천 차단할 수 있다.

 

 

업 캐스팅

업 캐스팅은 현재 타입을 부모 타입으로 변경하는 것을 말한다.

부모 타입으로 변환하는 경우에는 다음과 같이 캐스팅 코드인 (타입)을 생략할 수 있다.

 

업 캐스팅은 생략할 수 있다.

다운 캐스팅은 생략할 수 없다.

참고로 업 캐스팅은 매우 자주 사용하기 때문에 생략을 권장한다.

 

업캐스팅의 경우 객체를 생성하면 해당 타입의 상위 부모 타입은 모두 함께 생성된다. 따라서 위로만 타입을 변경하는 업캐스팅은 메모리 상에 인스턴스가 모두 존재하기 때문에 항상 안전하다. 따라서 캐스팅을 생략할 수 있다.

 

 

다운 캐스팅

다운 캐스팅은 현재 타입을 자식 타입으로 변경하는 것을 말한다.

자식 타입의 기능을 사용하려면 다음과 같이 다운캐스팅 결과를 변수에 담아두고 이후에 기능을 사용하면 된다.

 

 

다운캐스팅 결과를 변수에 담아두는 과정이 번거롭기에 이런 과정 없이 일시적으로 다운캐스팅을 해서 인스턴스에 있는 하위 클래스의 기능을 바로 호출하자.

 

일시적 다운캐스팅을 사용하면 별도의 변수 없이 인스턴스의 자식 타입의 기능을 사용할 수 있다.

 

다운캐스팅의 경우 객체를 생성하면 부모 타입은 모두 함께 생성되지만 자식 타입은 생성되지 않는다.

이로 인해 인스턴스에 존재하지 않는 하위 타입으로 캐스팅하는 문제가 발생할 수 있다. 따라서 개발자가 이런 문제를 인지하고 사용해야 한다는 의미로 명시적으로 캐스팅을 해주어야 한다.