[java] == vs equal in String

나호영·2023년 3월 2일

자바에서 String 객체를 생성하는 방식은 두 가지가 존재한다.

  1. 리터럴을 이용
  2. 생성자를 이용

먼저 리터럴을 이용하면 자바의 String 클래스 내부의 intern() 메소드가 호출된다. 이 메소드는 주어진 리터럴이 String Constant Pool에 존재하는지 검사하고 있다면 해당 주소값을 반환, 없다면 주어진 리터럴의 값을 String Constant Pool에 새로 집어넣은 후, 해당 주소값을 반환한다. 생성자를 이용하는 방식은 new 연산자를 이용해 새로운 객체를 만들면 해당 객체가 생성된 메모리의 주소값을 반환한다.

String a = "hello"
String b = "hello"
String c = new String("hello")

==연산자를 이용해 비교하면 a와 b는 true c와는 false가 나온다.
equeal 메소드를 호출하면 모두 true가 나온다.

이러한 이유는 위의 설명에 존재하는데, a와 b가 주소값이 같은 이유는 같은 리터럴을 이용하는 방식으로 객체를 생성했기 때문에 a와 b는 String Constant Pool에 존재하는 "hello"의 주소값을 가지기 때문이다. 반대로 c는 새로운 객체를 생성해 heap 영역에 할당된 새로운 메모리이기 때문에 다른 주소값을 가지고 있어 주소값을 비교하는 == 연산자를 사용하면 false가 나온다. 따라서 String 객체를 비교할 때 단순히 해당 문자열이 같은지를 확인하고 싶으면 equals 메소드를 사용해야한다.

사실 자바에서 주소값이라고 하면 그렇게 정확한 표현은 아니다. 자바에서는 객체가 생성될 때, 해당 객체가 생성된 주소를 참조하는 단 하나의 참조값이 생성되고 이 참조값을 변수가 가지고 있기 때문에 참조값이라고 하는 것이 옳다. 그래서 자바에서 변수를 참조 변수라고 한다.

profile
공부 내용 기록

0개의 댓글