객체지향 언어의 특징 중 하나는 다형성이다.
다형성이란 말그대로 '같은 종이면서 형태나 형질이 다양하게 형성되어있다는 의미'이다
그렇다면 자바에서는 다형성은 왜 필요할까?
여러가지의 클래스를 관리하는 것은 쉽지가 않다.
하여, 하나의 클래스로 여러 개의 클래스를 묶어서 관리한다면 더욱 좋지 않겠는가
자바에서 다형성을 사용하기 위해서는 클래스는 상속 관계여야만 한다.
이유는 같은 종이여야만 하기 때문이다.
그렇기에 부모 클래스로 자식 클래스를 묶어 관리하는 것이다.
예제를 하나 만들어보자
public class Poly {
public void polyMethod() {
System.out.println("Poly 메소드입니다.");
}
}
public class PolyA extends Poly{
public void polyAMethod() {
System.out.println("PolyA 메소드입니다.");
}
}
public class PolyB extends Poly {
public void polyBMethod() {
System.out.println("PolyB 메소드입니다.");
}
}
public class PolyC extends Poly {
public void polyCMethod() {
System.out.println("PolyC 메소드입니다.");
}
}
위와 같이 클래스를 4개를 만들어 A~C까지는 Poly라는 클래스를 상속받았다.
A~C 클래스는 Poly라는 종으로 묶인 것이다.
public class Polymorphism {
public static void main(String[] args) {
Poly[] poly = new Poly[3];
poly[0] = new PolyA();
poly[1] = new PolyB();
poly[2] = new PolyC();
}
}
이제 메인 함수에 위와 같이 작성을 해보자
부모 클래스인 Poly를 참조하는 변수 poly 배열에 자식들을 생성하였다.
(부모 클래스를 자식 클래스로 초기화하는 것을 업 캐스팅이라 한다. (이하부터는 업 캐스팅이라 명함))
에러가 생기지 않는다 같은 종이기 때문이다.
PolyA polyA = new Poly();
그렇다면 위와 같이 자식 클래스에 부모 클래스를 생성하는 건 가능할까?
답은 불가능하다
자식 클래스로 부모 클래스를 생성하는 건 안되고 무조건 업 캐스팅만 가능하다
그렇다면 자식 클래스의 메서드는 사용이 불가능할까?
그렇지 않다 자식클래스으 메서드를 사용하기 위해서는 다운 캐스팅을 진행하면 된다
다운 캐스팅의 사용법은 아래와 같다.
((캐스팅자식자료형)부모변수).자식메소드
예제로 생성했던 클래스로 할당하면 아래와 같다
poly[2].polyMethod(); // polyCMethod()는 접근이 불가능
((PolyC)poly[2]).polyCMethod(); // 다운캐스팅을 진행하여 PolyCMethod()메소드에 접근
((PolyC)poly[2]).polyMethod(); // 다운캐스팅을 진행하여 부모 Poly메소드에 접근
업 캐스팅을 하게 되면 자식 클래스는 부모 클래스의 메서드와 변수만 접근이 가능하며
자기 자신의 클래스 메서드, 변수에는 접근이 불가능하다.
하지만 자기 자신 클래스로 다운 캐스팅을 하면 자식의 메서드를 사용할 수 있다.
물론 부모의 메서드는 당연히 사용할 수 있다.
그렇다면 상속을 여러 개 받아 부모 클래스를 여러개 할당할 수 있을까?
그렇지 않다. 자바는 다중 상속을 지원하지 않는다 (인터페이스는 제외)
이유는 메서드 오버 라이딩 때문인데
만약에 부모 클래스에 같은 메서드가 오버 라이딩되어있을 경우
어떤 것을 사용해야 하는지 혼동이 오기 때문이다
'IT관련 > 자바' 카테고리의 다른 글
JAVA(자바) HttpURLConnection으로 Json 데이터 전송하기 (0) | 2021.05.26 |
---|---|
자바(JAVA) - String 비교 equals(), String pool (0) | 2020.04.28 |
자바(JAVA) - 컬렉션 검색 과 HashMap (0) | 2020.04.02 |
자바(JAV A) - 컬렉션과 제네릭 사용 (0) | 2020.04.01 |
자바(JAVA) - 컬렉션과 제네릭 (0) | 2020.03.30 |