1. 다형성 이해해보기
다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
예를 들어 자동차가 타이어를 사용하는 방법은 동일하지만 어떤 타이어를 사용하는지에 따라 성능이 바뀐다.
여기서 타이어를 부모 클래스, 그리고 타이어의 종류들을 각각 자식 클래스로 생각하면 된다.
타이어 = new 금호 타이어
타이어 = new 한국 타이어
와 같은 모습인 것이다.
자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있다.
다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나다.
이번엔 코드로 예를 들어보자.
class Parent { ... }
class Child extends Parent { ... }
...
Parent pa = new Parent(); // 허용
Child ch = new Child(); // 허용
Parent pc = new Child(); // 허용
Child cp = new Parent(); // 오류 발생.
지금까지 우리는 클래스 타입이 같은 것들만 인스턴스를 생성해왔다(Parent pa = new Parent();와 같이).
하지만 위의 코드 처럼 부모 클래스 타입의 참조변수가 자식 클래스 타입의 인스턴스를 참조할 수 있다.
이것이 바로 다형성이다.
(반대는 허용되지 않는다)
이제 다형성을 이용해 객체를 생성하는 방법을 더 자세히 알아보자.
2. 다형성으로 객체 생성하기
클래스 코드
class Father{
// 멤버변수 field
public String name = "아버지";
public String addr = "주소";
// 생성자 함수 constructor
public Father() {}
public Father(String name, String addr) {
this.name = name;
this.addr = addr;
} // end
// 멤버함수 method
public void disp() {
System.out.println(this.name);
System.out.println(this.addr);
} // disp() end
} // class end
class Son extends Father{
public Son() {}
public Son(String n, String a) {
super.name=n;
super.addr=a;
} // end
} // class end
class Daughter extends Father{
String friend="절친";
public Daughter() {}
public Daughter(String n, String a) {
super(n, a);
} // end
} // class end
1) 일반적인 방식으로 객체 생성하기
일반적인 방식으로 객체를 생성한다는 것은 new 연산자를 사용한다는 뜻이다.
이런 방식을 POJO(Plain Old Java Object) 방식이라 부른다.
Father fa = new Father();
fa.disp();
Son son = new Son("손흥민", "영국");
son.disp();
Daughter da = new Daughter("김연아", "한국");
da.disp();
2) 다형성을 이용해 객체 생성하기
다형성은 위에서 설명했듯 자식 클래스는 부모 클래스에 대입이 가능하다는 개념이다.
부모 클래스는 대입된 자식 클래스의 모양으로 스스로를 변환한다.
Father fa = new Son("개나리", "역삼동");
fa.disp();
fa = new Daughter("진달래", "서초동");
fa.disp();
System.out.println(fa.name);
System.out.println(fa.addr);
// 에러. 자식 클래스에서 추가된 멤버는 다형성의 대상이 아니다.
// System.out.println(fa.friend);
3) 부모 클래스를 자식 클래스에 대입하기
부모 클래스도 자식 클래스에 대입 가능하다. 단 자식 클래스의 모양으로 형변환 해야 한다.
Father father = new Father();
Son son = new Son();
father=son;
son=(Son)father; // Exception이 발생할 수도 있다
double a = 3.4;
int b = (int)a; // 강제 형변환
// 예)
Object obj = new Integer(5); // 다형성. 자식 클래스가 부모 클래스에 대입
System.out.println(obj);
Integer inte = (Integer)obj; // 다형성
// 부모 클래스도 자식 클래스에 대입가능하지만
// 자식 클래스의 모습으로 변환해야 한다
System.out.println(inte);
obj=new Father();
System.out.println(obj.toString());
'⁂ Java > : 기본 익히기' 카테고리의 다른 글
[JAVA] #8-4 인터페이스(Interface) (0) | 2022.09.15 |
---|---|
[JAVA] #8-3 추상(Abstract) (0) | 2022.09.15 |
[JAVA] #8-1 Super (0) | 2022.09.15 |
[JAVA] #7-3 Object와 toString() (0) | 2022.09.14 |
[JAVA] #7-2 Override (0) | 2022.09.14 |