[Swift] 문자열 (String)

개자이너·2019년 12월 28일
0

내맘대로 Swift

목록 보기
1/6

0. Siwft를 처음 공부하게 되면서

2020년 11월에 IOS앱 출시를 목표로 Swift 공부를 시작하게 되었다. 가장 첫 번째 포스트이기도 하고 "배운 것들을 그때그때 정리해야지!" 라고 항상 생각하긴했는데 이제서야 실천하게 된다.

아마 이 포스팅을 누군가 보고있다면 " 왜 첫 번째 포스팅이 문자열(String) 이지?" 라고 생각할 것 같다. 아무래도 첫 번째 언어가 C언어인 탓이 크다고 할 수 있겠다. C의 문자열 관리는 정말 어려웠던 기억이 생생하기 때문인데, strcpy strcmp따위를 사용하다가 C++ String 클래스의 operator+ operator==등을 사용하게 되면서 속에 꽉막힌 무언가가 내려가는 느낌을 아직도 잊을 수 없다.

그런 이유로 String 클래스부터 펼쳐본다.


1. 문자열을 만들어 보자

1-1. 변수 선언

var [변수명]: [데이터타입] = [값]

var firstString = "Hello World!"

위 예제를 보고 Javascript와 닮은점이 많다고 생각했다. 따로 변수의 타입을 미리 선언할 필요가 없다고 생각했기 때문인데 Swift는 약간 달랐다.

var firstString: String = "Hello World!"

하지만 위 예제처럼 Swift는 데이터 타입을 변수를 선언할 때 명시해줄 수 있다. 당연하게도 이렇게 변수의 타입을 명시해주는 것이 좋은 코딩 습관이지 않을까 싶은데, Swift 개발자 분들을 타입 유추를 많이 사용하는지 궁금하긴 하다. 혹시나 이 글을 보고 계신 분이 있다면 댓글 부탁드립니다.

1-2. 상수 선언

let [상수명] : [데이터타입] = [값]

let firstString: String = "Hello World!"

C++의 const 키워드처럼 데이터 타입 앞에 따로 붙힐 필요 없이 Swift는 let 키워드로 상수를 선언할 수 있다. 당연하게도 상수는 선언됨과 동시에 값을 변경할 수 없다.

let firstStr: String = "Hello"
let secondStr: String = "World"
let letStr: String = String()
letStr = firstStr + " " + secondStr // 컴파일에러!

위 예제처럼 let letStr: String = String() 으로 초기화한 뒤에는 값을 당연히 대입할 수 없다는 것을 알 수 있다. 값을 대입하고자 할 때 컴파일이 에러를 뿜어주니 실수할 수 없어 참 좋다.


2. 이런 기능 너무좋아

2-1. 문자열 결합

C언어에서 문자열을 결합할 때는 메모리를 할당한 뒤 문자열을 직접 복사해주어야했다. 이 과정에서 예상치 못한 오류가 생기거나, null참조 등의 위험성이 있었는데 Swift는 C++의 String Class나 Javascript처럼 operator+를 지원한다.

let firstStr: String = "first"
let secondStr: String = "second"
var resultStr: String = firstStr + " " + secondStr
// first second

아래처럼 resultStr를 String Class의 이니셜라이저를 이용해 초기화한 상태에서 대입할 수도 있다. 당연히 let resultStr: String = String()으로 상수 선언을 했다면 아래 예제는 컴파일에러를 뿜을 것이다.

let firstStr: String = "first"
let secondStr: String = "second"
var resultStr: String = String()
resultStr = firstStr + " " + secondStr

Python을 처음 보았을 때 가장 놀랬던 부분이 '문자열 * 2' 등을 하면 '문자열 문자열'과 같은 출력을 보인다는 것인데 될까? 싶었지만 Swift에서는 operator*는 아쉽게도 지원하지 않았다. Swift도 operator overlaoding을 지원한다면 직접 만들어서 추가해봐야겠다.

2-2. 문자열 비교

C언어에서 strcmp를 사용해 문자열을 비교한 것을 기억한다면 operator==를 지원한다는 것에 환호를 하지 않을 수가 없다.

let firstStr: String = "Hello"
let secondStr: String = "World"
let thirdStr: String = "World"

print(firstStr == secondStr) // false
print(secondStr == thirdStr) // true

위 예제처럼 간단하게 String을 비교할 수 있다. 문자열을 이렇게 쉽게 관리할 수 있다는 것은 정말 매력적인 것이라 생각된다. 당연히 C 이후에 나온 거의 대부분의 언어는 이렇게 할 수 있는 것 같다

2-3. 접두사 접미어 비교

놀랍게도 Swift는 접두사와 접미어를 비교할 수 있는 메서드를 제공하고있다.

var firstStr: String = "string good"
print(firstStr.hasPrefix("string")) // true
print(firstStr.hasSuffix("good")) // true

2-4. 대소문자 변환

var firstStr: String = "hello world!"
print(firstStr.uppercased()) // HELLO WORLD!

var secondStr: String = "HELLO WORLD!"
print(secondStr.lowercased()) // hello world!

2-5. 문자열 길이 체크

var firstStr: String = "hello world!"
print(firstStr.count) // 12

var secondStr: String = String()
print(secondStr.count) // 0

여기서 count는 위처럼 메서드가 아닌 프로퍼티임을 알 수 있다.
객체.count으로 값을 꺼내오고 있고, 메서드라면 객체.count()처럼 "()"가 필요할텐데 붙어있지 않기 때문이다. 공부하면서 컴파일러가 오류를 뿜어서 찾아보니 위와같은 차이가 있었다.

2-6. Empty 체크

var firstStr: String = "hello world!"
print(firstStr.isEmpty) // false

var secondStr: String = String()
print(secondStr.isEmpty) // true

이것도 역시 프로퍼티기능임을 알 수 있다.


3. String 클래스 살펴보기를 마치며

(apple)String Class Reference를 살펴보면 다양한 String 클래스의 메소드와 프로퍼티를 살펴볼 수 있었다. 아직 Swift라는 언어의 첫 장을 살펴보고 있으므로, 간단하게 살펴보고 공부하면서 알아가는 지식이 생길 때마다 이 포스팅을 업데이트하고 회고하며 복습할 예정이다.

약 1년 뒤에 IOS 앱개발을 무사히 마칠 수 있길 바라며, 첫 번째 포스팅을 이걸로 일단 마무리!

profile
개발과 디자인을 다 하려는 욕심 그득한 노예

0개의 댓글