Open DaeAkin opened 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의 값은 바뀌지 않음
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 (참조값) } }
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); // 결과 : @..... } }
결론 : 객체는new 연산자로 heap에 저장된 리턴값을 참조한다.(객체는 참조값을 갖는다) etc)heap에 있는 불필요한 메모리는 JVM이 알아서 해제해준다(Garbage Collection)
코드 예제를 잘 설명해주세요