본문 바로가기

JAVA의 정석

(객체part) 3. 참조형 매개변수와 참조형 반환타입

오늘은 메서드에 참조형 변수를  매개변수로 하는 예제와 참조형 변수를 반환하는 타입의 메서드를 포함한 예제를 만들어 볼 것이다.

 

1) 참조형 변수를 매개변수로 갖는 매서드

 

기본 변수와 달리 change메서드에서 매개변수가 참조형이라서 값이 아니라 '값이 저장된 주소'를 change메서드에게 넘겨주고 있다.

 

때문에 값을 읽어오는 것 뿐만 아니라 변경하는 것도 가능하다는 것을 볼 수 있다 .

 

즉, main 메서드의 참조변수 d와 change 메서드의 참조변수 d는 같은 객체를 가리키게 된다. 그래서 매개 변수 d로 x의 값을 읽는 것과

 

변경하는 것이 모두 가능한 것이다. 

 

 

2) 참조형 변수를 반환 타입으로 갖는 매서드

 

 

매개변수와 반환타입 둘 다 참조 변수인 위 예제를 보자.

 

copy라는 메서드에는 새로운 객체 tmp를 생성하였고, 매개 변수로 한 d의 주소를 받아 d.x의 값을 tmp.x의 값에 복사해주고 있다.

 

그 후 tmp 의 객체 주소를 d2라는 메인메서드의 참조 변수에 리턴 값으로 주었다.

 

하지만 객체 주소를 반환했음에도 불구하고 d.x는 정상적으로 복사가 되어 d2.x의 정상적으로 출력된 반면, 

 

d2.y의 값에는 정상적으로 출력되지 않고 있다. 이유가 무엇일까 ?

 

copy 메서드가 객체를 생성하고 해당 객체의 멤버 변수 x의 값을 복사한 후, 그 객체의 주소를 반환하였다.

 

따라서 copy 메서드가 반환하는 주소는 새로 생성한 객체의 주소이지. 인자로 받은 d의 객체 주소가 아니다. 

 

tmp라는 객체는 x의 값만 복사 되어있기 때문에, y의 값은 0 즉 해당 데이터 타입의 기본 초기 값으로 설정되어있기 때문에 0으로 출력된 

 

이다. 

 

만약 여기서 y의 값 또한 복사하고 싶다면 , tmp. y = d.y 식으로 복사할 수 있겠지만  다음과 같이 애초부터 tmp라는 객체의 주소를 인자

 

의 주소로 복사해주면 편리해진다.

 

 

 

 

굳이 메서드를 사용하지 않고 main 함수에서 d2 객체를 생성할 때 d를 사용하여 초기화 할 수 있었겠지만,

 

오늘의 주제가 참조변수를 반환타입으로 하는 메서드를 다루는 만큼 번거롭더라도 메서드를 사용했다는 점을 알아두자.

 

그리고 반환타입을 작성할 때는 참조형 변수 d가 아닌 Data5 즉, 클래스 이름을 주었다는 것을 유심히 보자.