4/22

전자인간·2022년 4월 22일
post-thumbnail

인터페이스로 상속과 관계없이 묶어버릴때 쓸 수 있음.

타입캐스팅시 무조건 체크 ㄱ.

상속과 관계없이 이쪽틀 저쪽틀 전부 아우를 수 있는 틀을 만들고 싶으면 인터페이스로 하나의 틀안에 Branch를 내리고 싶으면 상속을 하는것이 좋을듯.
상속받거나 임플먼트를 당한 클래스들은 상위 기능들을 모두 쓸 수 있지만, 반대로 상속받은(자식) 클래스들의 기능을 상속해준 클래스(부모)가 가져다 쓰려면 공통된 부분밖에 못쓴다는 것.
이 단원에서 중요한 것은 추상(abstract)으로 정의된 클래스의 형태로 인스턴스를 생성할 수 없다는 생각은 틀린것이라는걸 알려주었다.
추상형태의 클라스 Y()를 Y y = new Y() 같은형태는 안되지만, 틀만 가져와서 실제클라스 A(abstract가 없는)의
// 다만, 서로 상속관계일 때만 가능하다.

[Instance of]

형식 : [선언된value] instanceof [확인할 타입]

ex 1)
A1 a = new A1; 의 경우 if(a instanceof A) 를 통과할까?

통과한다.
A1은 A의 메소드와 형식을 상속받아서 모두
포함하고 있기 때문이다.

ex 2)
Y y = new Y;의 경우 if(y instance A)를 통과할까?

통과하지 못한다.
Y는 A의 부모클래스 이기 때문에 A의 형식을
모두 포함하지 않기 때문이다.

ex 3)
Y y = new A1;의 경우 if(y instance A)를 통과할까?

통과하지 못한다.
비록 A1이 A의 자식클래스여서 모든 형식을 포함하지만,
선언한 값이 Y가 되면서 사실상 Y값으로 캐스팅

	   A a = new A();
       B b = new B();
	   A1 a1  = new A1();	 
       A a_up = new A1();   //선언하자마자 업캐스팅

       A a1_up = (A)a1; //업캐스팅(멤버수가 많은 형식에서 적은 형식으로 캐스팅)
	   
       A1 a1_up_down = (A1)a1_up;// 업캐스팅한걸 다운캐스팅
       // A1 a1 = (A1)a; //다운캐스팅(멤버수가 적은형식에서 많은형식으로 캐스팅)



       if(a1 instanceof A1){
           System.out.println("통과");
       };

case 1. if(a instanceof A1) -> 결과값없음
case 2. if(a1 instaceof A1) -> "통과" 출력
case 3. if(a1_up instanceof A1) -> "통과" 출력
case 4. if(a1_up_down instanceof A1) -> "통과" 출력
case 5. if(a_up instanceof A1) -> "통과" 출력
case4는 업캐스팅하고 다운캐스팅해서 된다고 쳐도 case 3,5는 A형식인데 왜 통과할까? A1형태에서 업캐스팅한 형태라서 캐스팅하기 전의 값들을 참조하고 있기 때문에 될 수도 있다고 생각하지만, 그래도 업캐스팅을 해서 형식은 부모클래스 형식을 띄고 있는데 자식형식의 instanceof를 통과하는 case 3,5번같이 이유를 모르겠음.

cf 1) 위에 주석처리딘 A1 a1 = (A1)a; 같이 처음부터 다운캐스팅 하는 경우에는 instanceof를 하지 않고 선언만 해도 오류가 나온다. 이 경우 형식은 맞기에 컴파일 오류는 안생겨도 런타임 에러가 생긴다.
-> 업캐스팅 다운캐스팅 설명 잘나오는 곳 :https://madplay.github.io/post/java-upcasting-and-downcasting

0개의 댓글