본문 바로가기
study/JAVA

자바 Java 값복사와 주소복사란?

by stilinski 2022. 3. 31.
728x90

  • 자바에서 제공하는 데이터 타입(data type)
    • primitive datatype : byte, short,int,float, double, boolean, char
    • reference datatype: arr, class, interface

[argument 전달방식]

  1. call by value: 값에 의한 복사
    1. 장점: 복사해여 처리하기때문에 안전하다. 원래값 보존
    2. 단점: 복사를 하기 때문에 새롭게 메모리 차지하게 됨.
    3. primitive datatype으로 인자를 전달할때
  2. call by reference: 주소에 의한 복사
    1. 장점: 참조를 하기때문에(주소복사) 메모리를 절약한다.
    2. 단점:참조를 하게되면 원래값에 영향을 받에된다.
    3. reference datatype으로 인자를 전달할때

 

1. 값복사

c,d에는 각각 a,b에있는 값이 복사가 되어서 저장된다.

기본데이타타입(primitive datatype )에 있는 것은 값복사가 일어남

 

 

c와 d의 값을 swap함.

그래도 int a,b는 변하지 않는다.

말그대로 a,b의값을 복사해서 새롭게 c,d에 넣은 거기 때문.

 

 

증명:

a b의 값이 복사된 c d의 값을 서로 바꿔줌. 그리고 a b c d 를 각각 출력해봄. c d의 값은 바꼈지만 a b는 그대로임. 기본 데이터 타입을 전달할때는 값복사가 일어나기 때문에 원본과 복사가 서로 영향이 안감.

 

그냥 c와 d를 그대로 대입하려고 할 경우

c는 이미 d의 값이 복사가 되어서 d에 c를 대입하려고 할 때 기존의 d의 값이 대입됨.

그것을 방지하기 위해 먼저 임시 저장공간을 만들고 거기에 c의 값을 담아줌.

c에 d의값을 복사하고, d에 c의값을 대입하기위해 임시저장소에 들어있는 c의값을 대입시킴.

그냥 c를 넣어버리면 위에처럼 이미 d로 변경된 c의값이 들어가게됨.

 

 

 

2. 주소복사

reference타입의 데이터의경우

heap메모리에는 값이 저장되고, stack메모리에는 주소값이 저장됨.

 

num의 리터럴값이 아닌 주소값이 저장됨.

 

728x90

댓글