본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-02-19 자바공부 (상속2 오버라이딩 ,instanceof)

반응형

상속을 위한 기본 조건 

 

is - A 관계 성립 

has - A 관계도 상속으로 표현 가능, 하지만 Composition(복합관계) 위지하는것이 적절 !

 

무슨 말인가 싶은데

비유를 들자면 전화기를 상속 받아 스마트폰이 나온것이 

is - A 관계 이다 .

즉 스마트폰은 (일종의)전화기이다!!! 만약 반대로 하게 된면?

전화기는 (일종의) 스마트폰이다. 이건 말이 될까? 잘 생각해보자 모든 전화기가 스마트폰일수는 없다 

전화기의 모든 종류가 스마트폰은 아니기 때문에 이러한 관계를 제대로 표현한게 is- A 관계라고 보면 된다 

 

IS-A 관계 이해

 

has-A 관계는 건물에 출입하는 출입증 생각을 하면된다 

A라는 건물에 출입할려면 건물에 들어오면서 출입증을 찍고 들어올수 있는데 

출입증은 건물에 다니는 회사원들에게만 주어진다 

이런형식이 has-A 관계이다 하지만 has-A관계는 강한 연결고리를 형성하여 상속이 걸리면 무조건 가져온다 

예를 들면 회사원이 오늘 출입증을 못가져오거나 잠시방문한 사람들 이란 다양한 표현을 못하기 때문에 

나온게  복합관계이다

 

HAS-A 관계

 

Composition(복합관계) 

특별한 상황에 사용할 수있다 조건을 주어서 대상이 소유하던 대상이 소유하지않을 수도 있고,

소유의 대상을 늘리는것도 상속보다 간단하기때문에 사용한다.

 

복합관계 

 

 

메소드오버라이딩 ( 부모클래스 메소드 무시하기 ) 

부모클래스에 정의된 똑같은 메소드를 하위클래스에 다시 정의 하는것 

 

 

부모와 자식 간에 같은 이름의 메소드가 있을수 있다 (메소드 오버로딩 아님!!! 매개변수 등 모든게 똑같음 ) 

이렇게 상속되면 이름이 같은 메소드는 부모의 메소드를 무시하고 자식메소드가 실행 된다 라고 알고 있자! 

 

그리고 이렇게도 자식도 부모의 인스턴스이므로 성립은 한다  

하지만 여기서 bs가 참조하는것은 부모의 인스턴스로인식 자식에  접근불가

 

 

(기억상실걸렸다 생각하자 당장은 기억못해 하지만 기억 할 수있는 방법이 2가지 있다 뒤에 나옴 ) 

 

Speaker(부모) bs(참조변수) = new BaseEnSpeaker(자식) (); 

이렇게 담을수는 있지만 이렇게 실행되면서 BaseEnSpeaker(자식) 의 기억은 없어지고 Speaker(부모)의 기억만 남는다 

그래서 위 사진에서보이듯 bs.setVolume 은 부모의 것이라 사용가능 하지만 bs.setBaseRate 는 자식의 것이라 모른다 

 

고로 원래 BaseEnSpeaker 였는데 기억상실 걸려서 Speaker로 살고 있는거야 BaseEnSpeaker일때의 일을 할수가 없다.

 

 

다운캐스팅 업캐스팅  

 

업캐스팅 : 자식클래스 객체를 부모클래스 객체로 형 변환 하는 것  

업캐스팅 자동 타입 변환 Person person = new student(); 

아래와 같이 명시적으로 타입 캐스팅 선언을 하지 않아도 된다.

Person person = (Person) student;

 

다운캐스팅 : 부모클래스 객체를 자식클래스 객체로 형 변환 하는 것

(부모입장에서는 자식이 여러명있을수 있으니 자식의 이름을 명시해줘야 한다 

Student student = (Student) person;

일반 변수형 형변환이랑 똑같다구 생각하면 이해가 쉽다 예)  int i = (int)long  

 

 

그럼 이거 왜 하는거야~!?  아래그림을 보면 이해가 쉽다 

 

 

 

f 라는 메소드를 만들때 업캐스팅을 하지 않는다면 여러개의 오버로딩을 만들어야 한다 

p는 펄슨 , 스튜던트, 플레이서, 프로페셜 모든게 다 될수 있다 !!  

하지만 업캐스팅하게 되면 간단하게 코드를 구성할수 있다!

 

 

하지만 이렇게 했을때에는 p가 가르치는 객체가 뭔지 어떻게 알까? 

 

instanceof 키워드를 사용하여 알수있다 

[비교 대상 객체] instanceof [데이터명 , 클래스 이름];

 

 

단 너무 많이 instanceof를 너무 많이 사용하지말라고 권장한다 

객체와 클래스를 비교하는 연산자이다.!  

코드를 보고 한번더 이해하도록 하자 

 

package instance_of;
//------------------------- 메인 클래스 
public class instanceOf_Ex {

	public static void main(String[] args) {
		//부모클래스에 자식을 업캐스팅 
		Parent parentA = new Child(); 
		method(parentA);
		parentA = new Parent();
		method(parentA);
		/* 예외 발생 부모를 형변환 하여 자식이 될수 없다 
		 * parentA = new Parent(); method2(parentA);
		 */ 
	}

	public static void method(Parent p ) {
		//instanceof 이걸 사용 해서 뭔지 알아보면서 동시에 형변환까지 하는거야 
		if(p instanceof Child) {
			//여기서 형변환 했엉 
			Child child = (Child)p;
			System.out.println("Child 변환 성공 ");
		}else {
			System.out.println("Child 변환 안됭~! ");
		}
		
	}	
	//이건 일부러 확인하기 위함 부모를 자식으로 형변환 가능한지 보는 메소드 
	public static void method2(Parent p ) {
			Child c = (Child)p;
			System.out.println("호롤롤로");
		}
	
	
}


package instance_of;
// ------------------------- 부모 클래스 
public class Parent {

}


package instance_of;
//------------------------- 자식 클래스 
public class Child extends Parent {

}

 

 

결과값

 

일단 이정도로 이해하고 다음강의에 직접 코드로 사용해는 예를 보면서 이해하면 된다 

 

 

반응형