스위프트(Swift)는 "Objective-C" 언어를 대체할 애플의 차세대 언어로 애플에서 iOS 또는 macOS 등의 프로그램을 개발할 때 사용하는 프로그래밍 언어입니다.
2014년 6월 2일 WWDC(애플 세계 개발자 회의)에서 처음 소개되었으며 그해 9월에 정식으로 발표되었습니다.
Swift는 코드를 작성할 때 Optional, nil, guard문 등을 사용하여 안전한 방식의 코드 작성을 추구하고 있습니다.
때론 Swift 문법이 융통성 없다고 생각할 수 있지만, 장기적으로 생각했을 때 오류 수정 및 에러를 찾는 시간을 절약할 수 있습니다.
Swift는 C언어 기반의 언어(C, C++, Object-C)를 대체하기 위한 목적으로 개발되었습니다.
(Swift는 C언어 기반의 언어들과 비슷한 성능, 속도를 중점으로 개발)
Swift는 여러 프로그래밍 언어의 장단점과 특징을 참고하여 개발된 언어입니다.
Swift는 사용자의 편의성과 좋은 문법을 구사하기 위하여 현재까지 계속적인 업데이트가 이루어지고 있습니다.
Swift는 다양한 방식의 프로그래밍 패러다임을 차용한 프로그래밍 언어입니다.
(명령형 프로그래밍 방식을 기본으로 "객체 지향 프로그래밍", "함수형 프로그래밍", "프로토콜 지향 프로그래밍" 방식을 지향하고 있습니다.)
Swift는 객체 지향 프로그래밍 언어입니다.
객체 지향 프로그래밍은 특정 연관 또는 의미 있는 내용(기능)을 하나로 묶어 정의한 뒤, 정의된 내용을 바탕으로 객체(인스턴스)를 생성하여 해당 객체를 사용하는 방식의 프로그래밍을 의미합니다. (정의된 내용 = 클래스 등)
class Man{
var name: String
var age: Int
func hello(){
print("안녕")
}
init (name: String, age: Int){
self.name = name
self.age = age
}
}
var kim = Man(name: "김철수", age: 20)
kim.name
kim.age
kim.hello()
✅ 객체 지향 프로그래밍의 4대 특징
1. 추상화(Abstraction)
수많은 내용(기능) 중에서 공통적인 특징 또는 필요한 내용(기능)만을 뽑아 모아서 정의하는 것을 추상화라고 부릅니다.2. 캡슐화(Encapsulation)
추상화를 통해 모은 속성(형태)과 메서드(기능)를 하나의 클래스로 묶어 정의하는 것을 캡슐화라고 부릅니다.캡슐화를 하면서 속성과 메서드에 특정 접근제어자를 사용하여 외부/내부의 접근을 통제할 수 있습니다. 이를 은닉화라고 부릅니다.
3. 상속성(Inheritance)
부모 클래스(상위 클래스)의 속성과 메서드를 자식 클래스(하위 클래스)에게 물려주는 개념입니다.4. 다형성(Polymorphism)
다형성은 상속성과 밀접한 관계가 있는 개념입니다.다형성은 "객체에 따라 기능이 다양하게 변할 수 있다." 라는 의미로 해석할 수 있습니다. 즉, A객체가 여러 가지 타입의 형태로 저장될 수 있으며, 하나의 기능(메서드)이 객체에 따라 다르게 실행될 수 있다는 것을 의미합니다.
✅ 객체 지향 프로그래밍의 장점
1. 코드의 재사용성 및 생산성 향상
기존에 만들어진 클래스를 가져와 사용하는 것이 가능하며, 상속과 확장 등의 기능을 사용하여 코드의 재사용성 및 생산성을 향상할 수 있습니다.2. 유지보수가 용이
절차 지향 프로그래밍에서 코드를 수정하려면 많은 부분의 코드를 손봐야 하지만, 객체 지향 프로그래밍은 수정이 필요한 부분의 코드 묶음(클래스)만 수정하면 되기 때문에 유지보수가 용이합니다.3. 큰 규모의 프로젝트에 효과적
내용(기능)을 클래스 단위로 모듈화하여 여러 사람과 함께 개발할 수 있다는 점과 위의 장점(코드의 재사용성 및 생산성 향상, 유지보수가 용이)을 미루어 보면 절차 지향 프로그래밍보다 객체 지향 프로그래밍이 대규모 프로젝트에 용이하다는 것을 확인할 수 있습니다.
✅ 객체 지향 프로그래밍의 단점
1. 속도
객체 지향 프로그래밍의 코드는 하나로 연결되어 있지 않고, 내용(기능)별로 모듈화하여 띄엄띄엄 작성했기 때문에 속도 면에서 절차 지향 프로그래밍보다 느립니다.2. 개발 속도 및 난이도
내용(기능)을 하나하나 파악한 뒤 모듈 단위로 클래스를 만들고, 클래스로부터 만들어질 객체의 특징 및 기능을 이해하면서 개발해야 하므로 프로그래밍이 어렵고 개발 속도가 느리다는 단점이 있습니다.
Swift는 함수형 프로그래밍 언어입니다.
함수형 프로그래밍은 미리 구현된 함수 또는 직접 만든 함수를 사용하여 원하는 결괏값을 빠르게 도출해내는 방식의 프로그래밍을 의미합니다.
또한 스위프트에서 함수는 1급 객체이기 때문에 다양한 형태로 프로그래밍하는 것과 함수를 사용하여 부작용(에러) 없이 프로그래밍하는 것을 의미하기도 합니다.
즉, 어떠한 도구(함수)를 사용하여 코드를 간결하게 작성하는 프로그래밍 방식입니다.
✅ 명령형 프로그래밍
- 함수 사용 없이 짝수의 합 구현
let numArr = [1,2,3,4,5,6,7,8,9] var evenNumSum = 0 // 짝수의 합 for i in numArr{ if i%2 == 0{ evenNumSum += i } } print(evenNumSum) // 20 출력
✅ 함수형 프로그래밍
- 함수를 사용하여 짝수의 합 구현 (고차함수 사용)
let numArr = [1,2,3,4,5,6,7,8,9] var evenNumSum = numArr.filter{$0 % 2 == 0}.reduce(0) {$0 + $1} print(evenNumSum) // 20 출력
Swift는 프로토콜 지향 프로그래밍 언어입니다.
프로토콜 지향 프로그래밍은 클래스의 단점 및 불가능한 구현(단일 상속, 불필요한 속성 및 메서드의 상속, 클래스만 상속 가능)을 보완하기 위해 프로토콜을 활용한 방식의 프로그래밍을 의미합니다.
Swift에서 프로토콜은 다중 채택을 허용하며, 필요한 속성과 메서드만 정의하여 채택할 수 있습니다. 또한 프로토콜은 클래스뿐만 아니라 구조체와 열거형 타입에도 채택할 수 있습니다.
이처럼 클래스의 단점과 불가능한 구현을 프로토콜를 사용하여 보완하고, 코드의 재사용성과 활용성을 향상할 수 있습니다.
✅ 상속의 단점: 상속시 필요없는 기능또한 상속 받아야한다.
class Animal{ func meatEat(){ print("육식~!") } func vegetableEat(){ print("채식~!") } func aquaticAnimal(){ print("저는 수상 동물입니다.") } func landAnimal(){ print("저는 육상 동물입니다.") } } class Tiger: Animal{ var name: String = "호돌이" /* -상속받은 함수- func meatEat() func vegetableEat() //필요없는 함수 func aquaticAnimal() //필요없는 함수 func landAnimal() */ }
✅ 프로토콜을 사용하여 상속의 단점을 보안
- 필요한 기능만을 채택하여 구현하면 메모리 공간을 효율적으로 사용할 수 있습니다.
protocol MeatEat{ func meatEat() } protocol VegetableEat{ func vegetableEat() } protocol AquaticAnimal{ func aquaticAnimal() } protocol LandAnimal{ func landAnimal() } class Animal{ } class Tiger: Animal, MeatEat, LandAnimal{ var name: String = "호돌이" func meatEat() { print("육식~!") } func landAnimal() { print("저는 육상 동물입니다.") } }