[JAVA] 자바 정복기 - 참조 타입과 참조 변수

개발log·2024년 3월 27일

NEW 자바 정복기

목록 보기
2/27
post-thumbnail

기본타입과 참조타입

기본타입

  • 정수, 실수, 문자, 논리 리터럴 저장
  • byte, char, short, int, long, float, double

참조 타입

  • 객체(object)의 번지를 참조하는 타입
  • 배열, 열거, 클래스, 인터페이스

기본 타입 변수와 참조 타입 변수의 차이점

기본 타입 변수

  • 실제 값을 변수 안에 저장
int age = 25;
double price = 100.5

참조 타입 변수

  • (힙 영역에 생성된) 메모리 번지를 변수 안에 저장
  • 참조 타입: 번지를 통해 객체를 참조한다는 뜻
String name = "신용권";
String hobby = "독서";


메모리 사용 영역

메소드 영역(Method Area)

  • 클래스 별로
  • 정적 필드, 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장

힙 영역

  • 객체와 배열이 생성되는 영역

JVM 스택 영역

  • 메소드가 호출되면 프레임이 추가되고
  • 메소드가 종료되면 프레임이 제거됨
  • 참조 타입 변수는 스택 영역에 힙 영역에 생성된 객체의 주소 가짐
int[] scores = {10, 20, 30};


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

  • 동일 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용
  • 번지 값의 비교
refVar1 == reVar2 //false
refVar1 != reVar2 //true - 참조하는 객체(저장된 번지)가 같음

null과 NullPointerException

  • 참조 타입 변수는 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
  • (현재 참조하고 있는 객체가 없다.)
  • null로 초기화된 참조변수도 스택 영역에 생성
reVar1 == null //false
reVar2 == null //true

예외

  • 프로그램 실행 도중 발생하는 오류

NullPointException

  • 참조 타입 변수가 null 상태에서 존재하지 않는 객체의 데이터나 메소드 사용할 경우 발생
  • 해당 참조 변수가 객체를 참조하도록 수정하여 해결
int[] intArray = null;
intArray[0] = 10; //NullPointerException
String str = null;
System.out.println("총 문자 수: "+str.length()); //NullPointException

String 타입

String 변수에 문자열 리터럴을 대입할 경우

※ 문자열 리터럴: 따옴표(" ")로 둘러싸인 문자열

  • String 객체로 생성되고 변수가 String 객체를 참조
String name = "신용권";,
String hobby = "자바";
  • 문자열 리터럴 동일한 경우 같은 String 객체를 공유
String name1 = "신용권";,
String name2 = "신용권";

new 연산자

  • 객체 생성 연산자
  • 힙 영역에 새로운 String 객체를 생성
String name1 = new String("신용권");
String name2 = new String("신용권");
  • 문자열 리터럴과 new 연산자로 생성된 객체 비교
String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권");
name1 == name2 //true
name1 == name3 //false

문자열 비교

  • ==: 번지 비교
  • equals(): (내부)문자열 비교
boolean result = str1.equals(str2);
//str1: 원본 문자열, str2: 비교 문자열
  • String 변수 초기값으로 null 대입
  • (String 변수가 참조되는 객체가 없음을 의미)
String hobby = null;
String hobby = "여행";
hobby = null;
  • 참조를 잃은 String 객체는 쓰레기 수집기(Garbage Collector) 통해 메모리에서 자동 제거

정리

  • 기본 타입: byte, short, char, int, long, float, double, boolean 타입
    변수에 값 자체를 저장
  • 참조 타입: 기본 타입을 제외한 배열, 열거, 클래스, 인터페이스
    변수에 객체의 번지 저장
  • 메모리 사용 영역: JVM은 운영체제에서 할당받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용
  • 번지 비교: 비교 연산자(==,!=)가 기본 타입에서 사용되면 값을 비교하지만 참조타입에서 사용되면 번지를 비교
  • null: 참조 변수는 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
  • NullPointException: 참조 변수가 null 일 때 참조 변수를 통해 존재하지도 않는 객체를 사용하려고 할 경우 발생
profile
나의 개발 저장소

0개의 댓글