Java

String 문자열 String Pool, ==과 equals() 차이점

Yejin 2024. 11. 15. 17:56

자바 String

 

문자열은 문자로 구성된 문장을 뜻한다. 자바에서는 문자열을 나타내는 자료형은 String이다. 자바의  String은 기본형 타입이 아닌 참조형 타입(하나의 클래스)이다.

 

String a  = "Hello"
System.out.println(a.hashcode())

a = a + " World";
System.out.println(a.hashcode()) # 해시 값이 서로 다르다

String은 불변(immutable)으로 설계되었는데, 이는 처음 만들어진 String은 어딘가에 저장되고, 거기에 추가될 떄는 새로운 String 값으로 저장된다.

 

선언 방식

 

리터럴 방식

String str = "Hello";

상수풀에 문자열을 저장한다. 동일한 문자열 리터럴이 여러번 등장하면 동일한 객체를 재사용한다.

 

 

new 키워드 방식

String str = new String("Hello");

항상 새로운 String 객체를 생성하며 힙 영역에 저장된다. 

 

String constant Pool

 

String constant Pool은 JVM이 문자열 리터럴을 메모리 상에서 관리하는 장소이다. 문자열 리터럴이 사용될 때, 이 문자열은 상수 풀에 저장되며 동일한 문자열을 사용할 때는 새로운 객체를 저장하지 않고 상수 풀에서 재사용된다.

 

String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true

 

s1과 s2는 동일한 문자열을 가졌기 때문에 s1, s2는 동일한 메모리 주소를 참조하게 된다. 따라서 == 연산자가 true를 반환하게 된다.

 

참고 ) String constant Pool은 기존에 permanent Generation 에 위치했지만, Java8부터는 PermGen이 없어지고 MetaSpace(Native 메모리 영역)라는 새로운 메모리 영역에 위치하게 되었다.

 

== vs equals()

==와 equals()는 모두 문자열을 비교할 때 사용하는 방법이다.

 

==

  • 참조 비교
  • 두 문자열 객체가 같은 메모리 주소를 가르키는 비교한다.

 

equals()

  • 값 비교
  • 두 문자열이 내용상 동일한지 비교한다

 

String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true

 

new 키워드를 사용하게 되면 항상 새로운 String 객체를 생성하게 된다(안의 내용이 동일하더라도!) 따라서  == 비교를 하게 되면 s1과 s2는 서로 다른 메모리 주소를 가지기 때문에 false를 반환하게 된다. 반면 equals()는 값을 비교하기 때문에 true를 반환한다.

 

문자열 내장 메서드

 

1 ) lenth() 

: 문자열 길이를 반환

String str = "Hello"
System.out.println(str.length()); // 5

 

2 ) charAt(int index)

: 주어진 인덱스 위치에 있는 문자를 반환

String str = "Hello"
System.out.println(str.charAt(1)); // 'e'

 

3 ) substring(int start, int end)

: 문자열의 특정 인덱스 범위(start ~ end - 1)에 해당하는 부분 문자열을 반환

System.out.println(str.substring(0, 3)); // 'Hel'

 

4 ) toUpperCase, toLowerCase()

: 문자열을 대문자, 소문자로 변환한 새로운 문자열을 반환

String upper = str.toUpperCase(); // "HELLO"
String lower = str.toLowerCase(); // "hello"

 

5 ) trim()

: 문자열 앞뒤의 공백을 제거한 새로운 문자열을 반환

String trimmed = "  Hello  ".trim();  // "Hello"

 

6 ) split(String regex)

String[] parts = "apple,banana,orange".split(",");  // ["apple", "banana", "orange"]

 

7 ) indexOf(String str)

: 특정 문자열이 처음 나타나는 인덱스를 반환

int index = str.indexOf("l");  // 2

 

참고자료