간략한 스위프트 문법/사용법 정리
🧐 클래스(Class)
클래스는 참조 타입(Reference Types)이다. 따라서 원본의 값이 변경될 수 있음을 유의해야 한다.
그리고 클래스 내부에 선언된 프로퍼티(멤버 변수)는 반드시 초기화가 되어야만 한다.
따라서 클래스는 반드시 하나 이상의 생성자를 가져야 하고, 생성자를 통해 프로퍼티를 초기화 해주어야 한다.
만약 변수 선언과 동시에 초기화를 한다면 생성자에서 초기화를 하지 않아도 에러가 발생하지는 않고,
초기화를 하기 어려운 변수라면 옵셔널로 선언해야 한다.
📎 init(생성자)
- Designated Initializer(지정 생성자)
class UserInfo {
var name: String
var id: String
// 지정 생성자
init(name: String, id: String) {
self.name = name
self.id = id
}
// 지정 생성자
init(name: String) {
self.name = name
self.id = ""
}
// 지정 생성자
init() {
self.name = ""
self.id = ""
}
}
var user = UserInfo(name: "Moon", id: "clover")
var user2 = UserInfo(name: "Kim")
var user3 = UserInfo()
print(user.name, user.id)
// 출력: Moon clover
print(user2.name, user2.id)
// 출력: Kim
print(user3.name, user3.id)
// 출력:
- convenience initializer(편의 생성자)
생성자 오버로딩을 통해 생성자를 여러개로 만들 수 있지만, 생성자가 많아질 수록 코드의 중복을 피할 수 없다.
편의 생성자는 중복되는 코드를 줄여줄 수 있고, 안정성을 높혀줄 수 있는 Swift의 문법이다.
편의 생성자는 반드시 지정 생성자를 호출해야만 한다.
class UserInfo {
var name: String
var id: String
init(name: String, id: String) {
self.name = name
self.id = id
}
convenience init(name: String) {
self.init(name: name, id: "")
}
convenience init() {
self.init(name: "", id: "")
}
}
위 코드의 경우, 추후에 생성자 내부를 수정할 일이 생겨도 지정 생성자 한 곳만 수정해주면 모든 생성자가 수정 내용을 적용받는다.
📎 deinit(소멸자)
클래스에 nil을 할당하는 순간 소멸자(deinit)가 실행되며 메모리에서 해제된다.
class Game {
init() {
print("Game Start!")
}
deinit {
print("Game Over.")
}
}
var game: Game? = Game() // 인스턴스 생성
// 출력: Game Start!
game = nil // 메모리 해제
// 출력: Game Over.
일반적으로는 Swift가 인스턴스의 메모리 해제를 자동으로 해주기 때문에, deinit을 반드시 작성해야만 하는것은 아니다.
주로 클래스간의 상호 의존 관계에서, 클래스가 해제될 때 의존 클래스의 특정 메서드를 실행시키는 동작을 해야할 때 사용한다.
class Game {
var life: Int = 0
init(life: Int) {
self.life = life
print("Game Start!")
}
func playerDead() {
self.life -= 1
print("남은 목숨: \(self.life)")
}
}
var game: Game? = Game(life: 5) // 인스턴스 생성
// 출력: Game Start!
class Player {
var name: String
var game: Game?
init(name: String, game: Game?) {
self.name = name
self.game = game
}
deinit { // 플레이어가 사라질 때 game 클래스의 playerDead() 메서드를 실행.
game?.playerDead()
}
}
var player: Player? = Player(name: "Mike", game: game)
player = nil // player를 메모리 해제, deinit 실행.
// 출력: 남은 목숨: 4
📎 상속
class GameInfo {
var homeScore = 0
var awayScore = 0
func getScore() -> String {
return homeScore.description + " : " + awayScore.description
}
// final: 자식 클래스에서 override를 할 수 없음.
final func isHomeWinner() -> Bool {
if homeScore > awayScore {
return true
} else {
return false
}
}
}
class Soccer: GameInfo {
var time = 0
}
class Baseball: GameInfo {
var round = 0
override func getScore() -> String {
return homeScore.description + " 대 " + awayScore.description
}
}
🧐 프로퍼티(Properties)
Class와 struct, enum의 멤버 변수(또는 상수)를 말한다.
저장 프로퍼티(Stored properties)와 계산 프로퍼티(Computed properties)로 분류한다.
📎 stored property (저장 프로퍼티)
class UserInfo {
var name: String
var id: String
}
📎 lazy stored property
클래스가 인스턴스화 되어도 메모리에 올라가지 않고 기다리다가, 해당 프로퍼티가 실제로 필요할 때 메모리에 올라간다.
데이터 용량이 큰 프로퍼티를 할당해야 할 때 주로 사용하는데, 실제 성능 향상에 효과를 준다기보다 사용자로 하여금 앱이 빠르게 동작한다고 느끼게 해줄 수 있을 것이다.
class UserInfo {
lazy var images = [UIImage(named: "img1"), UIImage(named: "img2"),
UIImage(named: "img3"), UIImage(named: "img4"),
UIImage(named: "img5"), UIImage(named: "img6")]
}
📎 computed property (연산 프로퍼티)
값을 저장하고 있지 않고, 호출과 동시에 작성된 연산을 통해 값을 반환한다.
class UserInfo {
var age = 0
var name : String = ""
// computed property
var isAdult: Bool {
if age > 19 {
return true
}
return false
}
// computed property
var userName: String {
set {
self.name = newValue
}
get {
return self.name
}
}
}
🧐 구조체(Structure)
구조체는 값 타입(Value Types)이다.
📎 생성 방법
구조체 내부에 function, enum 등을 작성할 수 있다.
struct ImageType {
var name = ""
func someFunc() {
}
}
📎 사용 방법
var imageType1 = ImageType()
var imageType2 = imageType1
imageType1.name = "jpg"
imageType2.name = "png"
print(imageType1.name) // 출력: jpg
print(imageType2.name) // 출력: png
structure는 값 타입이기 때문에 원본 값에 영향을 주지 않는다.
[예시 코드 출처]
- 인프런(UIKit -iOS14 실무 가이드)
'iOS(macOS) > Swift' 카테고리의 다른 글
[Swift/문법] 프로토콜 (Protocol) (0) | 2022.08.10 |
---|---|
[Swift/문법] 익스텐션(Extension) (0) | 2022.08.10 |
[Swift/문법] Enumerations (enum, 열거형) (0) | 2022.08.09 |
[Swift/문법] Closure (클로저) (0) | 2022.08.07 |
[Swift/문법] 제어문(Control flow), Function (0) | 2022.08.04 |