[Java] Call by value / Call By reference

펭귄군단·2022년 12월 15일
0

Java

목록 보기
4/6

value - 해당 값을 복제하여 사용하는 것이다.
reference - 해당 주소를 가져와서 사용하는 것이다.

둘의 차이를 이해하려면 메모리의 값 과 주소를 이해해야 한다.
기본적으로 데이터는 저장될때 아래와 같은 코드를 사용한다.

Integer a = 10;

이렇게 보기만 하면 a라는 이름의 변수에 10이라는 값을 저장해 놓은 것으로 인식이 된다.

실제로 사용을 할때도

sysout(a) //10

이런식으로 변수 명으로 호출을 하기 때문에 우리는 주소 값이라는 계념을 인식하기 어렵다.

하지만 사실은 a라는 변수는 주소값을 저장하고 있고 해당 주소값의 메모리 위치에서 값을 가져오는 방식이다.
이러한 방식이기 때문에 value와 reference의 차이가 발생하게 되었다.

Integer a = 10;
Integer b = a;

이 방식은 value의 방식으로 새로운 메모리 공간을 만들어 값을 복사하는 방법이다.

그렇다면 java에서는 어떻게 reference의 방식을 사용하는 것일까?

class A{
	int a;
    int b;
    A(int a,int b){
    	this.a = a;
        this.b = b;
    }
}
fun void swap(A a) {
    int temp = a.b;
    a.b = a.a;
    a.a = temp;
}
class main{
	AAA a1 = new AAA(1, 2);
		
		Sysout("a: " + a1.a);
		Sysout("b: " + a1.b);
		
		swap(a1);
		
		Sysout("a: " + a1.a);
		Sysout("b: " + a1.b);
    
}

이렇게 작성을 하면 A클래스의 a,b값이 변경된 것을 알 수 있다.

이때 java는 메모리중 stack영역과 heap영역 2가지를 사용하는데 함수(파라미터 지역변수 등)는 stack에 큰 데이터들은(new를 사용한 wrapper class) heap에 저장이 된다.

함수의 작업은 stack에서 일어나는데 이때 int와 같은 작은 데이터는 stack에서 값을 가지고 있지만 class와 같은 큰 데이터들은 heap의 주소값을 저장하게 된다. 그럼으로 wrap의 함수가 실행이 되더라도 main의 a와 b에 영향을 줄 수 있는 것이다.

profile
꾸준히 배우자(다른 사람 글 복붙 할 바에 링크를 걸어라)

0개의 댓글

관련 채용 정보