89 lines (77 sloc) 2.58 KB
package common.fundament.polymorphism; | |
/** | |
* 다형성 ( Polymorphism ) | |
* '여러가지 형태를 가질 수 있는 능력 ' | |
* | |
* 자바에서는 한 타이•‘ 참조변수로 여러타입의 객체를 참조할 수 있도록 함으로써 구현 | |
* 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록하였다. | |
* | |
* ex) TV 클래스를 상속받은 CaptionTV 클래스 | |
* TV t = new TV(); | |
* CaptionTV c = new CaptionTV(); | |
* => CaptionTV c = (TV) new CaptionTV | |
* 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조하는것이 가능 | |
* | |
* TV t = new CaptionTV(); | |
* 참조변수 타입에 따라 사용할 수 있는 멤버의 갯수가 달라진다. | |
* 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버갯수보다 같거나 적어야 함 | |
* | |
* ■ 참조변수의 형변환 | |
* 참조변수는 형변환 가능. 단, 서로 상속관계에 있는 클래스 사이에서만 가능함 | |
* 자손타입의 참조변수를 조상타입의 참조변수로, 조상타입의 참조변수를 자손타입의 참조변수로 형변환 가능 | |
* | |
* ■ 모든클래스의 조상인 Object 클래스 타입으로 형변환 가능 | |
* | |
* ■ 자손타입 -> 조상타입 ( up-casting ) 형변환 생략 가능. | |
* 조상타입 -> 자손타입 ( down-casting ) 형변환 생략 불가. | |
* | |
* ※ 형변환 (type casting)은 참조변수의 타입을 변환하는 것일 뿐 인스턴스를 변환하는 것이 아니다. | |
* 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. | |
* 단지, 참조변수의 형 변환에 대해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 | |
* 조절하는 것 뿐이다. | |
* | |
* */ | |
public class CastingTest { | |
public static void main(String[] args){ | |
/* | |
* Car type의 참조변수 car를 선언, null로 초기화 | |
* */ | |
Car car = null; | |
/* | |
* FireEngine의 인스턴스를 생성하고 FireEngine타입의 참조변수가 참조하도록 한다. | |
* */ | |
FireEngine fe = new FireEngine(); | |
FireEngine fe2 = null; | |
fe.water(); | |
/* | |
* 참조변수 fe가 참조하고 있는 인스턴스를 참조변수 car가 참조하도록 한다. | |
* fe의 값(fe가 참조하고 있는 인스턴스의 주소)이 car에 저장된다. | |
* 이때 두 참조변수의 타입이 다르므로 참조변수 fe가 형 변환 되어야 하지만 생략되었다. | |
* */ | |
car = fe; | |
// car.water(); // 컴파일 에러 car type의 참조변수로는 water()를 참조할 수 없다. | |
/* | |
* 참조변수 car가 참조하고있는 인스턴스를 참조변수 fe2가 참조하도록 한다. | |
* 이때 두 참조변수의 타입이 다르므로 참조변수 car를 형변환 하였다. | |
* car에는 FireEngine 인스턴스 주소가 저장되어 있으므로 fe2 에도 FireEngine인스턴스의 | |
* 주소가 저장되었다. | |
* */ | |
fe2 = (FireEngine) car; | |
fe2.water(); | |
} | |
} | |
class Car{ | |
String color; | |
int door; | |
void drive(){ | |
System.out.println("drive"); | |
} | |
void step(){ | |
System.out.println("Stop"); | |
} | |
} | |
class FireEngine extends Car{ | |
void water(){ | |
System.out.println("water!!"); | |
} | |
} |
63 lines (55 sloc) 1.97 KB
package common.fundament.polymorphism; | |
/** | |
* ■ 참조변수와 인스턴스의 연결 | |
* 조상클래스에 선언된 멤버변수와 같은 이름의 인스턴스 변수를 자손클래스에 중복으로 정의 했을 때, | |
* 조상타입으 참조변수로 자손 인스턴스를 참조하는 경우와 자손타입의 참조변수로 자손 인스턴스를 | |
* 참조하는 경우는 서로 다른 결과를 얻는다. | |
* | |
* 메소드의 경우 조상클래스의 메소드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 | |
* 타입에 관계없이 항상 실제 인스턴스의 메서드(오버라이딩된 메서드)가 호출되지만, | |
* 멤버변수의 경우 참조변수의 타입에 따라 달라진다. | |
* | |
* ※ static메서드는 static변수처럼 참조변수의 타입에 영향을 받는다. | |
* 참조변수의 타입에 형향을 받지 않는 것은 인스턴스메서드 뿐이다. | |
* 그래서 static메서드는 반드시 참조변수가 아닌 '클래스이름.메서드()'로 호출해야 한다. | |
* | |
* 멤버변수가 조상클래스와 자손클래스에 중복으로 정의된 경우, 조상타입의 참조변수를 사용했을 때 | |
* 조상클래스에 선언된 멤버변수가 사용되고, 자손타입의 참조변수를 사용했을 때는 자손클래스에 | |
* 선언된 멤버변수가 사용된다. | |
* 하지만 중복 정의되지 않은경우, 조상타입의 참조변수를 사용했을 때와 자손타입의 참조변수를 | |
* 사용했을 때의 차이는 없다. 중복된 경우는 참조변수의 타입에 따라 달라지지만, 중복되지 않은경우 | |
* 하나뿐이므로 선택의 여지가 없기 때문이다. | |
* | |
* */ | |
public class BindingTest { | |
public static void main(String[] args){ | |
/* | |
* 타입은 다르지만, 참조변수 p와 c모두 Child인스턴스를 참조하고 있다.*/ | |
Parent p = new Child(); | |
Child c = new Child(); | |
System.out.println("p.x = " + p.x); | |
p.method(); | |
System.out.println("c.x = " + c.x); | |
c.method(); | |
/* | |
* [ 실행결과 ] | |
* p.x = 100 | |
* Child Method | |
* c.x = 200 | |
* Child Method | |
* */ | |
} | |
} | |
/* Parent클래스와 Child클래스는 서로 같은 멤버들을 정의하고 있다. */ | |
class Parent{ | |
int x = 100; | |
void method(){ | |
System.out.println("Parent Method"); | |
} | |
} | |
class Child extends Parent{ | |
int x = 200; | |
void method(){ | |
System.out.println("Child Method"); | |
} | |
} |
댓글 없음:
댓글 쓰기