Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- iOS앱배포
- AJAX
- jQuery
- 파이썬서버
- subscript
- 맥
- ios
- iOS배포
- 개발기록
- 계산기앱만들기
- customclass
- 딩동말씀
- Swift
- DispatchGroup
- spring
- 스프링
- MainScheduler
- FLASK
- iOS계산기
- 웹
- FileOwner
- 앱배포
- 자바스크립트
- JavaScript
- Xcode
- 계산기앱
- Python
- 앱버전구하기
- 스위프트
- Xib
Archives
- Today
- Total
개발하는 뚝딱이
[swift] 메소드 (method) 본문
책 <스위프트 프로그래밍 3판 ;야곰 지음> 을 정리한 글입니다.
메소드
- 특정 타입에 관련된 함수
- 클래스, 구조체, 열거형 등은 실행하는 기능을 캡슐화한 인스턴스 메소드를 정의할 수 있음
- 타입 자체와 관련된 기능을 실행하는 타입 메서드를 정의 할 수 있음
1. 인스턴스 메소드
- 특정 타입의 인스턴스에 속한 함수
class LevelClass {
var level: Int = 0 {
didSet {
print("Level: \(level)")
}
}
func levelUp() {
print("Level up")
level += 1
}
func levelDown() {
print("Level Down")
level -= 1
if level < 0 {
reset()
}
}
func jumpLevel(to: Int) {
print("Jump to \(to)")
level = to
}
func reset() {
print("Reset!")
level = 0
}
}
var levelClassInstance: LevelClass = LevelClass()
levelClassInstance.levelUp() // Level up
// Level 1
levelClassInstance.levelDown() // Level Down
// Level 0
levelClassInstance.levelDown() // Level Down
// Level -1
// Reset!
// Level 0
levelClassInstance.jumpLevel(to: 3) // Jump to 3
// Level 3
- 클래스와 달리 struct나 enum에서 메소드를 통해 프로퍼티 값을 변경할 때 func 키워드 앞에 mutating을 붙여줘야 함!
struct LevelStruct {
var level: Int = 0 {
didSet {
print("Level \(level)")
}
}
mutating func levelUp() {
print("Level Up!")
level += 1
}
mutating func levelDown() {
print("Level Down!")
level -= 1
if level < 0 {
reset()
}
}
mutating func jumpLevel(to: Int) {
print("Jump to \(to)")
level = to
}
mutating func reset() {
print("Reset!")
level = 0
}
}
var levelStructInstance: LevelStruct = LevelStruct()
levelStructInstance.levelUp() // Level Up!
// Level 1
levelStructInstance.levelDown() // Level Down!
// Level 0
levelStructInstance.levelDown() // Level Down!
// Level -1
// Reset!
// Level 0
levelStructInstance.jumpLevel(to: 3) // Jump to 3
// Level 3
2. self 프로퍼티
- 모든 인스턴스는 암시적으로 자기 자신을 가리키는 self 프로퍼티를 가짐 (자바의 this와 비슷한 개념)
- 인스턴스 메서드에서 self는 인스턴스를 가리키지만, 타입 메서드의 self는 타입을 가리킴
- 매개변수로 넘어온 값이 아니라 클래스의 프로퍼티를 가리키기 위해 self 사용
class LevelClass {
var level: Int = 0
func jumpLevel(to level: Int) {
print("Jump to \(level)")
self.level = level
}
}
- 값 타입 인스턴스 자체의 값을 self를 이용하여 치환할 수 있음
- class 인스턴스는 참조 타입이라서 self 프로퍼티에 다른 참조를 할당할 수 없음
- struct나 enum은 self 프로퍼티를 사용하여 자신 자체를 치환할 수 있음
class LevelClass {
var level: Int = 0
func reset() {
self = LevelClass() // 오류! self 프로퍼티 참조 변경 불가
}
}
struct LevelStruct {
var level: Int = 0
mutating func levelUp() {
print("Level Up!")
level += 1
}
mutating func reset() {
print("Reset!")
self = LevelStruct()
}
}
var levelStructInstance: LevelStruct = LevelStruct()
levelStructInstance.levelUp() // Level Up!
print(levelStructInstance.level) // 1
levelStructInstance.reset() // Reset!
print(levelStructInstance.level) // 0
enum OnOffSwitch {
case on, off
mutating func nextState() {
self = self == .on ? .off : .on
}
}
var toggle: OnOffSwitch = OnOffSwitch.off
toggle.nextState()
print(toggle) // on
var classA: LevelClass = LevelClass()
var classB: LevelClass = classA
classB = LevelClass()
3. 타입 메소드
- 타입 자체에 호출이 가능한 메소드 (클래스 메소드와 같은 개념)
- static 키워드 사용
class AClass {
static func staticTypeMethod() {
print("AClass staticTypeMethod")
}
class func classTypeMethod() {
print("AClass classTypeMethod")
}
}
class BClass: AClass {
// 오류! override 불가
override static func staticTypeMethod() {
}
override class func classTypeMethod() {
print("BClass classTypeMethod")
}
}
AClass.staticTypeMethod() // AClass staticTypeMethod
AClass.classTypeMethod() // AClass classTypeMethod
BClass.classTypeMethod() // BClass classTypeMethod
struct SystemVolume {
static var volume: Int = 5
// 타입 프로퍼티를 제어하기 위해서는 타입 메소드를 사용해야 함
static func mute() {
self.volume = 0
}
}
class Navigation {
var volume: Int = 5
func guideWay() {
SystemVolume.mute()
}
func finishGuideWay() {
SystemVolume.volume = volume
}
}
SystemVolume.volume = 10
let myNavi: Navigation = Navigation()
myNavi.guideWay()
print(SystemVolume.volume) // 0
myNavi.finishGuideWay()
print(SystemVolume.volume) // 5
'swift' 카테고리의 다른 글
[swift] 인스턴스 생성 및 소멸 (0) | 2020.05.01 |
---|---|
[swift] 옵셔널 (0) | 2020.04.28 |
[swift] 프로퍼티(property) (0) | 2020.04.15 |
[swift] 구조체(struct)와 클래스(class) 비교 (0) | 2020.04.08 |
[swift] 연산자 (0) | 2020.04.06 |