#오류에 대해 지적해 주시면 수정하겠습니다.
다형성이란?
객체 지향 프로그래밍의 중요한 특징 중의 하나로 함수 이름이나 연산자가 목적으로 사용될 수 있는 것을 의미.
객체 지향에서 다형성이란 클래스가 하나의 메시지에 대해 각 클래스가 가지고 있는 고유한 방법으로 응답할 수 있는 능력을 의미하며, 응용 프로그램에서 하나의 함수가 연산자 두 개 이상의 서로 다른 클래스의 인스턴스들을 같은 클래스에 속한 인스턴스처럼 수행 할 수 있도록 하는 것을 말한다.
자바에서의 다형성
자바에서의 다형성은 하나의 객체가 여러가지 타입을 가진다는 것을 의미한다. 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조하는 방식으로 구현하게 된다.
아래의 Parent 클래스와 Child 클래스를 보면 Parent 클래스가 자신을 상속받고 있는 Child 클래스를 참조할 수 있음을 확인 할 수 있다.
하지만 반대의 경우는 성립 되지 않는다. Child class가 Parent class를 상속 받았기 때문에, Child class에서 사용할 수 있는 멤버의 개수는 Parent class보다 무조건 많거나 최소 같을 것이다. 그러므로 아래와 같은 경우 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 많기 때문에 다음과 같이 쓸 수 없다.
일반 클래스 뿐만 아니라 자체로 객체 생성이 불가능한 인터페이스도 해당 인터페이스를 implements한 클래스를 참조하는 방식으로 다음과 같이 작성할 수 있다.
다형성을 사용하는 이유
1. 동적할당
2. 기능 제한
3. 기능변경 / 추가
instanceof
instanceof는 변수의 타입을 확인할 수 있는 예약어로 true/false를 반환한다.
프로그램의 안정적 동작을 위해 객체의 형변환시 변환하려는 참조변수의 타입을 확인할 때 사용한다.
아래의 경우 b인스턴스는 Bus를 참조하고 있지만, b는 Bus가 상속받고 있는 Vehicle 또한 참조할 수 있으므로 아래와 같은 코드에서 b instanceof Vehicle은 true를 반환하게 된다.
(+) Serializable이나 Comparable과 같은 인터페이스를 상속받았는지 확인 할 때도 많이 쓴다고 한다!
Overloading / Overriding
사실 overloading은 자바의 다형성과는 관련이 없지만 overriding과 이름이 비슷하기 때문에 같이 다뤘다.
-overloading
단어 뜻을 보자면 겹쳐서 짐따위를 싣는다는 것이다.
우리가 매일같이 쓰는 println을 보면 똑같은 이름의 메서드로 여러개가 만들어져 있음을 알 수 있다. 이처럼 오버로딩은 이름이 같은 함수를 여러개 선언하는 것을 의미한다.
이름만 똑같으면 되고, 반환형은 달라도 상관없으며, 매개변수는 반드시 달라야 한다. 또한 접근제어자도 상관없이 사용할 수 있다.
-overriding
단어 뜻을 보자면 치환한다는 것이다. 다시 말해서 부모의 메소드를 자식 클래스에서 재정의 하는 것을 의미한다.
아래의 경우를 보면, 여러 종류의 자동차 클래스들이 Vehicle을 상속받고 있고 maxPassenger 메소드를 overriding 하고 있다. overriding을 할 땐, 메소드명, 매개변수, 리턴형이 반드시 같아야하며 접근제어자는 부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정할 수 있다.
(+) 리스코프 치환원칙에 따라 더 넓은 범위의 접근 제어자를 써야한다.
https://stackoverflow.com/questions/5378995/confused-with-java-overriding-the-access-level
오버라이딩을 사용해서 구현하면 장점이 무엇이 있을까?
다음 코드에서 v객체의 참조형을 변경해가면서 각각 오버라이딩한 메서드를 호출하는 것을 확인해 볼 수 있다.
override를 적절히 활용하면 코드가 유연해지고 유지보수성이 높아진다.
결론
다형성이란, 부모 클래스가 자신을 상속받은 다른 클래스들의 형태로 변할 수 있다는 것.이를 사용해 오버라이딩에 대해 정리 해봤고, 이름이 비슷한 오버로딩도 같이 정리해 봤다.
오버로딩 | 오버라이딩 | |
접근제어자 | 상관없다. | 부모클래스보다 더 넓은 범위여야한다. |
리턴형 | 상관없다. | 반드시 같아야한다 |
메소드명 | 반드시 같아야한다 | 반드시 같아야한다 |
파라미터 | 반드시 달라야한다 | 반드시 같아야한다 |
'Programming Language > JAVA' 카테고리의 다른 글
[JAVA스터디]Lambda (0) | 2021.09.22 |
---|---|
[JAVA스터디]JDK,JRE,JVM (0) | 2021.08.15 |
[JAVA스터디]자바 입출력(2)-직렬화/역직렬화 (0) | 2021.08.11 |
[JAVA스터디]자바 입출력(1)-System,Stream,표준입출력,객체입출력 (0) | 2021.08.10 |