본문 바로가기
개발&코딩/Java

Java 독학 #4 - 문자열 이어붙이기, 문자열 연산 차이점

by 우동이 2022. 5. 10.
300x250

Java의 String형 변수를 이어 붙이는 방법에는 대략 4가지 방법이 있다

  • String + String // +연산
  • String.concat() // concat() 함수를 이용한 문자열 이어 붙이기
  • StringBuilder class // StringBuilder class를 통한 문자열 이어 붙이기
  • StringBuffer class // StringBuffer class를 통한 문자열 이어 붙이기

먼저 String의 + 연산을 통한 이어 붙이기를 알아보자


+연산

public class Str3 {
    public static void main(String [] args){
        String s1 = new String("Hello ");
        String s2 = "Java";
        String s3 = s1+s2;
        
        System.out.println(s3);
        System.out.println(s1+s2);
        //결괏값 동일
    }
}

그림 1 - +연산 결과

s3라는 string 변수에 s1+s2의 값을 넣건

 

s1+s2의 값을 바로 출력하건 결과는 동일합니다.

 

굳이 따지자면 값을 출력만 하는 입장에서는 (s1+s2)의 값만 바로 출력하는 게

 

대입 등의 내부 연산이 없으니 낫지 않나 싶습니다.

 

검증은 아직 안 해봐서 주관적인 생각입니다.


String.concat()

JAVA 공식 문서의 String클래스를 살펴보면 concat() 함수가 존재한다.

그림 2 - Java API - String - concat()

concat 함수는 지정 문자열(String str)을 해당 문자열 끝에 연결하는 기능을 수행합니다.

 

즉 문자열을 이어 붙일 때 사용되는 함수인데 

 

이어 붙이려는 문자열을 new string()을 통해 새로 할당받으므로 

 

해당 문자열에 대한 주소 값을 새로 할당받습니다.

public class Str3 {
    public static void main(String [] args){
        String s1 = new String("Hello ");
        String s2 = "Java";

        String r1 = s1.concat(s2);
        
        System.out.println(s1.concat(s2)); // String.concat()
        System.out.println(r1); // String.concat()
    }
    
}

먼저 concat() 사용 예시 코드를 살펴봅시다

r1이라는 String 변수에 s1에 s2를 이어 붙인 새로운 String형 문자열을 생성했습니다.

 

해당 r1문자열을 출력해보면 

그림 3 - concat() 결과

 

역시 동일한 문자열이 출력됩니다..

 

r1의 경우 concat()으로 이어지는 문자열을 새로 생성한 거라 상관없지만

 

s1 자체에 concat을 사용해 s2를 붙여주는 경우에는 

 

concat()이 자체적으로 new string() 을통해 s2를 자체적으로 새로 생성합니다.

 

그러므로 s1과 s2의 주소 값은 차이가 발생합니다.

 

string s1 1000
string s2 2000

StringBuilder Class

public class Str3 {
    public static void main(String [] args){
        StringBuilder s4 = new StringBuilder("Hello ");
        s4.append("Java");
        
        System.out.println(s4); // StringBuilder 주소값 변화가 없음
        //+연산은 성능 저하, 메모리 비효율 발생
        //StringBuilder 클래스를 통해 문자열을 합치는게 좋음
        //비동기 대응 수월

        //https://pellegrino.link/2015/08/22/string-concatenation-with-java-8.html
        /*StringBuffer나 StringBuilder는 초기에 생성할 때 Buffer Size를 주도록 구성되며 이에 의한 생성
        , 확장 오버로드가 발생하기 때문에 의외로 Buffer Size를 잘못 지정할 경우 성능이 떨어질 가능성도 있다.
         하지만 String 클래스의 경우 new에 의한 생성이 아닐 때 초기 컴파일러 분석 단계에서 literal 처리에 의해 최적화가
          될 수 있기 때문에 오히려 빠른 결과를 보여줄 때가 있다. 
*/
    }
    
}

StringBuilder 클래스 변수 s4를 생성해 Hello 값을 넣은 후 

 

append()를 통해 Java 문자를 이어 붙여 출력하는 코드입니다.

역시 결과는 동일하게 출력됩니다.

 

 

String concatenation with Java 8

String concatenation is one of the most well-known caveats in Java. Almost all experienced Java developers have already heard or read explanations about when to use String vs StringBuilder/StringBuffer for concatenating Strings. These last months I gave so

pellegrino.link

또한 위 글을 참고했을 때 

 

단일 문자열의 생성은 String 클래스로 생성하는 게 맞지만

 

문자열을 이어 붙이는 동작 구현 시에는 StringBuilder, StringBuffer class를 이용하는 게 좋다고 합니다.

 

이유인 즉 성능 저하 및 메모리 비효율 이슈가 발생하기 때문이라고 합니다.

 

아직 자바를 배운 지 얼마 안돼서 처음 알게 된 사실입니다만

 

문자열 연결 관련 이슈는 잘 알려져 있는 주의사항 중 하나라고 하니 

 

어느 정도 숙지해두면 좋을 듯합니다.


StringBuffer Class

public class Str3 {
    public static void main(String [] args){
        StringBuffer s5 = new StringBuffer("Hello ");
        s5.append("Java");
        
        System.out.println(s5);//StringBuffer 
        //+연산은 성능 저하, 메모리 비효율 발생
        //StringBuilder 클래스를 통해 문자열을 합치는게 좋음
        //비동기 대응 수월

        //string.concat < StringBuilder,StringBuffer
        //https://pellegrino.link/2015/08/22/string-concatenation-with-java-8.html
        /*StringBuffer나 StringBuilder는 초기에 생성할 때 Buffer Size를 주도록 구성되며 이에 의한 생성
        , 확장 오버로드가 발생하기 때문에 의외로 Buffer Size를 잘못 지정할 경우 성능이 떨어질 가능성도 있다.
         하지만 String 클래스의 경우 new에 의한 생성이 아닐 때 초기 컴파일러 분석 단계에서 literal 처리에 의해 최적화가
          될 수 있기 때문에 오히려 빠른 결과를 보여줄 때가 있다. 
*/
    }
    
}

StringBuffer class 역시 Builder class와 동일하게 append로 문자열을 이어 붙일 수 있다.

 

+,concat()의 이어 붙이기 보다 Buffer와Builder의 이어붙이기 연산이 효율적이고 비동기 대응에도 수월합니다.

 

위 코드로 동일하게 "Hello Java" 문자열이 출력됩니다.


 

사용언어 : Java

작성일자 : 2022-05-10

기본 숙지 개념 : Java 기초, 문자열, String class

작업환경 :  VIsual Studio Code

버전 : JDK 17.0.2

 

추천 자료 : 

 

Java Platform SE 7

 

docs.oracle.com

 

 

String concatenation with Java 8

String concatenation is one of the most well-known caveats in Java. Almost all experienced Java developers have already heard or read explanations about when to use String vs StringBuilder/StringBuffer for concatenating Strings. These last months I gave so

pellegrino.link

 

아래 글은 꼭 참고하길 추천

 

[JAVA] 문자열 붙이는 방식의 차이(concat, +, StringBuilder)

자바에서 String타입을 붙일 때 사용하는 방법은 다양하다. 기본 연산자인 + 를 비롯하여 String Builder , concat 모두 들어보거나 써본 용어일 것이다. 근데 동작 방식에 어떤 차이가 있을까? 먼저 결과

devdy.tistory.com

 

 

 

300x250

댓글