method 값 / 참조/ 문자열. 호출 방법에 의한 차이.
오늘은 메서드 호출시 매개변수 값의 전달 방식에 대해 이야기 하려고 합니다.
이 것을 정리해 놓는 이유는 매개변수에 따라 전달방식의 차이가 존재하는데. 이 부분을 제대로 정리하지 않으면 나중에 코드가 제대로 동작하지 않는 기본적인 이유가 될 수 있다고 생각했기 때문입니다.
크게 3가지로 분류할 수 있는데요.
- 값에 의한 호출 => 값을 복사해서 전달
- 참조에 의한 호출 => 값의 주소값을 전달
- 문자열에 의한 호출
문자열 같은 경우에는 참조형이지만 자바에서는 기본형 값으로 존재하기 때문에 예외적으로 값에 의한 호출과 똑같은 동작을 하게 됩니다.
그럼 코드를 통해 보도록 하겠습니다.
값에 의한 호출
package methodTest;
public class CallTest {
//값에 의한 호출
public static int valTest(int num) {
return ++num;
}
public static void main(String[] args) {
int num = 1;
//값에 의한 호출
System.out.println("값에 의한 호출!");
System.out.println("호출 전 값 "+"num: "+num + ", result: "+result);
result = valTest(num);
System.out.println("호출 전 값 "+"num: "+num + ", result: "+result);
}
}
결과
값에 의한 호출은 값을 복사해서 전달하기 때문에 기존의 valTest 메소드에서 num 값을 수정해도 main에 있는 num 값에는 영향을 미칠 수 없습니다. 이것이 직관적으로 쉽게 알 수 있는 값에 의한 호출 방식입니다.
참조에의한 호출
public class CallTest {
//참조에 의한 호출
public static void refTest(int[] numArr) {
for(int i=0;i<numArr.length; i++) {
numArr[i]++;
}
//어떤 값도 리턴하지 않음
}
public static void main(String[] args) {
int[] numArr = {1,2,3};
//참조에 의한 호출
System.out.println("참조에의한 호출!");
System.out.println("참조 호출 전");
for(int i : numArr) {
System.out.print(i);
}
System.out.println();
System.out.println("참조 호출 후");
refTest(numArr);
for(int i:numArr) {
System.out.print(i);
}
System.out.println();
}
}
결과
refTest 메소드에서는 어떠한 값도 리턴하지 않지만 참조에 의한 호출은 주소값을 전달하기 때문에 main에 있는 numArr 배열에 직접 접근하여 값이 수정되었습니다. 그래서 매개변수를 참조형으로 전달할 경우 개발자의 의도와
상관없이 기존의 값이 변경되는 결과를 얻을 수 있기 때문에 주의해야 합니다.
문자열에 의한 호출
public class CallTest {
//문자열에 의한 호출
public static void strTest(String str) {
str = "문자열 변경!";
}
public static void main(String[] args) {
String str = "변경 전 문자열";
//문자열에 의한 호출
System.out.println("문자열에 의한 호출!");
System.out.println("문자열 호출 전: "+str);
strTest(str);
System.out.println("문자열 호출 후: "+str);
}
}
결과
문자열을 매개변수로 넘겨줄 경우 문자열은 기본적으로 참조형이지만 자바에서는 기본값으로도 취급하기 때문에 예외적으로 값에 의한 호출 방식으로 값이 메서드로 전달됩니다.
왜 참조에 의한 호출 방식이 있는가
값에 의한 호출 방식은 직관적이고 고려할 사항이 적기 때문에 사용이 편리합니다. 그렇다면 왜 참조에 의한 호출 방식도 채택하고 있는 걸까요? 그 이유는 값을 복사해 전달 한다는 것은 메모리에 또 다른 변수 공간을 생성한다는 것입니다. 지금처럼 코드가 단순하면 상관이 없을 수 있지만 코드량이 많아지면 값에 의한 호출을 할 때마다 매번 메모리 자원을 사용하는 것입니다. 참조에 의한 호출을 이용하면 메모리 자원을 절약하는 동시에 위치만 전달 하기 때문에 상대적으로 더 빠른 작업이 가능 한 것입니다.
긴글 읽어 주셔서 감사합니다. 오늘도 좋은하루 되세요.
'자바' 카테고리의 다른 글
자바. 접근지정자 종류와 정의 정리. (0) | 2020.12.23 |
---|---|
자바! 상속의 정의와 용법 정리! (0) | 2020.12.22 |
Switch문을 사용할 때 할 수 있는 실수! (0) | 2020.12.20 |
JAVA 다중 반복문 한번에 종료! Break Label (0) | 2020.12.20 |
java) 객체지향에 대하여. (0) | 2020.11.21 |