8가지 기본형에서 문자형 char
를 배웠었지만, char
는 오직 하나의 문자만을 저장하는 자료형이었습니다. 그리고 우리는 일반적으로 문자 하나보다는 문장, 즉 문자열을 훨씬 많이 사용합니다.
자바에서는 이러한 문자열을 지원하기 위해 String
이라는 문자열 타입을 클래스를 통해 객체 형태로 지원하고 있습니다.
문자열 타입 String
은 참조형 변수이며, 내부적으로 유니코드 형태로 변환되는 char
와 다르게 변환되지 않고 문자 그대로 저장됩니다. 그리고 문자열을 표현할 땐 큰 따옴표"
를 이용합니다.
String
타입은 다음과 같이 선언합니다.
String str1 = "안녕하세요.";
String str2 = "A";
//또는
String str1 = new String("안녕하세요.");
String str2 = new String("A");
String
타입도 문자를 하나 저장할 수 있습니다. 반드시 큰 따옴표로 감싸주어야 문자 하나를 적더라도 String으로 인식됩니다.
문자열 내부에 역슬래시\
를 사용해서 특수한 명령을 넣을 수가 있는데 이를 이스케이프(escape) 문자
라고 부릅니다.
이스케이프 문자
는 특정 기호의 출력이나 출력에 대한 명령을 지시하는데 사용됩니다. 다음 표는 자주 사용되는 이스케이프 문자들입니다.
이스케이프 문자 | 설명 |
---|---|
\* | * 문자 사용 |
\' | ' 문자 사용 |
\" | " 문자 사용 |
\t | tab |
\n | 개행(enter) |
\r | 캐리지 리턴 |
캐리지 리턴(Carriage return)
은 현재 위치에서 (커서를) 줄의 맨 앞으로 이동시킵니다.
Java 13
에서 텍스트 블록
이라는 문법이 추가되었습니다. 텍스트 블록
을 이용하면 이스케이프 문자를 사용하거나, 개행시 +
연산자로 연결을 하지 않고 블록 내부의 문자열을 그대로 출력해줍니다.
String str =
"안녕하세요" +
"\n자바를 배워요.";
System.out.println(str);
+
와 이스케이프 문자를 사용했어야해서 난잡했던 문자열을 텍스트 블록을 이용하면 간단하게 표현됩니다.
String str = """
안녕하세요.
자바를 배워요.
""";
System.out.println(str);
텍스트 블록이 Java14
에 와서 개선된 기능도 있습니다. 기존 텍스트 블록은 문장이 길어져도 엔터를 눌러 개행을 하면 개행을 한 채로 출력이 되었는데요. Java14
이후 버전에서는 이어쓰고 싶은 문장 뒤에 \
를 적어줍니다.
String str = """
안녕
하세요.
자바를 배워요.
""";
System.out.println(str);
String str = """
안녕\
하세요.
자바를 배워요.
""";
System.out.println(str);
대게의 코딩 규칙에서 코드 한 줄당 80자를 권장하고 있기 때문에 80줄이 넘는 텍스트라면 \
를 이용해서 가독성도 챙기고 코딩 규약도 지킬 수 있게됩니다.
지금부터는 String 타입에서 사용할 수 있는 자주 사용되는 메소드 몇 가지를 소개하려고 합니다.
여기서는 자주 사용(주로 코딩테스트 문제)되는 일부 메소드만을 언급하고 있습니다. 더 자세한 내용과 더 많은 메소드는 공식 문서에서 찾아보실 수 있습니다.
문자열의 전체 길이를 취득하고 싶을땐 length()
메소드를 사용합니다. 공백을 포함한 문자열 길이를 반환합니다.
문자열.length();
String str = "야구 축구 농구";
System.out.println(str.length());
문자열 비교는 등가 연산자 ==
와 equals()
메소드를 이용해서 문자열을 비교할 수 있습니다.
==
를 사용했을 때 문자열의 비교는 문자열을 어떻게 선언했는지에 따라서 조금 다른 결과를 보여줍니다.
다음 코드는 "사과"
라는 문자열을 저장한 4개의 문자열 변수입니다.
String str1 = "사과";
String str2 = "사과";
String str3 = new String("사과");
String str4 = new String("사과");
str1
과 str2
는 리터럴 형태로 선언했고, str3
와 str4
는 new 연산자를 이용해 String 객체를 생성하고 대입하는 방식을 선언했습니다. 그렇다면 다음 코드의 결과는 어떻게 될까요?
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str3 == str4);
분명 다 같은 "사과"
문자열을 가졌지만, 어떻게 선언하냐에 따라서 다른 결과를 보여줍니다.
자바에서는 문자열을 선언할 때 대입하는 리터럴이 동일한 경우 같은 String 객체를 공유하게 되어있습니다. 따라서 str1, str2
가 가리키는 "사과"의 주소값은 동일한 String 객체를 가리키게 됩니다. 그래서 ==
연산자의 결과가 true로 나타나는 것입니다.
반대로 new 연산자를 이용해 직접 String 객체를 생성하는 경우는 문자열이 같더라도 주소가 다른 객체이기 때문에 ==
연산자의 결과가 false로 나타납니다.
그래서 단순히 문자열이 같은지 아닌지를 비교하고 싶다면 equals()
메소드를 이용합니다.
문자열.equals(비교할_문자열)
System.out.println(str1.equals(str3));
아까와는 달리 단순히 문자열 그 자체만을 비교했기 때문에 true라는 결과를 반환합니다.
문자열에서 특정한 위치의 문자를 추출하고 싶다면 chatAt()
메소드를 사용합니다.
문자열.charAt(n)
//n은 추출할 인덱스
문자열도 또한 배열처럼 각 문자의 인덱스가 0
번 부터 시작합니다. 그리고 공백 또한 문자로 포함됩니다.
"Hello world!"라는 문자열에서 H
와 !
를 추출해서 출력해보겠습니다.
String str = "Hello world!";
System.out.println(str.charAt(0));
System.out.println(str.charAt(11));
문자열에서 특정 문자나 문자열의 위치를 검색하고자 할 때는 indexOf()
메소드를 사용합니다. indexOf()
는 가장 처음 만나는 문자열의 첫 인덱스 위치를 반환합니다. 만약, 찾는 문자열이 문자열 내에 없다면 -1
을 반환합니다.
String str = "Hello world!";
System.out.println(str.indexOf("w"));
System.out.println(str.indexOf("a"));
단순히 문자열 내에 문자가 포함되어있는지 여부만을 알고 싶다면 contatins()
를 사용합니다. 존재하면 true, 없으면 false를 반환합니다.
String str = "Hello world!";
System.out.println(str.contains("w"));
문자열에서 특정 부분의 문자열을 잘라서 가져오고 싶다면 substring()
을 이용합니다.
substring(start_idx, (end_idx))
만약, 인덱스를 하나만 인수로 전달하면 해당 인덱스부터 문자열 끝까지 자르고, 인덱스를 두 개 전달하면 먼저 온 인덱스부터 나중에 온 인덱스 까지만을 잘라냅니다.
String str = "Hello world!";
System.out.println(str.substring(5));
System.out.println(str.substring(5, 8));
문자열이 특정한 문자로 구성되었을 경우 해당 문자를 기준으로 분리하고자 한다면 split()
메소드를 이용합니다. 분리되어 취득한 문자열은 각각의 별개의 문자열로 분리되기 때문에 배열에 결과를 담거나 특정 부분만 따로 저장해야합니다.
문자열.split(regex)
regex
는 정규표현식입니다. 정규표현식에 대한 내용은 Inpa님의 블로그에 정말 잘 정리되어 있습니다. 단순히 정규표현 외에도 문자 하나를 지정할 수도 있습니다.
다음 코드처럼 쉼표,
로 구분된 문장을 분리해서 취득해보겠습니다.
String str = "사과,키위,바나나,오렌지,복숭아";
String[] splitStr = str.split(",");
for (int i = 0; i < splitStr.length; i++) {
System.out.println(splitStr[i]);
}
문자열에서 특정 부분을 뽑아 다른 문자열로 바꾸고 싶을때는 replace()
를 이용합니다. replace()
는 새로운 문자열을 만들어서 반환하기 때문에 결과값을 담아줄 문자열 변수를 하나 준비해야합니다.
문자열.replace(교체대상_문자열, 교체할_문자열);
String str = "사과 고등어 오렌지 복숭아";
String changeStr = str.replace("고등어", "바나나"); //"고등어"를 찾아서 "바나나"로 교체
System.out.println(changeStr);
만약 찾는 문자열이 없다면 원래 문자열을 그대로 반환합니다.