*String의 선언 방법에는 2가지가 있다.
- 1.리터럴 변수를 이용해서 선언하기
- 2. 객체 String을 이용해서 선언하기
그렇다면, 둘의 차이는 무엇일까?
Q1. String Literal VS new String()
String Literal (변수) | new String() | |
생성 방법 | String str1 = "hi"; | String str1 = new String("hi"); |
근본적 정의 | 고정된 값의 변수로 String형 자료를 생성 | String의 새로운 객체를 생성한다. |
Q2. 문자열 비교: "==(비교연산자)"과 "equals()"
== | equals( ) | |
설명 | 비교 연산자 자료형의 값을 비교함 →자료형의 주소 값으로 비교를 함 |
메소드 문자열 2개의 값을 비교 함 → 객체의 값 자체를 비교함. |
코드로 살펴보자면 다음과 같다.
package study;
public class 문자열 {
static public void main(String args[]) {
//리터럴 문자열
String str1 = "hi";
String str2 = "hi";
//객체 문자열
String str4 = new String("hi");
String str5 = new String("hi");
/*비교 연산자(==) 사용 시 */
//1.1. 리터럴 Str1과 Str2 ==> 결과 true
if(str1 == str2) {
System.out.println("true");
}
else {
System.out.println("false");
}
//2.1. 객체 Str4과 str5 ==> ==> 결과 false
if(str4 == str5) {
System.out.println("true");
}
else {
System.out.println("false");
}
//3.1 리터럴과 객체의 비교 ==> 결과 false
if(str1 == str4) {
System.out.println("true");
}
else {
System.out.println("false");
}
/*메소드 equals( ) 사용 시*/
if(str1.equals(str2)) {
System.out.println("true");
}
else {
System.out.println("false");
}
if(str1.equals(str4)) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
}
비교 연산자와 equals( ) 메서드를 이용해 비교했다.
비교 연산자는 3가지 경우로 비교해 봤다.
육안으로 봤을 땐 같은 값을 가진 것을 확인했지만, 컴퓨터는 어떨까 ?
- == 연산자의 결과
경우 | 결과 | 이유 |
1. 리터럴끼리 비교 | true | - String을 리터럴 변수로 선언할 경우, '값'을 기준으로 생성이 된다고 생각하면 편하다. |
2. 객체끼리 비교 | false | - String을 객체로 선언할 경우, '이름'을 기준으로 생성이 된다고 생각하면 편하다. - 문자열의 값이 같아도, 그냥 동명이인일 뿐이라고 생각하면 된다. |
3. 리터럴과 객체 비교 | false | - 그렇다면 리터럴과 객체의 문자열이 같다면, 이 두 개의 값을 비교했을 때 true가 나와야하는 것 아닌가? 하고 의문점이 들 수 있다. 그 이유는 Q3와 이어진다. |
- equals() 의 결과
결과 | 이유 |
true | 주소 값을 기준으로 하는 것이 아닌 변수 '값' 만을 비교를 해서 true 값이 나온다. |
Q3. String constant pool
직역하자면 변수 풀장(수영장 같은 넓은 공간)이다. 이 String constant pool은 String 객체의 상수 값을 저장하는 공간이다. 쉽게 다음과 같은 형태를 갖는다고 볼 수 있다.
따라서 리터럴 String과 객체 String이 직관적으로 볼 때만 같은 값을 가진것처럼 보인다. 값을 비교하는 비교 연산자(==)를 사용하면 각각의 두 자료형은 다른 값을 가졌다는 것을 알 수 있다. 따라서 문자열을 값 자체를 비교하고 싶다면 equals( ) 메소드를 사용하면 된다.