멘토링

primitive and reference variables

langsamUndStetig 2022. 6. 9. 21:26
Primitive  Reference
변수의 값을 저장 + null이 될 수 없음(기본값이 있기 때문) 변수의 레퍼런스를 저장. + 아무값도 입력하지 않을 경우 null
primitive variable을 선언할 경우 컴퓨터는 메모리를 할당해서, 각 variable은 자신만의 저장 공간을 가짐. (스택 영역에 위치) reference variable은 variable의 data에 참조되어진다. 즉 힙 영역에 위치한 객체에 대한 참조값을 가짐. (C와 C++에서 보던 포인터와는 다름. 단순히 객체에 접근하고 상태를 변경할 수 있음)
primitive type에 값을 할당할 경우, primitive value가 복사됨 reference type의 경우 참조값이 복사되서 할당됨. 즉 객체가 공유되어지는 것을 의미 (한쪽에서 변화를 줄 경우, 참조값을 가진 다른 reference variable에도 영향을 줌.)
== 연산을 사용하여 비교할 때 primitive type은 value를 비교 반면에 reference type은 참조값(주소)를 비교 -> 따라서 reference type의 value를 비교하고 싶을 땐 equals() method를 사용
method argument로 보낼 때 value를 보냄 (한쪽 value의 변화가 다른 쪽에 영향을 주지 않음. 즉 독립) 참조값을 보냄 (객체 내부 상태를 바꿀 경우 기존 reference type에 영향을 줌,)
primitive local variable은 메소드가 끝난 후에 삭제됨. 반면 객체는 지역적으로 생성되더라도 heap영역에 위치해 있어서 실행이 종료되더라도 남아 있을 수 있다. (메소드에서 리턴되어지거나 다른 멤버 변수에 참조값이 저장될경우.)
object header와 같은 메타 데이터를 저장하지 않아도 되서 사용 용량이 적음 사용 용량이 더 많음 e.g.) int variable은 같은 값을 저장하더라도 Integer 객체보다 더 적은 메모리 사용.
초기화하지 않더라도 기본값이 있음. 초기화되지 않은 reference variable에 접근할 시 NullPointerException 발생

primitive type과 reference type에 값을 할당할 때 차이. primitive type의 경우 같은 value더라도 저장된 위치가 다르다, 

 

package basic;

public class As {
  String name;
  public static void main(String[] args) {
    int a=10; 
    As b = new As("hi");
    String c = new String("hi"); //String의 경우 다른 reference variable처럼 참조값을 
    	                         //출력할 줄 알았지만 hi를 출력.
                                 //객체 생성시 값을 입력하지 않으면 아무값도 출력되지 않음
                                 //Integer 타입도 해보았지만 생성자에서 무조건 int값을 입력하게 
                                 //되어 있었음.
    As d = new As();
    System.out.println(a); // output: 10
    System.out.println(b); // output: basic.As@776ec8df 
    				       // toString 주석 해제시 output: hi 
    System.out.println(c); // output: hi
    System.out.println(d); // output: basic.As@4eec7777
                           // toString 주석 해제시 output: null
                           
  int b=a;
  int c=b;
  System.out.println(a+ " " +b+" "+c); // output: 10 10 10
  b=5;
  System.out.println(a+ " " +b+" "+c); // output: 10 5 10
  
  }
  public As() {}
  public As(String name) {
    this.name = name;
  }
  /*public String toString() {
    return name;
  }*/
}
public class Example {
    public static void main(String[] args) {
        int number = 1;
        call(number);
        
        System.out.println("Number still: " + number); // 1
    }
   
    public static void call(int number) {
        System.out.println("Number in the beginning: " + number); // 1
        number = number + 1;
        System.out.println("Number in the end: " + number); // 2
    }
}

참고 자료

 

https://javarevisited.blogspot.com/2015/09/difference-between-primitive-and-reference-variable-java.html#axzz7Vi7jC6MG

https://java-programming.mooc.fi/part-5/3-primitive-and-reference-variables