반응형

참조 변수의 형변환(1)

  • 사용할 수 있는 멤버의 갯수를 조절하는 것
  • 조상 자손 관계의 참조변수는 서로 형변환 가능

 

기본형의 형변환은, 3.6 을 int로 형변환 하면 3이 된다. 즉, 값이 바뀐다.

반면에, 참조변수 (주소값, 객체)를 형변환 해도 값은 하나도 바뀌지 않고, 멤버의 갯수만 달라진다.

참조 변수의 형 변환을 하면, 사용할 수 있는 멤버의 갯수를 조절하는 것이다. 그 외에는 아무것도 변하지 않는다.

"참조변수를 형변환 한다고해서 기본형의 형변환 처럼 값이 달라지는 것이 아니다." 라는점을 기억하자.

 

그리고, 참조 변수는 아무때나 형변환이 가능한 것이 아니고, 조상 자손 관계의 참조변수일때 서로 형변환이 가능하다.

 

예를 들어서 Car와 FireEngine, Ambluance클래스가 있다고 가정해보자.
Fire Engine과 Ambulance는 Car의 자손이다. 
그래서 조상 자손관계인 Car와 FireEgine끼리, 그리고 Car와 Ambulance끼리는 형변환이 된다.
FireEngine과 Ambulance끼리는 형변환이 불가하다.

 

 

위와 같은 Car클래스가 있고, Car클래스를 상속받은 FireEnginez클래스가 있을 때,
아래의 코드를 보자.

FireEngine객체를 만들고, FireEngine 참조변수 f로 가리킨다. 
이것을 그림으로 그려보면 이런식으로 그려질 것이다.

멤버는 총 5개다.

그리고 참조변수 car타입의 참조변수 c가 만들어지고, 앞서만든 FireType의 객체를 가리키는 주소를 저장한 f값을 c에 저장한다.
이 때, c도 FireEngine객체를 가리키게 되는데, 참조변수의 타입과 다루고자하는 객체의 타입이 불일치한다.
따라서 f가 가리키는 fireEngine객체의 주소를 c에 저장하기 위해서는 f값을 참조변수 c의 타입인 Car타입으로 형변환을 해줘야 한다.(Car와 FireEngine은 부모자식관계이기 때문에 무조건 형변환이 가능하다)
그리고, 앞서 말한 것 처럼, 대입 연산자의 좌측의 참조변수가 조상타입, 그리고 우측의 참조변수가 자손타입일 경우, 형변환이 생략 가능하다.

결국, 참조변수 f는 다루고자 하는 객체가 가진 모든 멤버(5개)를 사용할 수 있고,(f.color, f.door, f.drive(), f.stop(), f.water())
참조변수 c는 FireEngine의 부모인 Car클래스에서 상속된 멤버(4개)만 사용할 수 있다.(c.color, c.door, c.drive(), c.stop())

 

위의 코드에서 FireEngine f2 = (FireEngine)c; 코드를 실행하면, 
f2라는 참조변수를 통해 다시 같은 FireEngine객체의 모든멤버(5)를 사용할 수 있게된다. 

 

이렇게 조상 자손 관계의 참조변수의 형변환을 통해 사용할 수 있는 멤버의 갯수를 줄였다가 늘렸다가 하는 것이다.

 


 

참조변수의 형변환 - 예제

 

참조변수 car가 null이다.

FireEngine타입의 참조변수 fe에 FireEngine()객체가 만들어진다. 이객체의 주소가 fe에 저장된다.

참조변수 fe2를 만들고 null이다.

참조 변수 fe로 fe가 가리키는 객체 FireEngine에서 water()를 호출하는 것은 문제없다.

그다음, fe의 값을 car변수에 넣는다. 그러면 동일한 객체의 주소값이 저장된다. car도 객체 FireEngine을 가리킨다.

car에서 water()를 호출할 수 없다. 왜냐하면 참조변수 car는 Car타입인데, Car클래스에는 멤버에 water()가 없기 때문이다.

이번에는 다시 참조변수 car에 저장된 객체의 주소를 fe2에 저장한다.

fe2는 FireEngine타입이고, 가리키는 객체도 FireEngine타입으로 동일하기 때문에 객체의 모든 멤버를 사용할 수 있으므로, water()도 호출이 가능하다.

 

다룰 수 있는 멤버의 갯수가 줄어들 때는, 안전한 변환이다. 이때는 형변환이 생략가능하다.
다룰 수 있는 멤버의 갯수가 증가할 때는, 안전하지 않는 변환이다. 따라서 이때는 형변환이 생략불가하다.

 

꼭 기억하고 넘어 갈 것

- 실제 인스턴스의 멤버갯수를 확인하고, 해당 인스턴스를 다루려는 참조변수의 타입의 클래스 멤버가 인스턴스의 멤버갯수를 넘으면 안된다.

다형성

조상 타입의 참조변수로 자손의 객체를 다룰 수 있음

참조변수끼리 형변환도 가능

단, 자손 타입 참조변수로 조상 객체를 참조할 순 없음

형변환 할 때, 실제 객체가 어떤 타입인지가 중요

그리고 형변환이 되어도 실체 객체에는 아무 영향이 없고 다룰 수 있는 멤버의 갯수만 변경(=리모컨의 기능만 줄어듬)

 

클래스: 설계도

객체: 제품/실체

참조변수: 리모컨

반응형

'JAVA' 카테고리의 다른 글

매개변수 다형성  (0) 2022.04.04
instanceof 연산자  (0) 2022.04.03
다형성  (0) 2022.04.02
캡슐화  (0) 2022.04.01
접근 제어자  (0) 2022.04.01