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

    자바 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

     

    참고자료

    'Java' 카테고리의 다른 글

    접근제어자 캡슐화, 정보 은닉  (0) 2024.11.20
    String, Stringbuffer, Stringbuilder 차이  (0) 2024.11.20
    기본 타입과 참조 타입  (0) 2024.11.15
    JVM의 동작방식과 구조  (0) 2024.11.14
    가비지 컬렉션 (Garbage Collection, GC)  (0) 2024.11.14

    댓글