본문 바로가기

프로그래밍 언어/코틀린_Kotlin_더파기

Kotlin더파기_07_String_문자열

코딩에서 문자 데이터는 String(문자열)로 나타낸다.

코틀린 표준 라이브러리에는 String 타입의 다양한 함수들이 있다.

이 함수들을 사용하여 문자열을 다루어본다.

 

문자열 부분 추출

#substring( )함수

 

substring함수는 문자열의 부분을 추출하여 반환한다.

 

상수로 선언한 SHOP_NAME (가게 이름)이라는 변수를 만든다.

이 변수에는 String(문자열) 값으로 Wraven's shop (Wraven의 가게)이 저장되어 있다.

이 문자열에서 일부분인 Wraven 만 추출하는 방법을 알아본다.

 

이제 변수 SHOP_NAME에서 Wraven만 추출하여 "한 남자가 Wraven에게 음식을 주문한다."라는 문자열을 출력하는 함수를 만들어 본다.

 

 

9번줄: 함수 이름은 order(주문)이라고 하자.

 

10번줄: 뽑아내야 하는 문자열이 처음 W부터 아포스트로피(') 앞 n 까지이므로

아포스트로피를 표시하는 인덱스 번호를 만들자.

indexOf는 문자열에서 문자의 위치를 나타내는 정수이다.

문자열의 첫번째 문자의 index값은 0이며 다음 문자로 이동하며 1씩 증가한다.

 

indexOfShopName이라는 변수를 하나 만들고 indexOf()함수를 사용하여 아포스트로피에 번호를 매긴다.

문자열에 있는 각 문자는 char 타입이므로 ' 아포스트로피 ' 를 표현하려면 ' 역슬래시' '를 입력하면 된다.

 

11번줄: shopKeeper(가게 주인)이라는 변수를 만들고 여기에 문자열의 일부분을 뽑아내는 substring()함수를 사용하여 저장한다.

substring의 내용은 다음과 같다. substring(범위 0 부터 indexOfShopName까지)

즉, 인덱스 0 은 W를 가리키고, indexOfShopName은 아포스트로피( ' )를 가리킨다.

그러므로 until은 포함되지 않는다는 것을 알 수 있다.

 

escape sequence (이스케이프 시퀀스)

 

위에서 아포스트로피( ' )를 역슬래시+( ' )로 나타낸 것은 문자열에 포함된 특수한 문자를 나타내기 위한 것이다.

이것을 escape sequence라고 한다.

 

각 특수 문자의 이스케이프 시퀀스 표현은 아래와 같다.

 

 

#split( )함수

 

split은 '쪼개다, 분리하다'라는 뜻이다.

문자열의 각 부분을 추출하는데 사용한다.

 

앞에서 만든 order()함수로 펩시콜라를 1000원으로 주문한다고 하자.

order (pepsi, Cola, 1000)

 

인자를 보내기 위해서는 매개변수가 필요하다.

menuData라고 하자.

 

 

이제 split()함수를 사용해서 "그는 1000원으로 펩시 콜라를 구입한다." 라는 문자열을 출력해 보자.

 

13번줄: split함수는 인자로 전달된 delimiters(구분자)로 구분된 문자열의 각 부분을 분리할 수 있다.

분리한 각 부분은 List로 저장하고 반환한다.

 

14~16번줄: split함수로 분리하여 저장된 변수 data를 가져와서 List에 각각 대괄호를 사용하여 인덱스 번호를 붙인다.

 

17번줄: 분리된 각 변수를 String Templete($)를 사용해서 출력할 문자열을 만들어 변수message에 저장한다.

 

실행해서 확인하자.

 

destructuring declaration (해체 선언)

 

해체선언을 사용하면 여러 개의 변수를 한번에 표현할 수 있고 각각 독립적으로 사용할 수 있다.

함수의 반환 타입 List는 해체선언을 지원하므로 아래와 같이 바꿀 수 있다.

 

 

 

해체선언은 List, Map, Pair, data class 등의 타입에서도 사용할 수 있다.

해체선언에 대해서는 다음에 자세히 알아볼 것이다.

 

#replace( )함수

 

이번에는 String 타입을 처리하는 또 다른 함수인 replace함수에 대해 알아본다.

replace는 '대체하다, 바꾸다'라는 뜻이다.

이 함수는 규칙을 만들고 그것에 맞춰 문자를 바꿀 수 있다.

 

예를 들어 위 코드에서 구입한 콜라를 마신 후 펩시콜라 맛있다! 라고 말할 때 트림이 나와 펩시콜라라는 말이 이상하게 나오게 만들어보자.

 

먼저 replacement(대체)라는 함수를 만들어서 문자를 바꿀 규칙을 정한다.

 

 

replace함수는 2개의 인자를 받는다.

 

첫번째 인자는 regex라고 부르는 표현으로 문자의 검색 패턴을 정의한다.

Regex("[aeiou]")

 

두번째 인자는 람다로 변경할 문자를 정의한다.

when (it.value) { ~ }

 

만든 함수를 구현하기 위해 order함수에 문자열을 추가하고 출력해 본다.

 

다시 실행하면 이상한 문자가 섞여 출력될 것이다.

이 replace함수를 이용하여 번역이나 암호로 변경하는데 응용할 수 있다.

 

참고로 String 타입의 문자열은 불변이다.

그러므로 위 코드에서 변경이 일어나는 것은 새로운 문자열을 만들어 변경한 것이다.

 

문자열 비교

 

이번에는 주문한 음료가 콜라가 맞는지 비교하고 만약 주문하지 않으면 트림도 나오지 않을것이므로 replacement함수가 실행되지 않도록 코드를 수정 해보자.

 

 

기존 코드의 30,31번줄은 주석으로 처리한다.

32번줄: 변수 string에 if 조건문을 저장한다. 만약 name 변수값이 문자열 Cola와 같으면 기존대로 출력한다.

34번줄: 그렇지 않으면 "삼다수 주세요." 라고 말한다.

35번줄: string값을 출력한다.

 

참고로 위에서 두 변수가 같은지 비교할 때 동등 비교 연산자(==)를 사용했다.

또 다른 방법은 참조 동등(referential equality) 비교 연산자(===)를 사용하는 것이다.

이 연산자는 같은 타입 인스턴스를 참조하는지 검사할 때 사용한다.

 

위 코드가 잘 되는지 확인하기 위해 main함수의 호출값을 바꿔보자.

 

이제 실행해서 문자열이 아래와 같이 출력되는지 확인한다.

 

한 남자가 주문한다 음식을 Wraven에서

그는 산다 물 삼다수를 500원으로

그는 말한다: 삼다수 주세요.

 

참고: Unicode

 

문자열은 문자(Character)가 모여서 만들어진다. 

문자는 Char 타입의 인스턴스 이다.

Char 타입은 Unicode(유니코드) 이다.

그러므로 문자열의 각 문자는 어떤 문자와 기호도 될 수 있다.

 

문자를 선언하는 방법은 작은 따옴표 안에 문자 또는 유니코드를 넣는다.

유니코드를 사용할 때는 앞에서 언급한 이스케이프 시퀀스를 앞에 붙인다.

 

val capitalA: Char = 'A'

val unicodeCapitalA: Char = ' \u0041 '

 

또한 키보드에 없는 문자를 코드에 나타내려면 유니코드를 사용하면 된다.

 

참고: 문자열의 각 문자를 하나씩 처리하는 forEach( )함수

 

문자열 Unicode를 forEach함수를 사용하여 출력하는 코드이다.

it은 각 문자를 나타내는 매개변수이다.

아래 두 코드를 실행하면 각각 문자를 하나씩 나눠서 출력한다.

\n 을 붙이면 한 칸씩 띄우면서 출력한다.