다양한 형태의 성질을 지님
- 상속+컴퓨터의 연산규칙(잩은 자료형끼리만 연산 가능) + 얕은복사
다향성 특징 <암기>
상속을 이용한 기술로 부모 클래스의 타입 참조변수 하나로 상속 관계에 있는 여러 타입의 자식 객체를 참조할 수 있는 기술
- 부모클래스 변수명 = new 자식클래스();
업 캐스팅(Up Casting)
상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가
모든 자식 타입 객체의 주소를 참조할 수 있음
Car car = new Sonata(); Car car2 = new Tesla();
다운 캐스팅
자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우,
부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형변환 하는 것
자동으로 처리되지 않기 때문에 반드시 자식 타입을 명시하여 형변환Car c = new Sonata(); ((Sonata)c).moveSonata();
Car c1 = new Car("경유엔진","경유",8); System.out.println(c1.getEngine());
//Car객체에 있는 getengine()메소드를 호출 ==바인딩 (맨날쓰고있었음)
//string edu.kh.poly.model.vo.Car.getEngine()
Car c2 = new Spark("경차 엔진","휘발유",4,0.5); System.out.println(c2.toString());
//String edu.kh.poly.model.vo.Car.toString()
- 참조변수 c2가 car타입이므로
toString()도 Car의 toString()을 호출 - 정적바인딩
실행해보면 자식 Spark의 toString이 호출되는것을 확인
-> 컴파일시에는 부모(Car)와 바인딩 == 정적바인딩
-> 실행시에는 자식(Spark)와 오버라이딩된 메소드와 바인딩 == 동적바인딩
동적 바인딩 활용방법
Car[] arr = { new Car("경유엔진", "경유", 12), new Tesla("전기모터", "전기",4,50000), new Spark("경차엔진", "무연", 4,0.3) }; for(int i = 0; i < arr.length; i++) { System.out.println(i+"번째 요소: "+ arr[i].toString());
- 실행전 : String edu.kh.poly.model.vo.Car.toString() - 정적 바인딩 상태
- 실행후:각 객체의 오버라이딩 된 toString()이 호출됨 - 동적바인딩
- 업캐스팅 상태의 참조변수를
별도의 다운캐스팅 없이
자식의 오버라이딩된 메소드를 수행할 수 있음.