멘토링
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 발생 |


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://java-programming.mooc.fi/part-5/3-primitive-and-reference-variables