본 글은 야곰의 스위프트 프로그래밍: Swift5 교재를 토대로 공부한 내용을 요약한 것입니다.
Swift는 2010년 크리스 라트너(Chris Lattner)를 필두로 애플의 프로그래머들이 개발을 시작했습니다. Objective-C, 루비, 파이썬 등 많은 프로그래밍 언어의 콘셉트를 참고하여 만들었으며 2014년 9월 정식 발표된 이후 현재까지 계속 발전하고 있습니다.
Optional, guard, 오류처리, 타입 통제 등의 엄격한 문법의 통제를 통해 프로그래머가 저지를 수 있는 실수를 방지한다.
스위프트는 C언어 기반의 C, C++, Objective-C를 대체하고자 만들어졌으며 C언어 수준과 동등한 성능을 일정 수준 유지하고자 초점을 맞춰 개발되어 실행 속도 최적화 뿐 아니라 지속적인 컴파일러 개량을 통해 더 빠른 컴파일 성능을 구현해 나간다.
또한, ARC(Auto Reference Counting)로 메모리 관리를 효율적으로 하며 컴파일 시간에 타입추론을 하여 런타임 오버헤드를 줄일 수 있다.
프로그래밍 언어의 문접은 각각 장단점이 있는데, 스위프트는 이러한 장단점을 참고해 현대적이고 세련된 분법을 구사하면서 좀 더 사용하기 편하고 보기 좋은 문법을 구현하려 노력한다.
또한, 스위프트는 표현력이 좋은 언어라 문법 표현의 다양성이 높은데, 아래의 예시 좌우는 같은 의미를 다르게 표현한 것이다.
Dictionary<String, Any> [Sring: Any]
Array<Int> [Int]
Optional<bool> Bool?
func foo() -> Void { } func foo() { }
func boo(closure: (Void) -> Void) -> Void { } func boo(Closure: () -> Void { }
스위프트는 명령형 프로그래밍과 객체지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 패러다임, 프로토콜 지향 패러다임을 지향한다.
프로그램의 상태를 변경하는 명령(명령문)을 사용하여 문제를 해결하는 패러다임이다. 변수, 할당, 조건문, 반복문 등이 주 요소이다.
var sum = 0
for num in 1...5 { sum += number }
print(sum)
프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어나 여러 개의 독립된 단위인 객체의 모임으로 파악하고자 하는 시각이다. 객체를 중심으로 코드를 구조화하며, 캠슐화, 상속, 다형성 등의 개념을 활용한다.
class Dog
{
var name: String
init(name: String)
{
self.name = name
}
func bark()
{
print("Woof!")
}
}
let myDog = Dog(name: "Buddy")
myDog.bark()
명령형 프로그래밍 패러다임에서는 프로그램에서 값이나 상태의 변화를 중요하게 여기지만 함수형 프로그래밍 패러다임은 함수 자체의 응용을 중요하게 여긴다. 순수하게 함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작한다.
함수형 프로그래밍의 큰 특징은 함수를 일급 객체로 다룬다는 점이다. 일급 객체의 가장 큰 특징은 함수의 전달인자나 반환값으로 사용할 수 있다는 것이다.
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }.filter { $0 > 10 }.reduce(0, +)
위 코드에서 알 수 있듯이 함수형 프로그래밍이 코딩 스타일에 영향을 미치는데, 이는 메서드 체이닝(Method Chaining) 형식으로 나타나게 된다.
메서드 체이닝은 여러 함수 호출을 연속적으로 연결하는 방식을 말한다. 이 방식은 함수형 프로그래밍에서 데이터 변환 과정을 명확하고 간결하게 표현할 수 있도록 해주며, 중간 결과를 임시 변수에 저장할 필요 없이 최종 결과를 효율적으로 도출할 수 있도록 한다.
프로토콜을 사용하여 코드를 구조화하며, 타입 간의 공통된 기능을 정의한다. 이는 다중상속이 불가능한 한계를 뛰어넘을 수 있게 한다.
protocol Sound { func makeSound() }
class Dog: Sound
{
func makeSound()
{
print("Woof!")
}
}
class Cat: Sound
{
func makeSound()
{
print("Meow!")
}
}
let dog = Dog()
let cat = Cat()
dog.makeSound()
cat.makeSound()
스위프트에서 미리 정한 예약어나 키워드
해당 코드 범위 내에서 미리 사용되는 이름
연산자로 사용될 수 있는 기호(+, -, *, /)
숫자로 시작하는 이름
공백이 포함된 이름
class User {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let user = User(name: "John Doe", age: 30)
print(user)
// User
dump(user)
/*
▿ User
- name: "John Doe"
- age: 30
*/
// 한 줄 주석
/*
여러 줄 주석
// 그 안에 중첩으로 주석 추가해도 무방
*/
/// 이렇게 주석을 달면 퀵헬프에 설명 문구가 노출된다.
/**
여러 줄도 마찬가지
**/
변수나 상수를 이용해 데이터를 메모리에 임시 저장한다. 변수는 생성 후 데이터 값을 변경할 수 있지만, 상수는 한번 값을 설정하면 변경할 수 없다.
var [변수명]: [데이터 타입] = [값]
var name: String = "jjudev"
name = "jjudev92" // 변경 가능
let [상수명]: [데이터 타입] = 값
let name: String = "jjudev"
name = "jjudev92" // 변경 불가능. 오류 발생
참고하신 책 얼마인가요?