상세 컨텐츠

본문 제목

자바의 참조형(레퍼런스)의 형변환에 도전하기!!! (업캐스팅/다운캐스팅)(Up Casting/Down Casting)

java_자바

by 쫑메이 2020. 6. 16. 00:21

본문

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

참조형(레퍼런스)의 형변환

(업캐스팅/다운캐스팅)

(Up Casting)/(Down Casting)

 

 

 

 

 

 

 


 

참조형의 형변화 _업캐스팅(Up Casting)

 


 

 

1. 업캐스팅(Up Casting)

- 슈퍼클래스 타입 레퍼런스로 서브클래스의 인스턴스를 참조하는 것

 

= 서브클래스의 인스턴스를 슈퍼클래스 타입으로 변환하는 것

 

- 컴파일러에 의해 자동 형변환 일어남(= 묵시적 형변환)

 

- 참조 가능한 영역이 축소됨

 

- 서브클래스 인스턴스의 멤버 중 공통 항목을 제외한 나머지에 대한 포기 선언을 하는 것

=> 대신, 하나의 슈퍼클래스 타입으로 여러 서브클래스 인스턴스를 참조할 수 있다!

 

 

 

 


 

업캐스팅(Up Casting)은 마치 자동형변환같은 것이다

 

Parent p=new Child();

부모가 알고있는 것만 쓸 수 있기 때문에 참조 가능한 영역이 축소된다

 

즉, 서브 클래스 타입으로 서브 클래스 인스턴스를 참조하게 되면

참조 영역에 축소로 인해 서브클래스의 메서드가 보이지 않게 된다

 

 

 

 

 

 

 

 

 

 

 

 

 

참조형의 형변화 _다운캐스팅(Down Casting)


 

 

 

2. 다운캐스팅(Down Casting)

 

- 서브클래스 타입 레퍼런스로 슈퍼클래스의 인스턴스를 참조하는 것

 

=> 슈퍼클래스의 인스턴스를 서브클래스 타입으로 변환하는 것

 

 

- 컴파일러에 의해 자동 형변환이 일어나지 않음

=>강제 형변환(명시적 형변환) 필수

 

 

 

- 참조 가능한 영역이 확대됨

=> 존재하지 않는 영역에 대한 참조 위험성 때문에

 

명시적 형변환 후에도 오류가 발생할 수 있다!

 

 

 

 


 

 

 

다운캐스팅(Down Casting)은 자바에서는 허용이 안되는데

딱 한 가지 경우만 가능하다!!!!!

 

 

 

이전에 이미 업캐스팅(Up Casting)된 인스턴스를

다시 다운캐스팅(Down Casting)하는 경우에만 안전하다!!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

레퍼런스 형변환(참조형변환)이 왜 좋은가?


 

 

 

코드가 굉장히 간략함. 코드가 줄어든다

 

 

 

아래 예제 코드를 보자!!!!

 

 

 

 

 

 

 

<아래 코드를 살펴보면 >

1. 먼저 도형 클래스, 도형을 그린다.

 

2. 원, 사각형, 삼각형 도형을 그리기 위해

각 도형 클래스의 인스턴스 생성 후 레퍼런스 변수명. draw( ) 메서드 호출

 

 

 

 

 

 

 

 

업캐스팅(Up Casting)후에는 상속된 메서드만 호출 가능하며

 

Circle 클래스 내에서 draw() 메서드를 상속받아 오버라이딩했으므로

 

Shape 타입 레퍼런스 변수로 draw() 메서드 호출이 가능하다!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

코드가 굉장히 간략함. 코드가 줄어든다

 

 

 

 

 

 

 

 

 

 

 

 

배열을 사용하여 업캐스팅(Up Casting)활용하는 방법


 

먼저, 3개의 인스턴스를 하나의 Shape 타입 배열에 저장

2가지 방식 모두 가능!!

 

1. Shape[ ] sArr = {c, r, t};

2. Shape[ ] sArr = {new Circle( ), new Rectangle( ), new Triangle( )};

 

 

 

 

 

 

for 문을사용하여 Shape[] 타입 배열 sArr의 모든 요소에 접근하여

draw() 메서드 호출

 

1. 일반 for 문

for(int i = 0; i < sArr.length; i++) {

sArr[i].draw();

}

 

 

 

2. 향상된 for 문 사용

for(Shape shape : sArr) {

shape.draw();

}

 

 

 

 

 

 

 

 

메서드 파라미터에 대한 업캐스팅(Up Casting)


 

 

 

세 인스턴스의 슈퍼클래스 타입인 Shape 타입 변수를 파라미터 변수로 선언 필요!

 

Shape s2;

s2 = c;

s2.draw();

 

s2 = r;

s2.draw();

 

s2 = t;

s2.draw();

 

 

 

 

 

 

 

 

 

정리하자면....


 

 

 

- 오브젝트까지 업캐스팅할 수 있다!!

- 업다운 캐스팅(Up Castin/ Down Casting)은 무조건 상속관계여야 한다

- Object의 배열을 만들게 되면 어떤 타입의 객체라도 다 저장할 수 있다

- 다형성 때문에 자바의 자료구조가 간단하게 만든다

 

 

 

 

 

 

 

 

 

instanceof 연산자란?

 


 

 

 

어떤 객체에 대한 is –a 관계를 판별하는 연산자

 

 

기본문법은?

if(판별할 객체의 레퍼런스 변수 instanceof 클래스명){ }

 

 

 

 

 

 

 

instanceof 연산자는 왜 필요한가?

- 주로 if문을 사용하여 형변환이 가능한지를 판별하는 용도로 사용

- 연산자 좌변에는 판별이 필요한 객체의 레퍼런스 변수를 지정하고

- 연산자 우변에는 is – a 관계 판별에 사용될 클래스명을 지정한다

- 즉, 좌변의 객체가 우변의 클래스 타입으로 형변환이 가능한지 판별

- A is a B에 대한 판별 문법=> A instanceof B

 

 

 

 

 

 

 

 

 

주의사항!!

instanceof 연산 결과가 true 이면 형변환이 가능한데

주의사항은

업캐스팅(Up Casting)/ 다운캐스팅 중에 어느 쪽인지 확인해봐야 한다

 

instanceof 연산 결과가 false 이면 어떤 방법으로든 형변환 불가능하다

 

 

 

 

 

 

 

 

업캐스팅(Up Casting), 다운캐스팅 <예>


 

 

 

HandPhone hp = sp;

( sp -> HandPhone 업캐스팅)

업캐스팅(Up Casting)후에는 공통 멤버만 접근 가능하다

 

그래서 스마트폰의 멤버에는 접근이 불가능하다!!!!

 

 

 

 

 

 

 

 

if 결과 true, 다운캐스팅(Down Casting)을 했다.

 

오류 뜬다!!!

업캐스팅 후(Up Casting)

다시 다운캐스팅(Down Casting)을 하는 경우에만 안전한다

 

 

 

 

 

 

 

 


 

 

 

 

ㅣ읽느라 수고 많으셨어요~ㅣ

 


 

 

 


 

 

 

 

 

부족한 글을 읽어주셔서 감사드립니다

아직 부족한 게 많으니

틀린 곳이 있다면

조언의 말씀 꼭 부탁드립니다!!!!


 

 

 

반응형

관련글 더보기