자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 6일차 - 참조 타입과 참조 변수

개발학생 2025. 5. 28. 18:34
반응형

1) 기본 타입과 참조 타입

  • 참조 타입(reference type): 번지를 통해 객체(object)를 참조하는 타입 [배열/열거/클래스/인터페이스]
    -> 실제 값을 변수 안에 저장하는 기본 타입[byte/char/short/int/long/float/double/boolean]과 다르게,
        메모리의 번지를 변수 안에 저장

데이터 타입-기본 타입과 참조 타입 도식화

2) JVM에서의 메모리 영역(Runtime Data Area/운영체제에서 할당받음)

JVM이 사용하는 메모리 영역 도식화

(1) 메서드 영역(Method Area)

  • JVM이 시작할 때 생성되며, 모든 스레드가 공유하는 영역
  • 코드에서 사용하는 클래스(.class)들을 클래스 로더로 읽어,
    클래스별로 정적 필드(static field)/상수(constant)/메서드 코드, 생성자(constructor) 코드 등을 분류하여 저장 

(2) 힙 영역(Heap Area)

  • 객체와 배열이 생성되는 영역
    -> 생성된 객체와 배열은, JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
    => 참조하는 변수나 필드가 없다면, JVM이 가비지 콜렉터(Garbage Collecter)를 실행하여 객체와 배열을 자동으로 제거

(3) JVM 스택(Stack) 영역

  • 메서드를 호출할 때마다 프레임(frame)을 추가(push)하고, 메서드 종료 시 해당 프레임 제거(pop)
    -> 프레임 내부의 로컬 변수 스택에서, 기본/참조 타입 변수가 추가/제거됨 (스택 영역 변수 생성 시점은 변수 초기화 시점) 
  • 코드 예시
    • 1. 스택 영역에 v1='A'가 저장됨
    • 2. v1='A'위에 v2=100, v3=3.14가 차례대로 저장됨
    • 3. v2와 v3이 소멸되고, v1='A'위에 v4=true가 저장됨
// 1.
char v1 = 'A';  

// 2. 
if (v1 == 'A') {
  int v2 = 100;
  double v3 = 3.14;
}

// 3.
boolean v4 = true;

JVM 스택 영역 코드 예시

3) 참조 변수의 ==, != 연산

  • 변수의 값이 같은지를 조사하는 게 아닌, 동일한 객체를 참조하는지 조사할 때 사용
    • 동일한 객체를 참조하면 ==연산은 true, != 연산은 false 반환
  • 코드 예시

4) null과 NullPointerException

  • 참조 변수는 힙 영역 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있으며, 이는 초기값으로도 사용 가능
    • 참조 변수의 값이 null일 경우(참조 변수=null로 정의), '참조 변수 == null' 연산 시 true반환
  • 코드 예시

5) String 타입

  • 문자열을 String 변수에 저장한다는 표현은 잘못된 표현
    -> 문자열은 String 객체로 생성되고 변수는 String 객체를 참조하기 때문
  • 따라서 String 객체 내부의 문자열을 비교하려면, ==나 != 연산자가 아니라 .equals() 메서드 사용
    • .equals() 메서드 사용 예시[String 타입의 str1과 str2 비교]: str1.equals(str2)

 

 

반응형