일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- CAS
- Locking Read
- 가비지 컬렉터
- db
- foreach
- iterator
- iterable
- text
- 가비지 컬렉션
- gc
- Synchronized
- 데이터 타입
- 자바
- Varchar
- MySQL
- 스프링
- 동시성 문제
- java
- jpa
- Di
- MVCC
- 동시성
- 백엔드
- Atomic Type
- Lock
- reflection
Archives
- Today
- Total
과정을 즐기자
Call by Value, Call by Reference 본문
Call by Value
Call by value는 값에 의한 호출이다. 다르게 표현하면 값만 전달한다고 할 수 있다.
따라서 call by value 방식으로 값을 전달받고 수정을 해도 원본 값은 바뀌지 않는다.
값을 전달받으면 스택에 메모리가 할당된다. 서로 같은 메모리가 아님!
class CallByValue {
@Test
void test() {
int a = 0; -- (1)
int b = 0; -- (1)
assertEquals(a, 0);
assertEquals(b, 0);
addTest(a, b);
assertEquals(a, 0);
assertEquals(b, 0);
}
void addTest(int a, int b) {
a += 10;
b += 10;
System.out.println(a); // 여기선 a == 10
System.out.println(b); // 여기선 b == 10
}
}
위의 테스트가 성공하였다. addTest를 하여도 a, b의 값이 각각 10으로 바뀌지 않은 이유는 주소 값을 전달 받은 것이 아니라
별도의 메모리 공간에 그 값 자체를 복사한 것이기 때문이다. 따라서 (1)의 a,b 와 addTest(a, b)의 a, b는 각각 다른 메모리에 있는 다른 값이다.
Call by Reference
call by reference는 참조에 의한 호출이다. 값을 수정할 때 그 주소 값에서 원본 값을 바꾼다.
위와 같은 경우 call by reference 인 것 같지만 call by value이다.
왜냐하면 method1 에서 method2로 값을 넘겨줄 때 Person의 주소 값을 넘겨준다!!
서로 다른 메모리에 같은 주소 값을 가지고 있는 것이다. 같은 메모리가 아님!
따라서 call by value 이지만 값을 변경할 수 있는 것이다.
참고로 자바는 call by value 방식만 가능하다.
출처 :https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference
'Java' 카테고리의 다른 글
자바가 Call By Reference가 아닌 이유 (0) | 2023.08.05 |
---|---|
enum class로 상수를 관리해야하는 이유 (0) | 2023.06.22 |
Equals와 HashCode 비교 (0) | 2022.12.13 |
추상 클래스와 인터페이스 (0) | 2022.11.10 |
static 변수와 static 메소드 (0) | 2022.09.18 |