일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ftz level13
- windosws wbcs
- Stack
- pwnable.kr
- SWiFT
- 정렬 알고리즘
- c언어
- System
- level13
- War Game
- 재귀
- 백준
- ftz
- Java
- 두근두근 자료구조
- 암호수학
- C
- 미로 탐색 알고리즘
- 스택
- 큐
- PHP
- web
- HTML
- windosw 문자열
- 자료구조
- LoB
- OSI
- 파이썬
- 시간복잡도
- 파일 시스템
- Today
- Total
나의 기록, 현진록
[Swift] 10.2 메서드 / 인스턴스 메서드 / 타입 메서드 본문
스위프트 프로그래밍 3판 - 야곰 지음
10.2 메서드
메소드는 특정 타입에 관련된 함수를 뜻합니다. 클래스, 구조체, 열거형 등은 실행하는 기능을 캡슐화한 인스턴스 메서드를 정의할 수 있습니다. 또한, 타입 자체와 관련된 기능을 실행하는 타입 메서드를 정의할 수도 있습니다. 타입 메서드는 기존의 프로그래밍 언어에서의 클래스 메서드와 유사한 개념입니다.
구조체와 열거형이 메서드를 가질 수 있다는 것은 기존 프로그래밍 언어와 스위프트 간의 큰 차이점입니다. 스위프트에서는 프로그래머가 정의하는 타입(클래스, 구조체, 열거형 등)에 자유롭게 메서드를 정의할 수 있습니다.
10.2.1 인스턴스 메서드
인스턴스 메서드는 특정 타입의 인스턴스에 속한 함수를 뜻합니다. 인스턴스 내부의 프로퍼티 값을 변경하거나 특정 연산 결과를 반환하는 등 인스턴스와 관련된 기능을 실행합니다. 인스턴스 메서드는 함수와 문법이 같으므로 문법은 함수(7장)를 참고하세요.
인스턴스 메서드는 함수와 달리 특정 타입 내부에 구현합니다. 따라서 인스턴스가 존재할 때만 사용할 수 있습니다. 이 점이 함수와 유일한 차이점입니다.
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()
levelClassInstance.levelDown()
levelClassInstance.levelDown()
levelClassInstance.jumpLevel(to:3)
LevelClass의 인스턴스 메서드는 level 저장 프로퍼티의 값을 수정하는 값이 있습니다. 자신의 프로퍼티 값을 수정할 떄 클래스의 인스턴스 메소드는 크게 신경 쓸 필요가 없지만, 구조체나 열거형 등은 값 타입이므로 메서드 앞에 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()
levelStructInstance.levelDown()
levelStructInstance.levelDown()
levelStructInstance.jumpLevel(to : 3)
10.2.2 타입 메서드
인스턴스 프로퍼티와 타입 프로퍼티가 있듯이 메서드에돔 인스턴스 메서드와 타입 메서드가 있습니다. 타입 자체에 호출이 가능한 메서드를 타입 메서드(흔히 객체지향 프로그래밍에서 지칭하는 클래스 메서드와 유사)라고 부릅니다. 메서드 앞에 static 키워드를 사용하여 타입 메서드임을 나타내줍니다.
클래스의 타입 메서드는 static 키워드와 class 키워드를 사용할 수 있는데 static으로 정의하면 상속 후 메서드 재정의가 불가능하고 class로 정의하면 상속 후 메서드 재정의가 가능합니다.
class AClass{
static func staticTypeMethod(){
print("AClass staticTypeMethod")
}
class func classTypeMethod(){
print("AClass classTypeMethod")
}
}
class BClass: AClass{
/*
오류발생
override static func staticTypeMethod(){
}
*/
override class func classTypeMethod(){
print("BClass classTypeMethod")
}
}
AClass.staticTypeMethod()
AClass.classTypeMethod()
BClass.classTypeMethod()
또, 타입 메소드는 인스턴스 메서드와는 달리 self 프로퍼티가 타입 그 자체를 가리킨다는 점이 다릅니다. 인스턴스 메서드에서는 self가 인스턴스를 가리킨다면 타입 메서드의 self는 타입을 가리킵니다. 그래서 타입 메서드 내부에서 타입 이름과 self는 같은 뜻이라고 볼 수 있습니다. 그래서 타입 메서드 내부에서 타입 이름과 self는 같은 뜻이라고 볼 수 있습니다. 그래서 타입 메서드에서 self 프로퍼티를 사용하면 타입 프로퍼티 및 타입 메서드를 호출할 수 있습니다.
// 시스템 음량은 한 기기에서 유일한 값이어야 합니다.
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 = self.volume
}
}
SystemVolume.volume = 10
let myNavi: Navigation = Navigation()
myNavi.guideWay()
print(SystemVolume.volume)
myNavi.finishGuideWay()
print(SystemVolume.volume)
'Programming > Swift' 카테고리의 다른 글
[Swift] 11.1.5 기본 이니셜라이저와 멤버와이즈 이니셜라이저 / 초기화 위임 / 실패 가능한 이니셜라이저 (0) | 2021.07.26 |
---|---|
[Swift] 11.1 인스턴스 생성 / 이니셜라이저 / 옵셔널 프로퍼티 / 상수 프로퍼티 (0) | 2021.07.23 |
[Swift] 타입 프로퍼티 (0) | 2021.07.19 |
[Swift] 10.1.4 프로퍼티 감시자 (0) | 2021.07.19 |
[Swift] 10.1.3 연산 프로퍼티 / 접근자와 설정자 (0) | 2021.07.16 |