[java] String Class

송어·2023년 11월 15일

문자열은 자바에서 객체로 취급하며 String 타입으로 객체를 생성하고 처리를 한다.

문자열 생성방법

  1. String 객체 생성
String str1 = new String("Hello world");
String str2 = new String("Hello world");

직접 String 객체를 생성해 문자열을 사용하는 방법이다. 문자열은 객체로 취급하기 때문에 String 객체를 생성해 문자열을 입력한다.
위의 str1과 str2는 같은 "Hello world"문자열을 가리키고 있는데 각각 객체를 생성했기 때문에 str1과 str2의 주소값은 다르다.

  1. 문자열 리터럴
    객체 생성 없이 문자열 리터럴을 바로 String타입 변수에 할당하는 방법이다.
String str1 = "Hello world";
String str2 = "Hello world";

문자열 리터럴을 String 타입 변수에 할당하게 되면 문자열은 Heap Memory가 아닌 Literal Pool Memory에 저장된다. Literal Pool은 재활용 메모리 공간으로 Literal Pool에 저장된 메모리를 재사용하기 때문에 같은 문자열을 다른 변수에 저장해도 주소값은 동일하다.(str1 = str2)

다음은 각각 다른 방법으로 문자열을 비교한 예제이다.

public class HelloWorldTest {
    public static void main(String[] args) {
        String str1 = new String("HelloWorld"); // 문자열 객체 생성 - Heap Memory
        System.out.println(str1);
        String str2 = new String("HelloWorld"); // 문자열 객체 생성 - Heap Memory
        System.out.println(str1);

        if(str1 == str2) {
            System.out.println(true);
        }else {
            System.out.println(false); // 주소값이 다르기 때문에 같지않음
        }

        if(str1.equals(str2)) {
            System.out.println(true); // equals()메서드로 객체내용을 비교할 시 true
        }else {
            System.out.println(false);
        }

        String str3 = "HelloWorld"; // 문자열 리터럴 Literal Pool
        String str4 = "HelloWorld";

        if(str3 == str4) {
            System.out.println(true); // 같은 주소값을 가리킴(재사용)
        }else {
            System.out.println(false);
        }

        if(str3.equals(str4)) {
            System.out.println(true);
        }else {
            System.out.println(false); // 같은 주소값을 가리킴(재사용)
        }
    }
}

문자열 객체를 생성해 비교하였을 땐 각각 객체 생성으로 인해 다른 메모리 주소를 참조하고 있어 등위 연산자로 비교시 다른 값이라고 반환하게 된다. 하지만 equals()메서드를 사용해 비교하게 되면, 객체 내용을 비교하기 때문에 true가 반환된다.

반면, 문자열 리터럴을 이용한 방법은 두 변수가 Literal Pool에 저장된 String객체를 재사용하기 때문에 두 방법으로 비교하면 전부 true가 반환된다.

compareTo()메서드를 활용해 문자열을 비교할 수도 있다.

public class HelloWorldTest {
	public static void main(String[] args) {
    	String str1 = "apple";
        String str2 = "banana";
        
        int result = str1.compareTo(str2); 
        if(result == 0){
        	System.out.println("str1 == str2");
        }else if(result < 0) {
        	System.out.println("str1 < str2");
        }else if(result > 0) {
        	System.out.println("str1 > str2");
        }
    }
}

compareTo()메서드는 숫자 / 문자의 크기를 비교하는 메서드로 결과가 0이 나온다면 비교 결과가 같은 것이고, 양수 & 음수가 나온다면 비교 결과가 다른 것이다.
문자열의 경우 문자를 아스키코드로 변환해 비교대상의 문자끼리 서로 비교를 하는데 왼쪽이 큰 경우 양수, 오른쪽이 큰 경우 음수의 결과를 반환한다.

0개의 댓글