728x90
메소드(Methods)
- 특정 타입의 Class, Struct, enum과 관련된 함수
- 특저 타입의 인스턴스에서 실행할 수 있는 메소드를 인스턴스 메소드,
- 특정 형과 관련된 메소드를 타입 메소드
인스턴스 메소드(Instance Methods)
- 특정 Class,Struct,enum (OOP)의 인스턴스에 속한 메소드
- 인스턴스 내의 값을 제어하거나 변경할 수 있음
// Counter클래스를 선언하고 인스턴스 메소드로 각각 increment(), increment(by amount: Int),reset()를
//정의해 인스턴스 내의 countproperty를 변경하는 기능을 수행
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let counter = Counter()
// 초기 count 값은 0입니다.
counter.increment()
// count 값이 1로 변경 됐습니다.
counter.increment(by: 5)
// count 값은 현재 6입니다.
counter.reset()
// count 값은 0이 됩니다.
self 프로퍼티 (The self Property)
- increment()메소드에서는 count += 1이라 표현했지만 사실은 self.count += 1의 의미
- 모든 프로퍼티는 암시적으로 인스턴스 자체를 의미하는 self 라는 프로퍼티를 갖음
- 인스턴스 메소드안에서 self 프로퍼티를 이용해 인스턴스 자체를 참조하는데 사용
- func increment() { self.count += 1 }
- Swift에서는 자동으로 가정하여 self를 사용안해도 됨
- 하지만 인자 이름이 프로퍼티 이름과 같을 경우 self 를 사용하여 구분
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOf(x: Double) -> Bool {
return self.x > x // self.x를 이용해 프로퍼티 x와 인자 x를 구분
}
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOf(x: 1.0) {
print("This point is to the right of the line where x == 1.0")
}
// "This point is to the right of the line where x == 1.0" 출력
인스턴스 메소드 내에서 값 타입 변경 (Modifying Value Types from Within Instance Methods)
- Struct,enum 값 타입
- 기본적 인스턴스 메소드 내에서 값 타입의 프로퍼티를 변결 할 수 없음 but 값 타입 형의 메소드에서 프로퍼티를 변경하고 싶을때 메소드에 [mutating](<https://www.notion.so/2023-04-27-Methods-97a19ec2b43b464ba55627bfdc9d6fe8>) 붙여 주면 가능
- [mutating](<https://www.notion.so/2023-04-27-Methods-97a19ec2b43b464ba55627bfdc9d6fe8>) 이라는 키워드가 붙은 메소드에서 메소드의 계산이 끝난 후 원본 구조체에 결과를 덮어 써서 그 값을 변경
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\\(somePoint.x), \\(somePoint.y))")
// "The point is now at (3.0, 4.0)" 출력
Mutating 메소드 내에서 self 할당 (Assigning to self Within a Mutating Method)
- Mutating메소드에서 self프로퍼티를 이용해 완전 새로운 인스턴스를 생성
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
enum TriStateSwitch {
case off, low, high
mutating func next() {
switch self {
case .off:
self = .low
case .low:
self = .high
case .high:
self = .off
}
}
}
var ovenLight = TriStateSwitch.low
ovenLight.next()
// ovenLight 값은 .high
ovenLight.next()
// ovenLight 값은 .off
타입 메소드 (Type Methods)
- 인스턴스 메소드는 특정타입의 인스턴스에서 호출, 타입 메소드는 특정 타입 자체에서 호출해 사용
- 타입 메소드의 선언은 메소드 키워드 func앞에 static혹은 class키워드를 추가
- static메소드와 class메소드의 차이점은 static메소드는 서브클래스에서 오버라이드 할 수 없는 타입 메소드 이고, class메소드는 서브클래스에서 오버라이드 할 수 있는 타입 메소드
- 타입 메소드도 인스턴스 메소드와 같이 점(.) 문법으로 호출
class SomeClass {
class func someTypeMethod() {
// 타입 메소드 구현
}
}
SomeClass.someTypeMethod() // 타입 메소드 호출!
// 타입 메소드 안에서도 self키워드를 사용
// self는 인스턴스가 아니라 타입 자신을 의미
struct LevelTracker {
static var highestUnlockedLevel = 1
var currentLevel = 1
static func unlock(_ level: Int) {
if level > highestUnlockedLevel { highestUnlockedLevel = level }
}
static func isUnlocked(_ level: Int) -> Bool {
return level <= highestUnlockedLevel
}
@discardableResult
mutating func advance(to level: Int) -> Bool {
if LevelTracker.isUnlocked(level) {
currentLevel = level
return true
} else {
return false
}
}
}
class Player {
var tracker = LevelTracker()
let playerName: String
func complete(level: Int) {
LevelTracker.unlock(level + 1)
tracker.advance(to: level + 1)
}
init(name: String) {
playerName = name
}
}
var player = Player(name: "Argyrios")
player.complete(level: 1)
print("highest unlocked level is now \\(LevelTracker.highestUnlockedLevel)")
// "highest unlocked level is now 2" 출력
모르는 용어
type method
- 클래스 자체에 속하는 메소드, static 을 사용하여 정의 클래스 변수에 접근
- 클래스 변수를 수정할 수 있음
- class 객체를 생성만 해도 method를 호출 할 수 있어
mutating
- Class, enum에서 사용
- 인스턴스 값을 수정
static
- Swift에서 static 키워드는 클래스나 구조체(struct), 열거형(enum)의 멤버에 대해 정의
- 키워드를 사용하여 해당 멤버가 타입 멤버임을 나타내며, 인스턴스가 아닌 타입 자체에 속하는 멤버
@discardableResult
- 리턴 값이 있는 메소드에서 리턴 값을 사용하지 않으려면 경고가 발생하는데 무시하도록 해줌
728x90
'기타 > Today I Learned' 카테고리의 다른 글
[TIL] Swift 문법 상속(Inheritance) (0) | 2023.05.05 |
---|---|
[TIL] Swift 문법(Subscripts) (0) | 2023.05.03 |
[TIL] Swift 문법 클래스와 구조체 (0) | 2023.04.27 |
[TIL] Swift 문법 열거형(Enum) (0) | 2023.04.25 |
[TIL] Swift 문법 클로저(Closures) (0) | 2023.04.23 |