JAVA-Basic

1. 원시타입 변수와 참조타입 변수의 할당 원리

Jungsoomin :) 2020. 7. 10. 10:19

원시타입의 할당 원리

 

  • -stack 영역     

    int i; 선언시 -> stack영역에 i라는 공간이 생김. 

         i = 3; 선언시 ->stack영역의 i라는 공간에 값이 들어감

 

  • -call by value

     int i =3 ;

     int j =i;

    원시 타입은 stack영역에서 i변수가 만들어지고 3을 대입하고 이후 j가 만들어지면 i의 value를 할당함. 즉 3

 

 

참조타입의 할당 원리

 

-Stack 영역

 

String s; 선언시 -> stack 영역에 s라는 공간 생성

 


-heap 영역

s = new String("str"); 선언시 -> 인스턴스(필드와 메서드가 있는 데이터덩어리)생성 -> heap영역에 "str" 생성 -> JVM에 의해서 주소생성 -> 주소값을 stack영역의 s변수에 대입

 

  • -call by reference

    String s = new String("str");

    String s1 = s;

    참조 타입은 stack 영역에서 s 변수가 만들어지고 heap영역에서 값을 만들고 주소 값을 할당 하고 stack 영역의 참조변수에 주소 할당

    s1에 s를 할당하게 되면 stack 영역의 주소값만 복사해서 할당 즉 주소 값만 넘기므로 두 변수는 같은 참조를 하게 됨

 

 

  • -String

     값을 같은 문자열로 할당하면 같은 참조 값을 가짐

                 String s ="java";

                 String s1 = "java";

              System.out.println(s == s1); 의 결과는 true, 즉 같은 객체 참조를 가진다.

 

new 연산자를 사용하면 다른 참조변수가 된다. 즉 다른 주소를 갖는다.
            String s2 = new String("java");

            System.out.println(s == s2); 의 결과는 false 이다.

 

public class RefType4 {
	
//	call by reference
	private static void change(int[] ar) {
		 ar[1] = 10;
	 }
	
//	 call by value
	private static void print(int k) {
		System.out.println(k);
	}
	
 public static void main(String[] args) {
	
	 int[] arr = new int[3];
	 int[] arr2 = arr;
	 
	 arr[0] = 9;
	 
	 System.out.println(arr[0]);
	 int i =3;
	 print(i);
	 change(arr2);
	 
	 System.out.println(arr[1]);
 	}
}

 

 

JAVA에서 call by value와 call by reference는 핵심 내용이다.