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"); | |
| } | |
| } |
댓글 없음:
댓글 쓰기