항해 Pre-onboarding 4일차

황지성·2022년 11월 11일
0

20221111 TIL(Today I learn)


오늘은 참조타입에 대해서 학습했다. 학교 수업을 들을 땐, 메모리 효율, 메모리 영역 등 눈에 보이지 않는 부분들은 중요하게 생각하지 않고 눈에 보이는 부분들을 공부하는데 더 집중했지만 회사를 다니면서 이런 부분들도 중요함을 알게 되었기에 예전과는 다르게 느껴졌다.

1. 기본 타입과 참조 타입

위 그림을 보고 'String은 왜 없지?'라고 생각했는데 Java에서 String은 Class라는 사실을 잊고 있었다.

아무튼 기본 타입과 참조 타입의 가장 큰 차이점은 해당 타입의 변수를 생성했을 때, '변수에 어떤 값이 저장되는가'이다.

  • 기본 타입

    기본 타입 변수를 선언하고 초기화까지 했을 때, 스택(Stack)영역에 선언한 변수가 생기고 초기화했던 값이 담긴다.

  • 참조 타입

    참조 타입 변수를 선언하고 초기화까지 했을 때, 스택(Stack)영역에 선언한 변수가 생기고 초기화했던 값은 힙(Heap)영역에 객체로 생긴다. 이후, 스택 영역에 생성된 변수에 힙 영역에 생성된 객체의 주소 정보가 담긴다.

참조 타입은 처음 접했을 때, 이해하기 쉽지 않기에 조금 더 살펴보자.

1.1 기본 타입 변수

public static void main(String args[]){
	int number = 100;
  	...
}

기본 타입 변수인 int형 변수를 선언하고 초기화까지 했을 때, 스택(Stack)에 'number'변수가 생기고 '100'이라는 값이 담긴다.


1.2 참조 타입 변수

public static void main(String args[]){
	String name = "침착맨";
  	...
}

참조 타입 변수인 String형 변수를 선언하고 초기화까지 했을 때, 스택(Stack) 영역에 'name'변수가 생기고 힙 영역(Heap)에 초기화했던 값을 가진 String 객체가 생성된다. 스택 영역의 name은 생성된 객체의 주소를 참조한다.


참조 타입 변수는 선언하고 null로 초기화한다면 위 그림처럼 스택 영역에 null상태로 생성된다.

2. String

String을 사용할 때 조심해야 되는 부분은 비교이다.
익숙하고 제대로 알고 있다면 상관없지만 오랜만에 자바를 사용하거나 처음 사용한다면 String비교를 제대로 못하는 경우가 있다. 물론 나도 그랬다.

public static void main(String args[]){
	String name1 = '손오공';
    String name2 = '손흥민';
    
    // #1
    if(name1.equal(name2)){
    	System.out.print("동일");
    }
    
    
    // #2
    if(name1 == name2){		// 동일한 객체를 참조하는지 확인하는 것
    	...					// 참조하고 있는 값을 비교하는 것이 아니다.
    }
}

String은 equal을 통해 스택(Stack)영역이 참조하는 객체의 값을 비교해야 한다.
'=='을 통해 비교한다면 두 개의 변수가 동일한 객체를 참조하는지 확인하는 것이기 때문에 올바른 값 비교를 할 수 없다.

profile
성장하는 개발자

0개의 댓글