본문 바로가기

프로그래밍/Q

[자바] Q. String에 대해

 *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( ) 메소드를 사용하면 된다.