문자열을 비교할 때 우리는 비교연산자인 ==과 !=을 자주 사용한다.
하지만 이것과 비슷한 메소드로 equals()라는 메소드가 있다.
이 두 개의 차이는 무엇일까?
문자열을 변수에 저장할 때 우리는 보통
String name = "홍성인";
와 같은 형식으로 선언하게 된다.
하지만 엄밀히 말하자면 변수에 저장하는 것이 아니라
문자열은 String 객체로 생성되고 변수는 String 객체를 참조하는 것이다.
아래 그림을 참고해서 보면, name 변수는 스택 영역에 생성되고, 문자열 리터럴인 "홍성인"은 힙 영역에 String 객체로 생성된다.
그리고 name 변수에는 String 객체의 번지 값이 저장되어 문자열 리터럴인 "홍성인"을 참조하는 참조 변수가 된다.

자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어있다. 만약 아래와 같이 name1과 name2가 동일한 문자열인 "홍성인"을 참조할 경우, name1과 name2는 동일한 String 객체를 참조하게 된다.
String name1 = "홍성인";
String name2 = "홍성인";

일반적으로는 변수에 문자열을 저장할 때는 위와 같이 문자열 리터럴을 사용하지만, new 연산자를 사용해서 직접 String 객체를 생성시킬 수도 있다. new 연산자는 힙 영역에 새로운 객체를 만들 때 사용하는 연산자로 객체 생성 연산자라고 한다.
String name1 = new String("홍성인");
String name2 = new String("홍성인");
위와 같이 코딩할 경우, name1과 name2는 문자열은 같지만 다른 객체를 참조하게 된다.

이렇게 문자열 리터럴로 생성하느냐 new 연산자로 생성하느냐에 따라 비교 연산자의 결과가 달라지게 된다.
String name1 = "홍성인";
String name2 = "홍성인";
String name3 = new String("홍성인");
boolean result1 = name1==name2; //true
boolean result2 = name1==name3; //false
boolean result3 = name1.equals(name3); //true
마지막으로 기억해야할 점은 String은 참조 변수이기 때문에 참조하는 값을 비교한다는 점을 잊지 말자.
'백엔드 공부 > Java' 카테고리의 다른 글
| [Java] 열거 타입 (0) | 2023.11.24 |
|---|---|
| [Java] 향상된 for문 (2) | 2023.11.24 |
| Math.random()으로 정수값 뽑기 (0) | 2023.11.22 |
| 삼항 연산자 (0) | 2023.11.22 |
| Mac에서 Java 설치, 경로 설정 및 이클립스 설치 (0) | 2023.11.20 |