스트링 클래스는 문자열을 다룰 때 사용하는 클래스로, 이전 게시글에도 명시했듯이 불변 클래스이다.
💻 실습
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 |