객체 지향의 특징은 아래와 같습니다.
이 중 다형성에 대해서 다루는 것이 이 포스팅의 목적입니다.
서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 때, 각자의 특성에 맞는 방식으로 동작하는 것
다형성(Polymorphism), 단어를 봤을 때 말 그대로 다양한 형태를 띈다는 것을 의미한다는 것을 직관적으로 알 수 있다. 객체는 경우에 따라 다양한 형태를 띈다는 것이다. 객체와 클래스에서 특별히 설명하지 않고 간단히 집고 넘어가기는 했지만, 우리가 객체 및 인스턴스를 생성하는 방법은 사실 아래와 같다.
참조타입 참조변수 = new 생성자()
하지만, 저 포스팅을 들어가도 확인이 가능하지만, TV tv = new MyTV()
와 같이 뭔가 참조타입과 생성자가 매칭이 되지 않는 것을 확인 할 수 있다. 바로 '상속' 덕분이다. 그냥 MyTV tv = new myTV();
라 하면 되지 상속(인터페이스의 경우 구현)은 왜 하는 것일까?
제목이 좀 길다. 우리가 람보르기니를 몰든 페라리를 몰든 부가티를 몰든 아반떼를 몰든 수동이냐 자동이냐 정도의 차이는 있겠지만 운전법 자체가 크게 달라지지는 않는다. 즉, 이러한 람보르기니든 페라리든 아반떼든 '승용차'라는 개념을 상속받고 있는 것이다. 이는 가격이나 외관 등등은 각 제조사 별로 다르게 '다양한 형태'로 바꾸도록 하되, 근본적인 것(운전법 등)은 변하지 않는다.
나중에 이것이 전기차나 수소차로 바뀐다고 하더라도 운전법이 완전 바뀌면 운전자들은 혼란이 올 것이다. 근본적인 것은 바뀌지 않고, 나머지는 다양한 형태로 되도록 하는 것, 이것이 다형성의 핵심이다.
... 기타등등 많은 사례들을 볼 수 있다. 과연 코드상에서 다형성은 어떻게 접근을 해야될까?
우선, 역할과 구현으로 구분을 해보자. 역할은 변하지 않는 근본적인 것들이고, 구현은 다양한 형태로 변경이 가능한 나머지라 생각하면 된다. 이렇게 나누면 어떠한 장점들이 있는지 정리해보면 아래와 같다.
자바 언어에서는 다형성을 어떻게 접근할까? 우선 객체를 설계할 때, 역할을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만드는 것이다. 역할과 구현을 명확하게 분리를 해야되고, 흔히 자바에서는 아래와 같은 것들로 역할과 구현을 구분한다.
TV tv = new MyTV()
와 같은 사례에서 TV
가 역할, MyTV
가 구현이라는 것을 확인할 수 있다.
상속 구조(또는 구현 관계)의 클래스들 간 형변환이 가능하다.
UpCasting
자식 타입에서 부모 타입으로 형변환하는 것으로 자동형변환을 생각하면 된다.
부모 = 자식객체;
DownCasting
부모 타입에서 자식 타입으로 형변환하는 것으로 강제형변환에 해당한다.
((자식)부모).자식메소드();
instanceof
연산자 => 연산 결과 true/false로 반환
현재 레퍼런스가 실질적으로 어떤 클래스타입을 참조하는지 확인할 때 사용하고 그 형식은 아래와 같다. 이는 오른쪽에 오는 클래스/인터페이스 타입으로 DownCasting
이 되는지에 대한 조건과 같다!
(레퍼런스 instanceof 클래스/인터페이스 타입)
다형성은 부모타입으로부터 파생된 여러가지 타입의 자식들을 부모클래스 타입 하나로 다룰 수 있는 기술을 의미한다. 이는 UpCasting과 DownCasting으로 확인할 수 있다.
다형성 사용전에는 자식 객체가 여러가지 존재하면 그 갯수만큼 관리해야한다. 하지만 다형성을 활용하면 하나의 부모타입만으로 여러 자식들을 받을 수 있다.
아래와 같이 단순히 뒤에 붙는 자식을 바꾸는 것으로 관리가 가능하다. 아래 예시를 보면 DB 선정에 있어서 메모리로 관리를 할껀지, JDBC를 이용해서 관리할껀지 쉽게 조정 가능하다.
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
읽기쉽고
이해하기
수월하게
하셨네요^^