가장 기본적인 정의부터 정확히 잡자.
char → 단 하나의 문자를 저장하는 기본 타입String → 여러 개의 char로 이루어진 객체이 차이는 단순한 표현 차이가 아니라, 타입 수준에서 완전히 다른 취급을 받는다.
char c = 'A';
String s = "A";
겉보기엔 비슷하지만, 내부 구조와 사용 방식은 전혀 다르다.
char는 primitive typeString은 reference type (객체)char a = 'a';
char b = 'a';
System.out.println(a == b); // true
String x = "a";
String y = "a";
System.out.println(x == y); // true or false? (상황에 따라 다름)
String은 객체이기 때문에, ==는 값 비교가 아니라 참조 비교다.
문자열 비교는 반드시 equals()를 써야 한다.
System.out.println(x.equals(y)); // true
char는 말 그대로 문자 하나만 표현한다. 그래서 연산이 매우 제한적이다.
char c = 'a';
c++;
System.out.println(c); // b
하지만 문자열 연산은 String의 영역이다.
String s = "ab";
s += "c";
System.out.println(s); // abc
문자를 "다룬다"는 관점에서는 String이 훨씬 많은 기능을 제공한다.
char[] arr = {'a', 'b', 'c'};
String s = "abc";
겉으로 보면 같은 데이터처럼 보이지만, 성격은 다르다.
char[] → 문자 배열, 자유롭게 수정 가능String → 불변(immutable) 객체, 한 번 만들어지면 내부 값이 바뀌지 않음arr[0] = 'z'; // 가능
s.charAt(0) = 'z'; // 불가능 (컴파일 에러)
String은 불변이라 직접 수정이 안 되므로, 문자 단위 조작이 필요할 때는 char[]로 변환 후 수정하고 다시 String으로 만드는 패턴을 쓴다.
String s = "아구몬";
// String → char[]
char[] arr = s.toCharArray(); // ['아', '구', '몬']
// 개별 문자 조작
arr[0] = '워';
// char[] → String
String result = new String(arr); // "워구몬"
String이 불변이라는 사실은 단순한 구현 디테일이 아니다.
String s = "abc";
s = s + "d";
이 코드는 "abcd"로 문자열을 수정한 것처럼 보이지만, 실제로는 새로운 String 객체를 생성한 것이다.
문자열을 자주 변경해야 한다면 StringBuilder를 사용해야 하는 이유가 여기에 있다.
String str = br.readLine();
char c = str.charAt(0);
String으로 들어온다charAt()으로 꺼낸다반대로, 한 글자만 입력받는다고 해서 char로 직접 입력받을 수는 없다.
String s = "아구몬 그레이몬 워그레이몬";
s.length(); // 13
s.charAt(0); // '아'
s.substring(4); // "그레이몬 워그레이몬"
s.substring(4, 7); // "그레이" — 4 이상 7 미만
s.contains("그레이몬"); // true
s.startsWith("아구몬"); // true
s.endsWith("워그레이몬"); // true
s.indexOf("그레이몬"); // 4 — 처음 등장하는 위치
s.lastIndexOf("그레이몬"); // 9 — 마지막 등장하는 위치
" 아구몬 ".strip(); // "아구몬" — Java 11+, 아스키 + 유니코드 공백까지 처리
" 아구몬 ".trim(); // "아구몬" — ASCII 공백만 처리
"agumon".toUpperCase(); // "AGUMON"
"AGUMON".toLowerCase(); // "agumon"
s.replace("그레이몬", "가루루몬");
"아구몬,가루루몬,그레이몬".split(","); // ["아구몬", "가루루몬", "그레이몬"]
String.join("-", "아구몬", "가루루몬"); // "아구몬-가루루몬"
"".isEmpty(); // true — 길이가 0
" ".isEmpty(); // false
" ".isBlank(); // true — Java 11+, 공백만 있어도 true
String.format("%s의 레벨은 %d입니다.", "아구몬", 10);
// "아구몬의 레벨은 10입니다."
char
String