개요
메소드에 전달되는 변수의 데이터 타입에 따라서 메소드 호출 방식이 달라집니다.
메소드를 호출하는 방식으로는 Call By Value와 Call By Reference 2가지가 있습니다.
Call by Value 란?
- 메소드에 값을 전달할 때, 변수의 값을 복사해서 메소드에 전달하는 방식
특징
- 저장소를 공유하지 않음
- 기본 자료형 (int, short, long, float, double, char, boolean)
- 값을 복사해서 전달했으므로 받은 인자의 값을 변경하더라도 변경되지 않음.
장점
- 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
단점
- 복사를 하기 때문에 메모리가 사용량이 늘어난다.
예시
class TestValue {
int x;
}
public class Test {
public static void main(String[] args) {
TestValue testValue = new TestValue();
testValue.x = 10;
// Call by Value
System.out.println("\n== Call by Value ==");
System.out.println("doService() 호출 전 - testValue.x = " + testValue.x);
doService(testValue.x);
System.out.println("doService() 호출 후 - testValue.x = " + testValue.x);
}
static void doService(int x) {
x = 1000;
}
static void doService(TestValue testValue) {
testValue.x =1000;
}
}
결과
Call by Reference 란?
- 메소드에 값을 전달할 때, 변수의 주소 값을 메소드에 전달하는 방식
특징
- 참조 자료형 (Array, Class Instance)
- 저장소 공유함
- 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다.
장점
- 복사하지 않고 직접 참조를 하기에 빠르다.
단점
- 직접 참조를 하기에 원래 값이 영향을 받는다.
예시
class TestValue {
int x;
}
public class Test {
public static void main(String[] args) {
TestValue testValue = new TestValue();
testValue.x = 10;
// Call by Reference
System.out.println("\n== Call by Reference ==");
System.out.println("doService() 호출 전 - testValue.x = " + testValue.x);
doService(testValue);
System.out.println("doService() 호출 후 - testValue.x = " + testValue.x);
}
static void doService(int x) {
x = 1000;
}
static void doService(TestValue testValue) {
testValue.x =1000;
}
}
결과
Call By Value vs Call By Reference 차이점
값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이
마무리
복습 전에는 그냥 이런 것들이 있구나 정도로 이해했는데, 공부해보니 꽤 중요한 개념인 거 같다고 생각이 들었습니다.
이전에는 단순히 call by reference 위주로 값을 저장해서 사용했는데, 과연 모든 상황에서 call by reference로 값을 처리하는 게 맞는 방식인가? 에 대해서 고민이 들면서 메모리에 대한 공부를 더 해야겠구나 라고 느꼈습니다.
부족하거나 틀린 부분이 있을 수도 있으니 주의하시면 좋을 거 같습니다.
이번 포스팅은 마무리하면서 다음 포스팅에서 뵙겠습니다.
참고
https://velog.io/@sixhustle/callbyvalue
https://velog.io/@jacob0122/call-by-value-call-by-reference
https://wayhome25.github.io/cs/2017/04/11/cs-13/
https://codingplus.tistory.com/29
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
추상 클래스(Abstract Class) 와 인터페이스(Interface) (0) | 2021.07.07 |
---|---|
오버 로딩(Overloading)과 오버 라이딩(Overriding) (0) | 2021.07.03 |
객체 지향 프로그래밍(OOP)란? (1) | 2021.06.22 |
GC(Garbage Collector) 란? (0) | 2021.06.19 |
JVM(Java Virtual Mahcine)이란? (0) | 2021.06.15 |