본문 바로가기
Programming/JAVA

스트링(String) 클래스의 문제점

by 성동구불주먹 2024. 10. 16.

스트링 클래스는 문자열을 다룰 때 사용하는 클래스로, 이전 게시글에도 명시했듯이 불변 클래스이다.

 


 

💻 실습

1. StringExam 클래스 생성

2. String 형식의 str1, str2 선언

3. str2에 사용된 substring 메서드는 5번 째부터 문자를 잘라서 새로운 문자열을 반환하는 메서드이다.

package org.example;

public class StringExam {

    public static void main(String[] args) {
        String str1 = "hello world";
        String str2 = str1.substring(5);

        System.out.println(str1);
        System.out.println(str2);
    }
}

 

[출력 결과값]

hello world
 world

 


 

근데, 문자열과 문자열을 더하면 어떻게 될까?

str3을 생성해서 str1과 str2의 문자열들을 연결해 보자.

package org.example;

public class StringExam {

    public static void main(String[] args) {
        String str1 = "hello world";
        String str2 = str1.substring(5);

        System.out.println(str1);
        System.out.println(str2);
        
        String str3 = str1 + str2;
        System.out.println(str3);
    }
}

 

[출력 결과값]

hello world
 world
hello world world

 

출력값을 보면 문자열들이 연결되어서 잘 출력된다.

그런데 방금처럼 str3 같은 경우는 보이는 것과 다르게 내부적으로는 아래와 같은 코드 형식이다.

 String str4 = new StringBuffer().append(str1).append(str2).toString();

 

이전 게시글에 있듯이, 코드 내부적으로는 StringBuffer 클래스를 이용해서 append 처리되고 마지막에 toString 메서드를 통해 String값으로 변환시키는 과정이다.

 

[출력 결과값]

hello world world

 


 

이번엔 반복문 안에서 문자열과 문자열을 더하면 어떻게 되는지 실습해 보자.

String str5 = "";
    for(int i = 0; i < 100; i++) {
        str5 = str5 + "*";
    }
	System.out.println(str5);

 

[출력 결과값]

****************************************************************************************************

 

str5를 실행시켜 보면 * 가 지금 100개 출력된다.

실제, 이 반복문 안에서는 문자가 더해질 때마다 100번 동안 내부적으로 String 객체를 생성하게 된다.

한 번 돌 때마다 StringBuffer를 한 번씩 만들어내는 것이다.

 

Java 언어는 new 연산자가 많이 사용될수록 프로그램의 속도가 저하된다.

따라서 이렇게 작성된 코드는 좋지 않은 코드🌚라고 볼 수 있다.

 

실제 이렇게 빈번하게 String에 더하기(+) 연산이 일어난다면 위의 예시처럼 사용하는 것보단,

이전 게시글에 있는 StringBuffer클래스를 이용하는 게 더욱 효율적이다.

아래 예시를 보자.

 

StringBuffer sb = new StringBuffer();
        for(int i = 0; i < 100; i++) {
            sb.append("*");
        }
        
        String str6 = sb.toString();
        System.out.println(str6);

 

이렇게 사용하면 아까와 출력 결괏값은 동일하지만, 훨씬 효율적인 코드를 만들어 낼 수 있다.

‼ 문자열을 반복문 안에서 사용하는 것은 성능 상으로 문제가 발생할 수 있기 때문에 반드시 지양하자.

반응형

'Programming > JAVA' 카테고리의 다른 글

static(정적)의 의미와 사용  (1) 2024.10.28
Math 클래스  (1) 2024.10.16
StringBuffer(스트링버퍼)  (0) 2024.10.15
java.lang 패키지/오토박싱(Autoboxing)  (0) 2024.10.14
Object와 오버라이딩(Overriding)  (0) 2024.10.10