""
로 둘러쌈// 리터럴 방식
String str1 = "Hello World!";
// 빈 문자열 가능
String str2 = "";
// 인스턴스 생성 방식
String str3 = new String("안녕하세요.");
==
연산자 : 비교하는 두 대상의 주소값을 비교. 동일한 객체인지를 판별 equals
메서드 : 비교하는 두 대상의 값을 비교String hl1 = "Hello";
String hl2 = "Hello";
String wld = "World";
boolean bool1 = hl1 == hl2; // true
boolean bool2 = hl1 == wld; // false
String hl3 = new String("Hello");
String hl4 = new String("Hello");
String hl5 = hl4;
boolean bool3 = hl3 == hl4; // false -> 참조하는 주소값이 각각 다르므로 false가 나옴
boolean bool4 = hl1.equals(hl2); // true
boolean bool5 = hl1.equals(hl3); // true
boolean bool6 = hl3.equals(hl4); // true
boolean bool7 = wld.equals(hl2); // false
// 같은 곳을 참조하는 인스턴스들
boolean bool8 = hl4 == hl5; // true
+ 연산자
- 문자열을 이어붙임
String str1 = "안녕"; String str2 = "하세요."; String str3 = str1 + str2; // "안녕하세요."
String.valueOf(값); // 값이 그대로 문자열로 변환됨
String str1 = String.valueOf(true); // "true"
String str2 = String.valueOf(false); // "false"
String str3 = String.valueOf(123); // "123"
String str4 = String.valueOf(3.14f); // "3.14"
String str5 = String.valueOf('가'); // "가"
String str123 = "123";
byte bytNum = Byte.parseByte(str123); // 123
short srtNum = Short.parseShort(str123); // 123
int intNum = Integer.parseInt(str123); // 123
long lngNum = Long.parseLong(str123); // 123
true
반환boolean bool1 = Boolean.parseBoolean("TRUE");
boolean bool2 = Boolean.parseBoolean("true");
boolean bool3 = Boolean.parseBoolean("T");
이스케이프 표현 | 대체 |
---|---|
\" | 큰따옴표 |
\’ | 작은따옴표 |
\n | 줄바꿈 |
\t | 탭 |
\\ | 백슬래시 하나 |
String str = "Hello \"World\""; // Hello "World"
문자열은 불변(immutable)
- 문자열 스스로를 변경하는 메소드 ❌
- 새 문자열 또는 다른 값을 반환
length
String str = "Hello";
int len = str.length(); // 5
isEmpty
, isBlank
isEmpty
: 문자열의 길이가 0인지 여부 -> isBlack보다 엄격isBlank
: 공백(white space)을 제외한 문자열의 길이가 0인지 여부String str1 = "";
String str2 = " \t\n";
int int1 = str1.length(); // 0
int int2 = str2.length(); // 3
boolean bool1 = str1.isEmpty(); // true
boolean bool2 = str2.isEmpty(); // false
boolean bool3 = str1.isBlank(); // true
boolean bool4 = str2.isBlank(); // true
trim
trim
: 앞 뒤의 공백 제거String str3 = "\t 안 녕 하 세 요. \n"
String str4 = str3.trim(); // "안 녕 하 세 요."
charAt
charAt
: ~번 째 문자 반환String str1 = "어떻게 이별까지 사랑하겠어.";
char ch1 = str1.charAt(0); // '어'
char ch2 = str1.charAt(4); // '이'
// ⭐️ 마지막 문자 얻기
char ch3 = str1.charAt(str1.length() - 1); // .
indexOf, lastIndexOf
indexOf
: 일치하는 첫 문자열의 위치 앞에서부터 카운트해서 int로 반환lastIndexOf
: 일치하는 마지막 문자열의 위치 앞에서부터 카운트해서 int로 반환String str2 = "얄리 얄리 얄라셩 얄라리 얄라";
// 두 번째 인자 : ~번째 이후/이전부터 셈
int int1 = str2.indexOf('얄'); // 0
int int2 = str2.indexOf('얄', 4); // 6
int int3 = str2.indexOf("얄라"); // 6
int int4 = str2.lastIndexOf("얄라"); // 14
int int5 = str2.lastIndexOf("얄라", 12); // 10
// 포함되지 않은 문자는 -1 반환
int int6 = str2.indexOf('욜'); // -1
equals
// 대소문자 구분하여 비교
String str_a1 = "Hello World";
String str_a2 = new String("Hello World");
String str_a3 = "HELLO WORLD";
boolean bool_a0 = str_a1 == str_a2; // false ⚠️ 문자열은 이렇게 비교하지 말 것!
boolean bool_a1 = str_a1.equals(str_a2); // true
boolean bool_a2 = str_a1.equals(str_a3); // false
// equalsIgnoreCase : 대소문자 구분하지 않고 비교
boolean bool_a3 = str_a1.equalsIgnoreCase(str_a3); // true
boolean bool_a4 = str_a2.equalsIgnoreCase(str_a3); // true
contains
, startWith
, endsWith
contains
: 포함 여부startWith
: (주어진 위치에서) 해당 문자열로 시작 여부endsWith
: 해당 문자열로 끝남 여부String str_b1 = "옛날에 호랑이가 한 마리 살았어요.";
boolean bool_b1 = str_b1.contains("호랑이"); // true
boolean bool_b2 = str_b1.contains("나무꾼"); // false
boolean bool_b3 = str_b1.startsWith("옛날에"); // true
boolean bool_b4 = str_b1.startsWith("호랑이"); // false
boolean bool_b5 = str_b1.startsWith("호랑이", 4); // true
boolean bool_b6 = str_b1.endsWith("살았어요."); // true
boolean bool_b7 = str_b1.endsWith("호랑이"); // false
String emailRegex = "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$";
String str_c1 = "judyan@judyan.kr";
String str_c2 = "judyan.judyan.kr";
String str_c3 = "judyan@judyan@kr";
boolean bool_c1 = str_c1.matches(emailRegex); // true
boolean bool_c2 = str_c2.matches(emailRegex); // false
boolean bool_c3 = str_c3.matches(emailRegex); // false
compareTo
compareTo
: 사전순 비교에 따라 양수 또는 음수 반환String str_a1 = "ABC";
String str_a2 = "ABCDE";
String str_a3 = "ABCDEFG";
// 같은 문자열이면 0 반환
int int_a1 = str_a1.compareTo(str_a1); // 0
// 시작하는 부분이 같을 때는 글자 길이의 차이 반환
int int_a2 = str_a1.compareTo(str_a2); // -2
int int_a3 = str_a1.compareTo(str_a3); // -4
int int_a4 = str_a2.compareTo(str_a3); // -2
int int_a5 = str_a3.compareTo(str_a1); // 4
String str_a4 = "HIJKLMN";
// 시작하는 부분이 다를 때는 첫 글자의 정수값 차이 반환
int int_a6 = str_a1.compareTo(str_a4); // -7
int int_a7 = str_a4.compareTo(str_a3); // 7
toUpperCase
, toLowerCase
toUpperCase
: 모두 대문자로 변환toLowerCase
: 모두 소문자로 변환String str_a1 = "Hello, World!";
String str_a2 = str_a1.toUpperCase(); // HELLO, WORLD!
String str_a3 = str_a1.toLowerCase(); // hello, world!
concat
String str_a1 = "안녕";
String str_a2 = "하세요.";
String str_a3 = "반가워요.";
String str_a4 = str_a1.concat(str_a2); // "안녕하세요."
// 메서드 체이닝 -> 모두 문자열을 반환하기 때문에 이어서 사용 가능
String str_a5 = str_a1.concat(str_a2).concat(str_a3); // "안녕하세요.반가워요"
+
연산자와의 차이concat
에는 문자열만 이어붙일 수 있음
concat
은 필요시에만 새 인스턴스 생성 (큰 의미 없음)
null
이 포함될 경우, +
연산자는 이어붙이기 가능 (concat은 NullPointerException 발생)
️ ⭐️ 다중 연산시 생성되는 문자열 인스턴스의 수가 다름
+
연산 : 내부적으로 아래와 같이 최적화 됨 -> 다중 연산시 메모리 절약StringBuilder
, StringBuffer
등 사용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"가 생성되어 메모리 차지
repeat
repeat
: 문자열을 주어진 정수만큼 반복String str_a1 = "hello";
String str_a2 = str_a1(2); // "hellohello"
String str_a3 = str_a1
.concat(" ") // "hello " -> 공백 추가
.repeat(3) // "hello hello hello " -> 공백 추가된 문자열을 3번 반복
.trim(); // "hello hello hello" -> 양쪽 공백을 제거한 최종 결과
substring
substring
: ~번째 문자부터 (~번째 문자까지) 잘라서 반환String str_b1 = "우리는 오렌지 태양 아래 그림자 없이 함께 춤을 춰";
String str_b2 = str_b1.substring(4); // "오렌지 태양 아래 그림자 없이 함께 춤을 춰"
String str_b3 = str_b1.substring(4, 13); // "오렌지 태양 아래"
String str_b4 = str_b1.substring(14, 23); // "그림자 없이 함께"
String piece1 = "오렌지";
String piece2 = "춤을";
String str_b5 = str_b1.substring(
str_b1.indexOf(piece1),
str_b1.indexOf(piece2) + piece2.length()
); // "오렌지 태양 아래 그림자 없이 함께 춤을"
replace
replace
: 주어진 앞의 문자(열)을 뒤어 문자(열)로 치환replaceAll
/ replaceFirst
: 정규표현식 사용 가능. 전부 치환 / 첫 번째 일치부분만 치환String str_c1 = "오늘 점심은 짜장면이야.";
String str_c2 = str_c1.replace("점심", "저녁"); // "오늘 저녁은 짜장면이야."
// 여럿 포함시 모두 치환
String str_c3 = "배고파!! 배고파 죽겠다! 배고파";
String str_c4 = str_c3.replace("배고파", "배불러"); // "배불러!! 배불러 죽겠다! 배불러"
String str_e1 = "02=123.4567_8900";
String str_e2 = str_e1
.replaceAll("[=._]", "-")
.replaceFirst("[-@#]", ")"); // 02)123-4567-8900
toCharArray
, split
toCharArray
: 문자열을 분할하여 문자열의 배열로 반환split
: 주어진 기준으로 (~개까지) 분할하여 문자열 배열로 반환String str1 = "가나다라마바사";
String str2 = "010-1234-5678";
char[] chAry = str1.toCharArray(); // [가,나,다,라,마,바,사]
String[] strAry = str2.split("-"); // ["010","1234","5678"]
formatted
formatted
: 주어진 형식에 따라 문자열 생성
형식 | 설명 |
---|---|
%b | 불리언 |
%d | 10진수 정수 |
%f | 실수 |
%c | 문자 |
%s | 문자열 |
%n | (포맷 문자열 내 줄바꿈) |
String str1 = "%s의 둘레는 반지름 X %d X %f입니다.";
String circle = "원";
int two = 2;
double PI = 3.14;
String str2 = str1.formatted(circle, two, PI); // 13버전
String str3 = String.format(str1, circle, two, PI); // 이전 버전
// "원의 둘레는 반지름 X 2 X 3.140000입니다."
// 시스템의 printf 메소드 : String.format과 같은 형식으로 출력
System.out.printf("%s의 둘레는 반지름 X %d X %f입니다.%n", circle, two, PI);
%n
은 OS별로 일정하게 줄바꿈이 되도록 적절한 개행문자를 넣어줌
- 윈도우 :
\r\n
- 맥&리눅스 :
\n
: 숫자 앞에 오는 플래그 부분에는 ,
, -
, +
, 0
가 올 수 있다
0
: 숫자 출력 시 빈칸이 아닌 0
으로 채우라는 의미-
: 왼쪽 정렬+
: 양수일 경우 앞에 +
를 포함하여 출력하라는 의미,
: 숫자를 3자리마다 ,
로 분리하라는 의미// 정수
int n = 12345;
System.out.printf("%10d%n", n);
System.out.printf("%010d%n", n);
System.out.printf("%+10d%n", n);
System.out.printf("%-10d%n", n);
System.out.printf("%,10d%n", n);
/*
12345
0000012345
+12345
12345
12,345
*/
// 실수
double n = 1234.2;
System.out.printf("%.2f%n", n);
System.out.printf("%10.2f%n", n);
System.out.printf("%+010.2f%n", n);
System.out.printf("%-10.2f%n", n);
System.out.printf("%,10.2f%n", n);
/*
1234.20
1234.20
+001234.20
1234.20
1,234.20
*/
String str = "Hello";
System.out.printf("%.3s%n", str); // 3번째까지만 출력
System.out.printf("%15s%n", str); // 15자리 확보
System.out.printf("%10.2s%n", str); // 10자리 확보, 2번째까지만 출력
System.out.printf("%-10s%n", str); // 10자리 확보, 왼쪽 정렬
/*
Hel
Hello
He
Hello
*/
String emptyStr = "";
String nullStr = null;
boolean b = emptyStr == nullStr; // false
null
문자열 : 힙에 할당되지 않음null
가능Object obj = null;
Integer nullInt = null;
Double nullDbl = null;
출처 - 인프런 '제대로 파는 자바' 강의