728x90
반응형
메서드를 호출할 때 파라미터를 전달하는 두 가지 방법
Call By Value
- 메서드를 호출할 때 값을 넘겨줌
- Pass By Value
- 메서드를 호출하는 호출자의 변수와 호출 당하는 수신자의 파라미터는 복사된 서로 다른 변수
- 값만 전달하기 때문에 수신자의 파라미터를 수정해도 호출자의 변수에는 아무런 영향이 없음
Call By Reference
- 메서드를 호출할 때 참조(주소)를 직접 전달
- Pass By Reference
- 참조를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 완전히 동일한 변수
- 메서드 내에서 파라미터를 수정하면 그대로 원본 변수에도 반영됨
Java 에서의 파라미터 전달 방법
- Java는 Call By Value로만 동작함
JVM 메모리에 변수가 저장되는 위치
- Java 에서는 변수를 선언하면 Stack 영역에 할당됨
- 원시 타입(Primitive Type)은 Stack, 참조 타입(Reference Type)은 Heap 영역에 저장되고, Stack 영역에 있는 변수가 객체의 주소값을 가지고 있음
원시타입 전달
public class PrimitiveTypeTest {
void test() {
int a = 1;
int b = 2;
// Before
assertEquals(a,1);
assertEquals(b,2);
modify(a,b);
// After
assertEquals(a, 1);
assertEquals(b, 2);
}
void modify(int a, int b) {
a = 5;
b = 10;
}
}
- modify(a,b)를 호출하는 순간 Stack 영역에 새로운 변수 a,b가 새로 생성되어 4개의 변수가 저장됨
- modify함수의 Stack 영역에서 a,b를 수정해봤자 원본 test함수의 변수에는 영향이 없음
참조 타입 전달
- 변수 자체는 Stack 영역에 생성되지만 실제 객체는 Heap 영역에 위치
- Stack에 있는 변수가 Heap 에 있는 객체를 바라보고 있는 형태
class User {
public int age;
public User(int age) {
this.age = age;
}
}
public class ReferenceTypeTest {
void test(){
User a = new User(10);
User b = new User(20);
// Before
assertEquals(a.age, 10);
assertEquals(b.age, 20);
modify(a,b);
// After
assertEquals(a.age, 11);
assertEquals(b.age, 20);
}
void modify(User a, User b) {
a.age++;
b = new User(30);
b.age++;
}
}
- a.age의 값이 변경되었기 때문에 Call By Reference로 파라미터를 넘겨주었다고 착각하기 쉬움
- 하지만 Reference 자체를 전달하는 게 아니라 주소값만 전달해주고 modify() 영역에서 생긴 변수들이 주소값을 보고 객체를 같이 참조하고 있는것임
- 따라서 b에 새로운 User를 할당하더라도 원본 b에는 영향이 없음
728x90
반응형
'Common Sense' 카테고리의 다른 글
인증과 인가 (0) | 2024.06.11 |
---|