2017년 6월 6일 화요일

다형성 ( polymorphism )


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");
}
}

댓글 없음:

댓글 쓰기

JavaScript_함수의 역할

◎ 자바스크립트 함수의 역할 ■ 자바스크립트 함수와 메서드는 전혀 다른 개념이다. - 자바스크립트 함수는 메서드 역할을 할 수 있지만, 객체지향 프로그래밍의 메서드는 자바스크립트의 함수 역할을 할 수 없다. - 메서드와는 다르게 ...