jiseongkimu / java_test_1330

0 stars 0 forks source link

Java는 Call by Value 인가 Call by Reference ? #8

Open DaeAkin opened 4 years ago

DaeAkin commented 4 years ago

코드 예제를 잘 설명해주세요

jiseongkimu commented 4 years ago

Call by Value

Class CallByValue{ public static void swap(int x, int y) { int temp = x; x = y; y = temp; }

public static void main(String[] args) { int a = 10; int b = 20;

System.out.println("swap() 호출 전 : a = " + a + ", b = " + b); swap(a, b); System.out.println("swap() 호출 후 : a = " + a + ", b = " + b); } } a, b, x, y가 각각 주소의 1,5,9,13번째에 위치해 있고 10, 20을 가지고 있다고 가정, 메소드를 호출하면 값을 복사해 넘겨주기 때문에 x, y의 값이 서로 바뀌어도 a, b의 값은 바뀌지 않음

jiseongkimu commented 4 years ago

primitive type) int같은 타입의 변수에는 주소형태의 값이 저장되지 않음.

reference type) String같은 타입의 변수에는 주소형태의 값이 저장됩니다.

대충 예제 코드 가져와서 heap과 stack을 알아봅시다. public class HeapAreaEx01 { public static void main(String[] args) { int[] a = null; //1 System.out.println(a); // 결과 : null a = new int[5]; // 2 System.out.println(a); // 결과 : @15db9742 (참조값) } }

  1. int형 배열 선언 및 Stack 영역 공간 할당(primitive type)
  2. Heap 영역 공간 할당 및 변수 a에 참조값 할당(reference type) 결국 변수a는 데이터가 저장된 Heap영역의 참조 값을 리턴 받아 stack 영역에 갖고 있다는 것

public class HeapAreaEx02 { public static void main(String[] args) { String str1 = new String("joker"); String str2 = new String("joker"); if(str1 == str2){ System.out.println("같은 주소값 입니다."); }else{ System.out.println("다른 주소값 입니다."); } } } new 연산자를 통해 데이터는 heap 영역에 저장되고, String은 immutable(reference type)이기 때문에str1, str2는 각각 다른 주소로 부터 참조를 갖는다. 결과는 다른 주소값을 같게 되므로 else문이 출력된다.

class A{}

public class HeapArea { public static void main(String[] args) { A a = null; // 1 System.out.println(a); // 결과 : null a = new A(); // 2 System.out.println(a); // 결과 : @..... } }

  1. A타입의 a객체 선언 및 Stack 영역 공간 할당(primitive type)
  2. Heap 메모리에 공간 할당 및 객체(a)에 참조값 할당(reference type)

결론 : 객체는new 연산자로 heap에 저장된 리턴값을 참조한다.(객체는 참조값을 갖는다) etc)heap에 있는 불필요한 메모리는 JVM이 알아서 해제해준다(Garbage Collection)