[TIL] 자바에서 char와 String

revo·2025년 12월 31일

자바

목록 보기
3/30
post-thumbnail

char는 하나의 문자이고, String은 문자의 집합이다

가장 기본적인 정의부터 정확히 잡자.

  • char단 하나의 문자를 저장하는 기본 타입
  • String여러 개의 char로 이루어진 객체

이 차이는 단순한 표현 차이가 아니라, 타입 수준에서 완전히 다른 취급을 받는다.

char c = 'A';
String s = "A";

겉보기엔 비슷하지만, 내부 구조와 사용 방식은 전혀 다르다.


char는 기본 타입이고, String은 객체다

  • charprimitive type
  • Stringreference 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는 작은 단위, String은 연산 단위다

char는 말 그대로 문자 하나만 표현한다. 그래서 연산이 매우 제한적이다.

char c = 'a';
c++;
System.out.println(c); // b

하지만 문자열 연산은 String의 영역이다.

String s = "ab";
s += "c";
System.out.println(s); // abc

문자를 "다룬다"는 관점에서는 String이 훨씬 많은 기능을 제공한다.


char 배열과 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이 불변이라는 사실은 단순한 구현 디테일이 아니다.

String s = "abc";
s = s + "d";

이 코드는 "abcd"로 문자열을 수정한 것처럼 보이지만, 실제로는 새로운 String 객체를 생성한 것이다.

문자열을 자주 변경해야 한다면 StringBuilder를 사용해야 하는 이유가 여기에 있다.


입력 처리에서 char와 String이 갈리는 지점

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

    • 객체
    • 여러 문자
    • 불변
    • 문자열 연산과 입력 처리의 기본 단위

0개의 댓글