Java - 문자열의 메소드들(2)

민찬홍·2023년 8월 24일

Java

목록 보기
10/31
post-thumbnail

문자열의 메소드들이 생각보다 너무 길어져서 2개로 나누어서 진행한다.

이어붙이기

		//  💡 concat : 문자열을 뒤로 이어붙임
        String str_a1 = "슉-";
        String str_a2 = "슈슉-";
        String str_a3 = "슈슈슉-";

        String str_a4 = str_a1 + str_a2 + str_a3;

        String str_a5 = str_a1.concat(str_a2);

        //  ⭐️ 메서드 체이닝
        String str_a6 = str_a1
                .concat(str_a2)
                .concat(str_a3)
                .concat(str_a4)
                .concat(str_a5);

메서드 체이닝에 대해 간단하게 설명하면 .concat 메서드는 문자열을 반환한다. 따라서 문자열을 반환하기에 문자열로 취급하고 계속 .concat메서드를 이어붙일 수 있는 것이다.

그렇다면 위에 보이는 +를 사용해서 문자열을 이어붙이는 것과 .concat메소드를 사용해서 문자열을 이어붙이는 것의 차이는 무엇일까
크게 네가지가 있다.

		//  ⭐️ + 연산자와의 차이

        String str_b1 = "ABC";

        //  1. concat에는 문자열만 이어붙일 수 있음
        //. + 는 다른 자료형도 이어붙일 수 있음
        String str_b2 = str_b1 + true + 1 + 2.34 + '가';
        String str_b3 = str_b1
                //  .concat(true)
                //  .concat(1)
                //  .concat(2.34)
                //  .concat('가')
                ;

        //  2. concat은 필요시에만 새 인스턴스 생성 (큰 의미 없음)
        String str_b4 = str_b1 + "";
        String str_b5 = str_b1.concat("");

        int str_b1Hash = System.identityHashCode(str_b1);
        int str_b4Hash = System.identityHashCode(str_b4);
        int str_b5Hash = System.identityHashCode(str_b5);
        
        
        //  3. null이 포함될 경우

        String str_c1 = null;

        //  + 연산자는 null과 이어붙이기 가능
        String str_c3 = str_c1 + null + "ABC";

        //  ⚠️ concat은 NullPointerException 발생
        //    concat은 무조건 자료형이 문자열이고 null이 아니어야함
        
        //String str_c4 = str_c1.concat("ABC");
        //String str_c5 = "ABC".concat(str_c1);
        
        
        //  4. ⭐️ 다중 연산시 생성되는 문자열 인스턴스의 수가 다름

        String str_d1 = "a" + "b" + "c" + "d";

        // + 연산은 내부적으로 아래와 같이 최적화됨 (이후 배움)
        String str_d2 = new StringBuilder("a")
                .append("b")
                .append("c")
                .append("d")
                .toString(); // "abcd"가 생성됨
        // "a", "b", "c", "d", "abcd"가 생성되어 메모리 차지

        //  concat은 매 번 문자열을 반환하므로
        String str_d3 = "a"
                .concat("b") // "ab"가 생성됨
                .concat("c") // "abc"가 생성됨
                .concat("d"); // "abcd"가 생성됨
        // "a", "b", "c", "d", "ab", "abc", "abcd"가 생성되어 메모리 차지

concat은 메서드 체이닝의 부분에서 조금 더 유용하지만, 메모리효율적인 측면에서는 그냥 +를 쓰는게 더 나을때도 많다. 엄청 깊게 알 필요는 없지만, 그냥 어떤 작동원리에서 이런 결과가 나오는지 알아두면 좋은 것 같다.

  • +연산 : 다중 연산 시 메로리 절약
    • ❗️반복 연산(for 루프 등) 에는 무의미
    • 반복 연산시에는 명시적으로 StringBuilder... append 사용
  • 성능이 중요하다면 이후 배울 StringBuilder, StringBuffer 등 사용
    • 그렇지 않을 시 상황에 따라 메서드 체이닝 등의 편의를 위해 concat 사용

반복하기

		String str_a1 = "덜컹";

        // 💡 repeat : 문자열을 주어진 정수만큼 반복
        String str_a2 = str_a1.repeat(2);
        String str_a3 = str_a1
                .concat(" ")
                .repeat(3)
                .trim();   // 양쪽 공백 제거 

잘라오기

		String str_b1 = "대한민국 다 job 구하라 그래";

        //  💡 substring : ~번째 문자부터 (~번째 문자까지) 잘라서 반환
        String str_b2 = str_b1.substring(7); // str_b2 : "job 구하라 그래"
        String str_b3 = str_b1.substring(7, 10); // str_b3 : "job"
        String str_b4 = str_b1.substring(11, 14); // str_b4 : "구하라"

        String piece1 = "다 ";
        String piece2 = "구하라";
        String str_b5 = str_b1.substring(
                str_b1.indexOf(piece1),
                str_b1.indexOf(piece2) + piece2.length()
        );

치환

		//  💡 replace : 주어진 앞의 문자(열)을 뒤의 문자(열)로 치환
        String str_c1 = "점심에 보쌈집에 가서 수육을 먹었다.";
        String str_c2 = str_c1.replace("보쌈", "중국");

        //  여럿 포함시 모두 치환
        String str_c3 = "밥 좀 먹자, 응? 야, 밥 좀 먹자고 밥 밥 밥";
        String str_c4 = str_c3.replace("밥", "빵");

        // ⭐️ 원본은 바뀌지 않는 점 확인
        
        
        //  메서드 체이닝
        String str_d1 = "하여튼 호의가 반복되면 권리인 줄 알아";
        String str_d2 = str_d1
                .replace("하여튼", "아무튼")
                .replace("호의", "호이".repeat(2))
                .replace("권리", "아기공룡 둘리");
                
                
                
        String str_e1 = "02=123.4567_8900";

        //  💡 replaceAll / replaceFirst : ⭐️ 정규표현식 사용 가능
        //  전부 치환 / 첫 번째 일치부분만 치환
        String str_e2 = str_e1
                .replaceAll("[=._]", "-")   // str_e2 : "02-123-4567-8900"
                .replaceFirst("[-@#]", ")");  // str_e2 : "02)123-4567-8900"

배열 반환

		String str1 = "가나다라마";
        String str2 = "010-1234-5678";
        String str3 = "하나 둘 셋 넷 다섯";

        //  💡 toCharArray : 문자열을 분할하여 문자열의 배열로 반환
        char[] chAry1 = str1.toCharArray();
        char[] chAry2 = str3
                .replace(" ", "")
                .toCharArray();

        //  💡 split : 주어진 기준으로 (~개까지) 분할하여 문자열 배열로 반환
        String[] strAry1 = str1.split("");
        String[] strAry2 = str2.split("-");
        String[] strAry3 = str3.split(" ");
        String[] strAry4 = str3.split(" ", 3);  // 잘리는 개수 제한
profile
백엔드 개발자를 꿈꿉니다

0개의 댓글