[Java] 문자열 타입 String

Bam·2024년 2월 27일
0

Java

목록 보기
22/98
post-thumbnail

문자열 타입 String

8가지 기본형에서 문자형 char를 배웠었지만, char는 오직 하나의 문자만을 저장하는 자료형이었습니다. 그리고 우리는 일반적으로 문자 하나보다는 문장, 즉 문자열을 훨씬 많이 사용합니다.

자바에서는 이러한 문자열을 지원하기 위해 String이라는 문자열 타입을 클래스를 통해 객체 형태로 지원하고 있습니다.

문자열 타입 String참조형 변수이며, 내부적으로 유니코드 형태로 변환되는 char와 다르게 변환되지 않고 문자 그대로 저장됩니다. 그리고 문자열을 표현할 땐 큰 따옴표"를 이용합니다.

String타입은 다음과 같이 선언합니다.

String str1 = "안녕하세요.";
String str2 = "A";

//또는
String str1 = new String("안녕하세요.");
String str2 = new String("A");

String타입도 문자를 하나 저장할 수 있습니다. 반드시 큰 따옴표로 감싸주어야 문자 하나를 적더라도 String으로 인식됩니다.

이스케이프 문자

문자열 내부에 역슬래시\를 사용해서 특수한 명령을 넣을 수가 있는데 이를 이스케이프(escape) 문자라고 부릅니다.

이스케이프 문자는 특정 기호의 출력이나 출력에 대한 명령을 지시하는데 사용됩니다. 다음 표는 자주 사용되는 이스케이프 문자들입니다.

이스케이프 문자설명
\**문자 사용
\''문자 사용
\""문자 사용
\ttab
\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 메소드

지금부터는 String 타입에서 사용할 수 있는 자주 사용되는 메소드 몇 가지를 소개하려고 합니다.

여기서는 자주 사용(주로 코딩테스트 문제)되는 일부 메소드만을 언급하고 있습니다. 더 자세한 내용과 더 많은 메소드는 공식 문서에서 찾아보실 수 있습니다.

문자열 길이 취득하기 length()

문자열의 전체 길이를 취득하고 싶을땐 length() 메소드를 사용합니다. 공백을 포함한 문자열 길이를 반환합니다.

문자열.length();
String str = "야구 축구 농구";

System.out.println(str.length());

문자열 비교하기 equals()

문자열 비교는 등가 연산자 ==equals()메소드를 이용해서 문자열을 비교할 수 있습니다.

== 연산자의 문자열 비교

==를 사용했을 때 문자열의 비교는 문자열을 어떻게 선언했는지에 따라서 조금 다른 결과를 보여줍니다.

다음 코드는 "사과"라는 문자열을 저장한 4개의 문자열 변수입니다.

String str1 = "사과";
String str2 = "사과";
String str3 = new String("사과");
String str4 = new String("사과");

str1str2는 리터럴 형태로 선언했고, str3str4는 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라는 결과를 반환합니다.


특정 문자 추출하기 charAt()

문자열에서 특정한 위치의 문자를 추출하고 싶다면 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(), contains()

문자열에서 특정 문자나 문자열의 위치를 검색하고자 할 때는 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()을 이용합니다.

substring(start_idx, (end_idx))

만약, 인덱스를 하나만 인수로 전달하면 해당 인덱스부터 문자열 끝까지 자르고, 인덱스를 두 개 전달하면 먼저 온 인덱스부터 나중에 온 인덱스 까지만을 잘라냅니다.

String str = "Hello world!";

System.out.println(str.substring(5));
System.out.println(str.substring(5, 8));

문자열 분리하기 split()

문자열이 특정한 문자로 구성되었을 경우 해당 문자를 기준으로 분리하고자 한다면 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()는 새로운 문자열을 만들어서 반환하기 때문에 결과값을 담아줄 문자열 변수를 하나 준비해야합니다.

문자열.replace(교체대상_문자열, 교체할_문자열);
String str = "사과 고등어 오렌지 복숭아";
String changeStr = str.replace("고등어", "바나나");	//"고등어"를 찾아서 "바나나"로 교체

System.out.println(changeStr);

만약 찾는 문자열이 없다면 원래 문자열을 그대로 반환합니다.

0개의 댓글