트랙
/
Swift
Swift
/
연습 문제
/
Cal의 맞춤 간판 가게
Cal의 맞춤 간판 가게

Cal의 맞춤 간판 가게

학습 연습 문제

소개

문자열은 텍스트 데이터를 나타내요. Swift에서 String은 Character 값이 순서대로 나열된 컬렉션이고, 각 문자는 유니코드 문자를 나타내요.

문자열은 문자열 리터럴로 만들어요. 문자열 리터럴은 큰따옴표(")로 둘러싼 문자의 나열이에요. 여러 줄 문자열에는 큰따옴표 세 개(""")를 사용해요:

let hello: String = "Hello, World!"

let poem: String = """
Roses are red,
Violets are blue.
Sugar is sweet,
And so are you.
"""

Swift의 문자열은 Foundation 프레임워크의 NSString 클래스와 매끄럽게 이어져서, 폭넓은 텍스트 처리 기능을 활용할 수 있어요.

문자

Character는 하나의 확장 문자소 클러스터를 나타내요. 확장 문자소 클러스터는 하나 이상의 유니코드 스칼라 값으로 이루어진, 사람이 읽을 수 있는 문자예요. 유니코드 스칼라 값은 U+0000 이상 U+D7FF 이하 또는 U+E000 이상 U+10FFFF 이하 범위의 21비트 코드 포인트예요.

let aChar: Character = "A"

타입 추론

문자열 리터럴을 쓰면, Swift가 자동으로 그 타입을 String으로 추론해요. 하나의 문자를 Character로 저장하려면 타입을 명시적으로 지정해야 해요:

let aString = "A"        // Inferred as String
let aChar: Character = "A" // Explicitly typed as Character
print(type(of: aString)) // Prints String
print(type(of: aChar))   // Prints Character

// The following code will not compile:
let badChar: Character = "Too many characters"
// Error: Cannot convert value of type 'String' to specified type 'Character'

연결

덧셈 연산자(+)를 사용해 문자열을 서로 이어 붙일 수 있어요:

print("honey" + "comb")
// Prints "honeycomb"

먼저 문자를 문자열로 변환하지 않으면 +로 Character를 String에 바로 이어 붙일 수는 없어요. 하지만 append(_:) 메서드를 사용하면 문자열이나 문자를 변경 가능한 문자열에 바로 덧붙일 수 있어요:

var greeting = "Hello"
let world = ", world"
let period: Character = "."

greeting.append(world)
print(greeting) // Prints "Hello, world"

greeting.append(period)
print(greeting) // Prints "Hello, world."

문자열 보간

문자열 보간을 사용하면 문자열 리터럴 안에 상수, 변수, 리터럴, 표현식을 넣어 문자열을 만들 수 있어요. 각 표현식은 백슬래시가 앞에 오는 괄호(\( ... ))로 감싸요:

let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // Prints "The area of a circle with radius 5.0 is 78.53981633974483"

문자열과 문자의 프로퍼티

문자열과 문자에는 내용을 살펴볼 수 있는 여러 프로퍼티가 있어요.

문자열 프로퍼티

자주 쓰이는 문자열 프로퍼티는 다음과 같아요:

프로퍼티 설명 예시
isEmpty 문자열에 문자가 없으면 true를 반환해요 "Hello".isEmpty는 false예요
count 문자열의 문자 개수를 반환해요 "Hello".count는 5예요

전체 프로퍼티 목록은 Apple String 문서를 참고해요.

문자 프로퍼티

자주 쓰이는 문자 프로퍼티는 다음과 같아요:

프로퍼티 설명 예시
isLowercase 문자가 소문자면 true를 반환해요 "a".isLowercase는 true예요
isUppercase 문자가 대문자면 true를 반환해요 "A".isUppercase는 true예요
isNumber 문자가 숫자면 true를 반환해요 "1".isNumber는 true예요
isWhitespace 문자가 공백이면 true를 반환해요 " ".isWhitespace는 true예요

전체 프로퍼티 목록은 Apple Character 문서를 참고해요.

타입 변환

String(_:) 이니셜라이저를 사용하면 다른 타입을 문자열로 변환할 수 있어요. 이 이니셜라이저는 Int, Double, Character 같은 표준 타입을 지원해요:

let charX: Character = "x"
print(String(charX))     // Prints "x"
print(String(110))       // Prints "110"
print(String(Double.pi)) // Prints "3.141592653589793"

특수 문자

Swift 문자열 리터럴은 특수 문자를 위한 여러 이스케이프 시퀀스를 지원해요:

시퀀스 설명
\0 널 문자
\\ 백슬래시
\t 가로 탭
\n 줄 바꿈(개행)
\r 캐리지 리턴
\' 작은따옴표
\" 큰따옴표
\u{n} 임의의 유니코드 스칼라(16진수)
let quote: String = "\"Hello\", he said."
print(quote) // Prints "Hello", he said.

let unicode: Character = "\u{1F496}"
print(unicode) // Prints 💖

지침

이 연습 문제에서는 간판 회사가 간판에 넣을 맞춤 메시지를 만들 수 있도록 돕는 코드를 작성해요.

1. 유용한 문자열 집합 만들기

간판을 만드는 데 사용할 다음 상수 문자열을 정의해요:

  • birthday: 이 상수는 "Birthday" 값을 가져요.
  • valentine: 이 상수는 "Valentine's Day" 값을 가져요.
  • anniversary: 이 상수는 "Anniversary" 값을 가져요.

2. 유용한 문자 집합 만들기

간판을 만드는 데 사용할 다음 상수 문자를 정의해요:

  • space: 이 상수는 " " 값(공백 한 칸)을 가져요.
  • exclamation: 이 상수는 "!" 값을 가져요.

3. 문구를 조합해 메시지 만들기

buildSign(for:name:) 함수를 구현해요. 이 함수는 첫 번째 과제에서 정의한 세 문자열 중 하나를 담는 for 인자와, 간판을 받을 사람의 이름을 담는 문자열 name 인자를 받아요. 간판의 메시지를 만들 때 문자열 연결을 사용하고, 이미 정의한 상수를 다시 사용하는 것도 잊지 마세요. 함수는 간판 메시지를 문자열로 반환해야 해요.

buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"

buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"

4. 졸업 간판 만들기

graduationFor(name:year:) 함수를 구현해요. 이 함수는 간판을 받을 사람의 이름을 담는 문자열 name 인자와, 그 사람이 졸업하는 연도를 담는 정수 year 인자를 받아요. 간판의 메시지를 만들 때 템플릿 문자열을 사용해요. 함수는 간판 메시지를 문자열로 반환해야 해요.

graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"

5. 간판 가격 계산하기

costOf(sign:) 함수를 구현해요. 이 함수는 간판의 메시지를 담는 문자열 sign 인자를 받아요. 간판의 기본 가격은 해당 통화 기준으로 20이고, 글자마다 2씩 추가돼요. (공백도 계산에 포함돼요.) 함수는 간판의 가격을 정수로 반환해야 해요.

costOf(sign: "Happy Birthday Grandma!")
// returns 66
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Swift Exercism

Cal의 맞춤 간판 가게 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Swift 트랙을 개념 35개연습 문제 116개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.