coyojo10의 개발블로그!
[자바] 다형성 정리! 본문
다형성이란 ?
=> 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
예를 들면
1) class TV (부모 : 멤버변수 5개)
2) class SmartTV(자식 : 멤버변수 총 7개 (조상+2개) 객체일때
TV t = new SmartTV(); // 이렇게 객체를 생성
부모 클래스 참조 변수 t로 자손 클래스인 SmartTV 객체를 다루는 것을 다형성이라 한다!
원래는 TV t = new TV(); 이렇게 타입을 일치시켜야 하는데 타입이 불일치해도 접근할 수 있는 것이 다형성!!
but , 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.
(ex smartTV리모컨에는 기능은 7개 있는데 tv에는 5개 기능뿐 smartTV에 있는 기능이 없으므로
없는 기능을 호출해서 에러 발생)
반대로 조상타입의 참조변수는 자손 타입의 객체를 가리킬 수 있다.
(ex 조상 타입의 tv리모컨에는 5개 기능이 있고, smartTV에는 5개 포함하고 플러스로 2개 더 있는 것이므로
있는 기능을 안쓰는 것은 ok! 즉 있는 기능을 안쓰는 건 OK!)
즉 쓸수있는 기능보다 객체에 있는 기능이 더 적으면 에러발생!!! 없는 기능을 호출할 수 있는 가능성이 있으므로
반대로 실제로 쓸수있는 기능보다 객체에 더 많이 존재하는 것은 괜찮다!!
<< 참조변수의 형변환 >>
==> 사용할 수 있는 멤버의 갯수를 조절하는 것 !
==> 조상, 자손 관계의 참조변수는 서로 형변환 가능!! (형제 관계는 NO!)
ex)
class Phone{}
class Galaxy extends Phone{ } // Galaxy는 Phone를 상속받는 자손 class
class Iphone extends Phone { } // Iphone는 Phone를 상속받는 자손 class
class Phone { // 멤버변수 4개
String color;
int price;
void call( ) {
System.out.println("전화걸기~");
}
void message( ) {
System.out.println("메세지전송~");
}
} //phone 클래스 블럭 끝 !
Class Galaxy extends Phone { // 멤버변수 5개 ( 조상4개 + 자손 본인것 1개)
void music(){
System.out.println("음악재생")
}
================================================
public static void main (String[]args){
Galaxy g = new Galaxy();
Phone p = (Phone) g // 자손인 g 객체를 조상인 p에 대입하는데 조상인 Phone타입으로 형변환!!(생략가능) // 그러면 조상인 phone의 기능만 사용가능!
Galaxy g2 = (Galaxy)p; // 조상인 p객체를 자손이 Galaxy 타입으로 형변환(생략불가) ==> 자손으로 형변환 했으므로 자손의 기능을 쓸 수 있다!!
Apple a = (Apple) b ; // 에러!! 상속관계가 아닌 클래스 간의 형변환 불가!!!
}
***************[[ 예제!!!! ]] ****************************
public static void main(String args[]) {
Phone phone = null;
Galaxy g = new Galaxy();
Galaxy g2 = null;
g.music(); // 실행 가능!!
phone = g; // 조상인 phone객체에 자손인 g 객체를 대입! 형변환 생략됨!!
phone.music(); ? // 에러발생!! why? 리모컨 역할인 참조변수가 조상꺼여서 조상 기능만 쓸 수 있으므로 phone클래스에는 music 메소드를 쓸 수 없다!!
g2 = (Galaxy)phone; // 조상인 phone객체를 Galaxy로 형변환해서 g2객체에 대입
g2.music(); // 실행가능!!! 리모컨이 자손이므로 자손에 있는 music 메소드 사용가능!!
} // 메인블럭 끝!
**************************예제2*************************************
public class polymorphism {
public static void main(String[] args) {
Phone phone = null;
//phone객체에 null로 초기화
Galaxy g = new Galaxy();
// galaxy 객체를 생성
Galaxy g2 = null;
// null으로 초기화한 galaxy 객체 g2를 생성
g.music(); // 실행 가능!!
phone = g; // null로 초기화 했던 조상인 phone객체에 자손인 g 객체를 대입! 형변환 생략됨!!
//phone.music();
//==> 에러발생!! why? 리모컨 역할을 하는 참조변수가 조상꺼여서 조상 기능만 쓸 수 있으므로 phone클래스에는 music 메소드를 쓸 수 없다!!컴파일부터 불가!!
g2 = (Galaxy)phone;
//null값이였던 g2에 조상인 phone객객체를 Galaxy로 형변환해서 g2객체에 대입
g2.music();
System.out.println("****************************");
Phone p2 = new Phone();
// 참조변수 p2인 phone객체 생성
Galaxy g3 = (Galaxy)p2;
// 형변환 실행 에러! /Exception in thread "main" java.lang.ClassCastException:
// g3는 초기화를 null로 해주지 않아서 galaxy 객체를 참조하고 있는데 p2를 대입하니 실행 에러 발생!!
// (Galaxy)로 형변환을 하고 있어서 컴파일은 오류로 인식하지 않으나 실제 참조하는 instance가 p2 이므로 실행시 에러가 발생하는 것
g3.music();
// 컴파일은 ok! (컴파일러는 형변환만 써주면 속는다!) 그러나 실제 참조하는 객체가 부모인 phone 객체 p2이므로 music메소드를 실행할 수 없다!!
}
'백엔드' 카테고리의 다른 글
Servlet 정리 2 (0) | 2022.11.30 |
---|---|
Servlet 정리 (0) | 2022.11.29 |
JDBC - Connection 관리를 위한 클래스 작성 실습 (0) | 2022.11.29 |
JDBC 오라클 1 -오라클 드라이버 로딩하고 커넥션 설정 (0) | 2022.11.25 |
배열의 선언 ,생성, 초기화 (0) | 2022.11.01 |