Search

String 클래스

변경 불가능한(immutable) 클래스

String 클래스에는 문자열을 저장하기 위해문자열 배열 참조변수(char[]) value를 인스턴스 변수로 정의
인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수(value)에 문자형 배열(char[])로 저장되는 것
public final class String implements java.io.Serializable, Comparable { private char[] value; ...
Java
한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽기만 가능하고 변경 불가
+ 연산자로 인한 문자열 결합은 새로운 인스턴스를 생성하는 것 → 메모리 공간을 차지하므로 가능한 결합횟수를 줄이자!
String a = "a"; String b = "b"; a = a + b;
Java
문자열 결합이나 추출은 문자열 변경이 가능StringBuffer 클래스 사용 추천

문자열의 비교

문자열 만드는 두 가지 방법
문자열 리터럴을 지정
String 클래스의 생성자를 사용
// 이미 존재하는 String 인스턴스를 재사용 String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨 String str2 = "abc"; // 문자열 리터럴 "abc"의 주소가 str2에 저장됨 // str1 == str2 -> true // new 연산자에 의해 메모리가 할당되고 새로운 인스턴스 생성 String str3 = new String("abc"); // 새로운 String 인스턴스 생성 String str4 = new String("abc"); // 새로운 String 인스턴스 생성 // str3 == str4 -> false // equals를 사용할 경우 문자열 내용을 비교하기 때문에 두 경우 모두 true
Java
StringEx1.java

문자열 리터럴

자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시 클래스 파일에 저장됨.
같은 내용의 문자열 리터럴은 한번만 저장되므로, 문자열 리터럴도 String 인스턴스
한번 생성하면 내용 변경이 불가하니 하나의 인스턴스를 공유하면 됨.
StringEx2.java

빈 문자열(empty string)

길이가 0인 배열도 존재 가능
char형 배열도 길이가 0인 배열 생성 가능
길이가 0인 배열을 내부적으로 가지고 있는 문자열이 바로 빈 문자열
String s="";
참조변수 s가 참조하는 String 인스턴스는 내부에 new char[0]과 같이 길이가 0인 char형 배열을 저장하고 있는 것\
char[] chArr = new char[0]; // 길이가 0인 배열 int[] iArr = { }; // 길이가 0인 int 배열
Java
char형 변수에는 반드시 하나의 문자 지정 필요
char c =''; // 불가능 char c = ' '; // 공백으로 초기화
Java
StringEx3.java

String 클래스의 생성자와 메소드

String(String s) : 주어진 문자열(s)를 갖는 String 인스턴스 생성
String s = new String("Hello"); // s = "Hello"
Java
String(char[] value) : 주어진 문자열(value)을 갖는 String 인스턴스 생성
char[] c = {'H', 'e', '1', '1', 'o'}; String s = new String(c); // s = "Hello"
Java
String(StringBuffer buf) : StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스 생성
StringBuffer sb = new StringBuffer("Hello"); String s = new String(sb); // s = "Hello"
Java
char charAt(int index) : 지정된 위치(index)에 있는 문자를 알려줌. (index는 0부터 시작)
String s = "Hello"; String n "0123456"; char c = s.charAt(1); // c = 'e' char c2 = n.charAt(1); // c2 = '1'
Java
int compareTo(String str) : 문자열(str)과 사전순서로 비교. 같으면 0, 사전순으로 이전이면 음수, 이후면 양수 반환
int i = "aaa".compareTo("aaa"); // i = 0 int i2 = "aaa".compareTo("bbb"); // i2 = -1 int i3 = "bbb".compareTo("aaa"); // i3 = 1
Java
String concat(String str) : 문자열(str)을 뒤에 덧붙임.
String s = "Hello"; String s2 = s.concat(" World"); // c2 = "Hello World"
Java
boolean contains(CharSequence s) : 지정된 문자열(s)이 포함되었는지 검사
String s = "abcdefg"; boolean b = s.contains("bc"); // b = true
Java
boolean endsWith(String suffix) : 지정된 문자열(suffix)로 끝나는지 검사
String file = "Hello.txt"; boolean b = file.endsWith("txt"); // b = true
Java
boolean equals(Object obj) : 매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열을 비교 obj가 String이 아니거나 문자열이 다르면 false 반환
String s = "Hello"; boolean b = s.equals("Hello"); // b = true boolean b2 = s.equals("hello"); // b2 = false
Java
boolean equalsIgnoreCase(String str) : 문자열과 String 인스턴스의 문자열을 대소문자 구분없이 비교
String s = "Hello"; boolean b = s.equalsIgnoreCase("HELLO"); // b = true boolean b2 = s.equalsIgnoreCase("heLLo"); // b2 = true
Java
int indexOf(int ch) : 주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려줌. 못찾으면 -1 반환(index는 0부터 시작)
String s = "Hello"; int idx1 = s.indexOf('o'); // idx1 = 4 int idx2 = s.indexOf('k'); // idx2 = -1
Java
int indexOf(int ch, int pos) : 주어진 문자(ch)가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 위치(index)를 알려줌. 못찾으면 -1 반환(index는 0부터 시작)
String s = "Hello"; int idx1 = s.indexOf('e', 'o'); // idx1 = 1 int idx2 = s.indexOf('e', 'k'); // idx2 = -1
Java
int indexOf(String str) : 주어진 무낮열이 존재하는지 확인하여 그 위치(index)를 알려줌. 없으면 -1 반환(index는 0부터 시작)
String s ="ABCDEFG"; int idx = s.indexOf("CD"); // idx = 2
Java
String intern() : 문자열을 상수풀(constant pool)에 등록 이미 상수풀에 같은 내용의 문자열이 있을 경우 그 문자열의 주소값 반환
String s = new String("abc"); String s2 = new String("abc"); boolean b = (s == s2); // b = false boolean b2 = s.equals(s2); // b2 = true boolean b3 = (s.intern() == s2.intern()); // b3 = true
Java
int lastIndexOf(int ch) : 지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아 위치(index)를 알려줌. 못찾으면 -1 반환
String s = "java.lang.Object"; int idx1 = s.lastIndexOf('.'); // idx1 = 9 int idx2 = s.indexOf('.'); // idx2 = 4
Java
int lastIndexOf(String str) : 지정된 문자열을 인스턴스의 문자열 끝에서부터 찾아 위치(index)를 알려줌. 못찾으면 -1 반환
String s = "java.lang.java"; int idx1 = s.lastIndexOf("java"); // idx1 = 10 int idx2 = s.indexOf("java"); // idx2 = 0
Java
int length() : 문자열의 길이를 알려줌.
String s = "Hello"; int length = s.length(); // length = 5
Java
String replace(char old, char nw) : 문자열 중 문자(old)를 문자(nw)로 바꾼 문자열 반환
String s = "Hello"; String s1 = s.replace('H', 'C'); // s1 = "Cello"
Java
String replace(CharSequence old, CharSequence nw) : 문자열 중 문자열(old)을 새로운 문자열(nw)로 모두 바꾼 문자열을 반환
String s = "Hellollo"; String s1 = s.replace("11", "LL"); // s1="HeLLoLLo"
Java
String replaceAll(String regex, String replacement) : 문자열 중 지정된 문자열(regex)과 일치하는 것을 새로운 문자열(replacement)로 모두 변경
String ab = "AABBAABB"; String r = ab.replceAll("BB", "bb"); // r = "AAbbAAbb"
Java
String replaceFirst(String regex, String replacement) : 문자열 중 지정된 문자열(regex)과 일치하는 것 중, 첫 번째 것만 새로운 문자열(replacement)로 변경
String ab = "AABBAABB"; String r = ab.replceFirst("BB", "bb"); // r = "AAbbAABB"
Java
String[] split(String regex) : 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환
String animals = "dog, cat, bear"; String[] arr = animals.split(","); // arr[0] = "dog" // arr[1] = "cat" // arr[2] = "bear"
Java
String[] split(String regex, int limit) : 문자열을 지정된 분리자(regex)로 나누어 문자열 배 열에 담아 반환. 단, 문자열 전체를 지정된 수(limt)로 자름
String animals = "dog, cat, bear"; String[] arr = animals.split(",", 2); // arr[0] = "dog" // arr[1] = "cat,bear"
Java
boolean startsWith (String prefix) : 주어진 문자열(prefix)로 시작하는지 검사
String s = "java.lang.Obejct"; boolean b = s.startsWith("java"); // b = true boolean b2 = s.startsWith("lang"); // b = false
Java
String substring(int begin), String substring(int begint, int end) : 주어진 시작위치(begin)부터 끝 위치(end) 범위에 포함된 문자열을 얻음. 이 때, 시작위치의 문자는 범위에 포함되지만, 끝 위치의 문자는 포함되지 않음. (begint ≤ x < end)
String s = "java.lang.Obejct"; String c = s.substring(10); // c = "Object" String p = s.substring(5, 9); // p = "lang"
Java
String toLowerCase() : String 인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환해 반환
String s = "Hello"; String s1 = s.toLowerCase(); // s1 = "hello"
Java
String toString() : String 인스턴스에 저장되어 있는 문자열 반환
String s = "Hello"; String s1 = s.toString(); // s1 = "Hello"
Java
String toUpperCase() : String 인스턴스에 저장되어 있는 모든 문자열으 대문자로 변환해 반환
String s = "Hello"; String s1 = s.toUpperCase(); // s1 = "HELLO"
Java
String trim() : 문자열 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환 이 때 문자열 중간에 있는 공백은 제거되지 않음.
String s = " Hello World "; String s1 = s.trim; // s1 = "Hello World"
Java
Static String valueOf(boolean b)
Static String valueOf(char c)
Static String valueOf(int i)
Static String valueOf(long l)
Static String valueOf(float f)
Static String valueOf(double d)
Static String valueOf(Object o)
: 지정된 값을 문자열로 변환하여 반환. 참조변수의 경우, toString()을 호출한 결과를 반환
String b = String.valueOf(true); // b = "true" String c = String.valueOf('a'); // c = "a" String i = String.valueOf(100); // i = "100" String l = String.valueOf(100L); // l = "100" String f = String.valueOf(10f); // f = "10.0" String d = String.valueOf(10.0); // d = "10.0" java.util.Date dd = new java.util.Date(); String date = String.valueOf(dd); // // date = "Wed Nov 10 17:09:14 KST 2021"
Java

join()과 StringJoiner

join()
여러 문자열 사이에 구분자를 넣어서 결합
구분자로 문자열을 자르는 split()과 반대의 작업
String animals = "dog,cat,bear"; String[] arr = animals.split(","); // 문자열을 ','로 구분자로 나눠서 배열에 저장 String arr = String.join("-", arr); // 배열의 문자열을 '-'로 구분해서 결합 System.out.println(str); // dog-cat-bear
Java
java.util.StringJoiner 클래스를 사용해서도 문자열 결합 가능
StringJoiner sj = new StringJoiner("," , "[" , "]"); String[] strArr = { "aaa", "bbb", "ccc" }; for (String s : strArr) sj.add(s.toUpperCase()); System.out.println(sj.toString()); // [AAA, BBB, CCC]
Java
StringEx4.java

문자 인코딩 변환

getBytes(String charsetName)
문자열의 문자 인코딩을 다른 인코딩으로 변경 가능
자바는 UTF-16, 문자열 리터럴에 포함되는 문자들은 OS의 인코딩 사용
한글 Windows의 경우 CP949를 사용하며, UTF-8변경로 위해선
byte[] utf8_str = "가".getBytes("UTF-8"); // 문자열을 UTF-8로 반환 String str = new String(utf8_str, "UTF-8"); // byte배열을 문자열로 반환
Java
StringEx5.java

String.format()

format()
형식화된 문자열을 만들어내는 간단한 방법
printf()와 사용법이 동일
String str = String.format("%d 더하기 %d는 %d입니다.", 3, 5, 3+5); System.out.println(str); // 3 더하기 5는 8입니다.
Java

기본형 값과 String 상호 변환

기본형 값 → String : 빈 문자열 "" 더하기 또는 valueOf() 사용
int i = 100; String str1 = i + ""; String str2 = String.valueOf(i)
Java
String → 기본형 값 : valueOf() 또는 parseInt() 사용
int i = Integer.parseInt("100"); int i2 = Integer.valueOf("100"); // 기본적으로 두 메서드는 같음. // valueOf() 메소드 내부에서 parseInt()를 호출 public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); }
Java
StringEx6.java
parseInt()parseFloat() 같은 메소드는 문자열에 공백 또는 문자가 포함되어 있는 경우 변환 시 예외(NumberFormatException)가 발생할 수 있으므로 주의!
공백 제거를 위해 trim()을 사용
int val = Integer.parseInt(" 123 ".trim()); // 문자열 양 끝 공백 제거 후 변환
Java
StringEx7.java

참고 자료