Programming🧑‍💻/Java

[JAVA] data type : 원시형과 참조형의 차이

생각 깎는 아이 2022. 9. 28. 23:10

- 참조형(Reference type)

// String class로 "java"라는 문자열을 객체를 만든뒤 
// language 변수는 만든 객체를 참조한다. 
String language = new String("java");

- 원시형(primitive type)

// 변수 a에 값 1을 저장한다. 
int num = 100;

 

변수에 값을 지정할 때

  • 변수를 지정 시 Stack 영역에 변수가 올라간다.  
  • 원시형 변수를 사용하면 Stack 상에서 변수가 값을 지니고 있다. 
  • "new" 키워드를 사용하여 클래스를 통해 객체를 만들면 Heap 영역에 생성한 객체에 대한 메모리가 할당되어 저장된다
  • 참조형 변수를 사용하면 원시형 변수가 Stack 상에 값을 가지고 있는 것과 달리 객체가 저장되어 있는 Heap의 메모리 주소를 가진다. 

 

출처: https://hyperskill.org/learn/step/5035

 

변수를 복사할 때 

// a는 원시형 변수
int a = 100;
int b = a; 

// language는 참조형 변수
String language = new String("java");
String java = language;
  • 원시형 변수는 변수가 값을 가지고 있기 때문에 기존의 변수를 새로운 변수에 할당하면 새로운 변수는 기존의 변수의 값을 똑같이 가짐
  • 참조형 변수는 값이 아닌 객체의 주소를 가지고 있기 때문에 새로운 변수는 기존 변수가 갖는 객체의 주소를 복사해 갖는다.
    • 즉 새로운 변수는 새로운 객체를 가리키는 것이 아니라 기존 Heap상에 있던 객체를 가리킨다.

 

출처: https://hyperskill.org/learn/step/5035

 

변수를 비교할 때 ( == )

String s1 = new String("java");
String s2 = new String("java");
String s3 = s2;

System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true
  • ' == '를 사용하여 참조형 변수를 비교할 때 값이 아닌 변수가 가리키고 있는 메모리 주소를 비교한다
  • s2와 s3는 동일한 객체 주소를 가지고 (가리키고) 있기 때문에 '==' 사용 시 true  
  • s1과 s2가 가리키고 있는 문자열 객체는 'java'로 동일하지만 서로 다른 객체를 가리키고 있기 때문에 '==' 사용시 false

출처: https://hyperskill.org/learn/step/5035