문자열의 메소드들이 생각보다 너무 길어져서 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은 메서드 체이닝의 부분에서 조금 더 유용하지만, 메모리효율적인 측면에서는 그냥 +를 쓰는게 더 나을때도 많다. 엄청 깊게 알 필요는 없지만, 그냥 어떤 작동원리에서 이런 결과가 나오는지 알아두면 좋은 것 같다.
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); // 잘리는 개수 제한