Java

[JAVA] 메소드 파라미터 타입별 Call by Value, Call by Reference

담다디다 2021. 2. 28. 20:26

최근 프로그래머스 알고리즘 공부를 하던 중 예상치 못한 논리오류를 겪으며 원인을 찾아 헤맸는데

알고보니 메소드 호출 시 파라미터의 데이터 타입에 따라

Call by Reference가 발생하는 경우를 생각하지 못했기 때문이었다.

따라서 이런저런 테스트를 통해 배운 내용을 정리하고자 한다.

 

 

 

 


 

 

 

 

 

Java의 데이터 타입에는 기본형, 참조형으로 크게 2가지가 있다.

 

 

기본형 타입 (Primitive Type)

Boolean   Byte   Short   Int   Long   float   Double   Char

 

 

 

 

 

이렇게 총 8가지의 데이터 타입이 기본형이다.

 

이 데이터 타입은 스택(Stack) 메모리에 실제 데이터를 저장하며

메소드의 파라미터로 전달할 경우 Call by Value 형식으로 전달된다.

따라서 메소드에서 데이터를 변경하더라도 원본 데이터는 영향을 받지 않는다.

 

 

 

 



 

 

위를 실행시킨 결과

 

 

 


 

 

 

 

 

 

참조형 타입(Reference Type)

배열(Array), 열거(Enumeration), 클래스(Class), 인터페이스(Interface)

 

 

 

 

 

해당 데이터 타입은 Heap 영역에 선언된 인스턴스( ex) Test t; )가 저장되고

해당 인스턴스의 메소드 등에 접근하기 위해 저장된 스택 메모리의 참조값이 할당된다.

 

 

 

참고로 참조형 타입의 경우 == 연산자를 사용하면 참조값을 비교하게 되기 때문에
Array의 equal()과 같은 비교 메소드를 호출해주어야 한다.

 

 

 

따라서 메소드의 파라미터로 참조형 타입을 전달하면 참조값을 전달하기 때문에 ( Call by reference )

메소드 내에서 변경 시 원본 값이 변경된다.

 

배열, ArrayList, LinkedList 등을 메소드로 전달해 사용할 때는 새 인스턴스에 복사하여 사용하는 것이 좋다.

 

 

 

 

 


 

 

 


 

위를 실행시킨 결과

 

 

 


 

혹시 내용에 오류가 있다면 지적 부탁드립니다:)

반응형