Notice
Recent Posts
Recent Comments
Link
大器晩成
인스턴스 메서드 본문
메서드(Methods)
- 메서드는 일종의 함수로써, 클래스나 구조체 또는 열거형과 같은 객체 내에서 함수가 선언될 경우 이를 메서드라고 통칭합니다.
- 함수는 독립적인 기능을 구현하기 위해 만들어지는 것이지만, 메서드는 하나의 객체 내에 정의된 다른 메서드들과 서로 협력하여 함수적인 기능을 수행합니다.
- 메서드는 크게 인스턴스 메서드와 타입 메서드로 구분됩니다.
- 객체의 인스턴스틀 생성해야 사용할 수 있는 메서드가 인스턴스 메서드, 객체의 인스턴스를 생성하지 않아도 사용할 수 있는 메서드가 타입 메서드입니다.
- 인스턴스 메서드는 주어진 객체의 인스턴스와 함께 특수한 임무나 함수적인 기능을 수행하도록 캡슐화된 메서드이고, 타입 메서드는 객체 타입 자체에 관련된 메서드이다.
인스턴스 메서드(Instance Methods)
- 인스턴스 메서드(Instance Method)는 클래스, 구조체 또는 열거형과 같이 객체 타입이 만들어내는 인스턴스에 소속된 함수입니다.
- 인스턴스 메서드는 인스턴스 프로퍼티에 접근하거나 수정하는 방법을 제공하거나 인스턴스의 생성 목적에 따른 함수적 관계성을 제공하는 등 객체의 인스턴스에 대한 기능적 측면을 제공합니다.
- 인스턴스 메서드는 같은 객체 내에서 정의된 다른 인스턴스 메서드나 인스턴스 프로퍼티에 접근할 수 있도록 권한이 부여되며, 해당 메서드가 속한 인스턴스를 통해서만 호출될 수 있습니다.
- 함수에서의 오버로딩과 동일하게 클래스, 구조체, 열거형의 메서드에서도 오버로딩을 지원합니다.
클래스의 인스턴스 메서드
class Counter {
//카운터를 저장할 프로퍼티
var count = 0
//카운트를 1 증가
func increment() {
self.count += 1
}
//입력된 값 만큼 카운트를 증가
func incrementBy(amount: Int) {
self.count += amount
}
//카운트를 0으로 초기화
func reset() {
self.count = 0
}
}
//Counter 클래스의 인스턴스를 생성한다. 초기 카운터 값은 0이다.
let counter = Counter()
//카운터 값을 증가시킨다. 이제 카운터 값은 1이다.
counter.increment()
//카운터 값을 5만큼 증가시킨다. 이제 카운터 값은 6이다.
counter.incrementBy(amount: 5)
//카운터 값을 초기화한다. 이제 카운터 값은 0이다.
counter.reset()
구조체의 인스턴스 메서드
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(x deltaX: Double, y deltaY: Double) {
self.x += deltaX
self.y += deltaY
}
}
var point = Point(x: 10.5, y: 12.0)
point.moveByX(x: 3.0, y: 4.5)
print("이제 새로운 좌표는 \(point.x), \(point.y)입니다.")
---------------------------------------------
# 클래스 인스턴스 메서드와 비교
class Location {
var x = 0.0, y = 0.0
func moveByX(x deltaX: Double, y deltaY: Double) {
self.x += deltaX
self.y += deltaY
}
}
var loc = Location()
loc.x = 10.5
loc.y = 12.0
loc.moveByX(x: 3.0, y: 4.5)
print("이제 새로운 좌표는 \(loc.x), \(loc.y)입니다
//이와는 달리 클래스의 인스턴스 메소드에서는 프로퍼티를 수정할 때 별도의 키워드를 필요하지 않는다.
//클래스의 정의된 모든 인스턴스 메소드는 인스턴스 내의 프로퍼티를 원하는대로 수정할 수 있다.
- 구조체나 열거형의 인스턴스 메서드 내부에서 프로퍼티의 값을 수정할 때는 반드시 메서드의 앞에 'mutating'이라는 키워드를 추가해야 합니다. 이 키워드를 추가하지 않은 상태에서 프로퍼티의 값 변경하려면 오류가 발생합니다.
- 구조체나 열거형 인스턴스를 상수로 할당하면 mutating 메서드를 호출할 수가 없습니다. 내부의 값을 전혀 변경할 수 없기 때문입니다.
- 구조체와 열거형만 mutating을 사용하는 이유는 메모리 관리 관점에서 보면, 값타입이기 때문입니다.
- 클래스는 참조 타입이기 때문에, 별도로 복사하지 않고 직접 접근이 가능하지만, 구조체와 열거형은 값 타입이 때문에 항상 복사가 발생합니다. 그렇기 때문에, 주소로 참조를 하기 위해서는 mutating이라는 별도의 키워드를 만들어서 사용하는 거 같습니다.(뇌피셜)
인스턴스 메서드 내에서 프로퍼티에 접근할 경우 다음 형식으로 참조합니다.
- self.프로퍼티명
- 프로퍼티 앞에 붙은 self 키워드는 구조체 자신을 가리킵니다. 정확히는 클래스나 구조체의 인스턴스 자신을 가리킨다.
- self 키워드 프로퍼티 이름을 구분해 주는 점(.)은 일종의 소속 연산자로서 '~의'라는 소속의 의미를 나타낸다
self 키워드
struct Resolution2 {
var width = 0
var height = 0
func judge() -> Bool {
let width = 30
return self.width == width //self.width와 width는 서로 다르다.
} //false
}
let res2 = Resolution2()
res2.judge()
- self 키워드를 생략하더라도 사용이 가능하나, 반드시 self 키워드를 붙여주어야 할 때가 있는데, 메서드 내부에 동일한 이름을 가진 변수나 상수가 선언되었을 때입니다.
- 즉 프로퍼티와 일반 변수의 이름이 충돌할 경우에는 프로퍼티 앞에 반드시 self 키워드를 붙여 주어야 한다.
구조체와 클래스의 인스턴스 메서드
struct Resolution {
var width = 0
var height = 0
//구조체의 요약된 설명을 리턴해주는 인스턴스 메소드
func desc() -> String {
let desc = "해상도는 \(self.width) X \(self.height) 입니다."
return desc
}
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
//클래스의 요약된 설명을 리턴해주는 메소드
func desc() -> String {
if self.name != nil {
let desc = "이 \(self.name!) 비디오 모드는 \(self.frameRate)의 프레임 비율로 표시됩니다."
return desc
} else {
let desc = "이 비디오 모드는 \(self.frameRate)의 프레임 비율로 표시됩니다."
return desc
}
}
}
//원래대로라면 width의 인스턴스는 프로퍼티이므로 다음과 같이 인스턴스를 통해서만 값에 접근 가능
var res = Resolution()
res.width
desc() 함수가 구조체와 클래스의 멤버인 인스턴스 메서드입니다. 메서드의 선언 형식은 일반 함수와 같지만, 다음 세 가지 항목에서 인스턴스 메서드는 일반 함수와 차이가 있다.
- 구조체와 클래스의 인스턴스에 소속된다는 점
- 메서드 내에서 정의된 변수와 상수뿐만 아니라 클래스 범위에서 정의된 프로퍼티도 모두 참조할 수 있다는 점
- self 키워드를 사용할 수 있다는 점
인스턴스 메서드 요약
#1. 구조체(열거형)의 인스턴스 메서드
mutating func moveByX(x deltaX: Double, y deltaY: Double) {
self.x += deltaX
self.y += deltaY
}
#2. 클래스의 인스턴스 메서드
func moveByX(x deltaX: Double, y deltaY: Double) {
self.x += deltaX
self.y += deltaY
}
- 메서드이기 때문에 인스턴스에 메모리 공간이 할당되어 있지 않습니다.
- 메서드 접근 시, 인스턴스 이름으로 접근해야 합니다 -> instance.method( )
- 메서드 실행 시, 스택프레임을 만들고 인스턴스의 데이터를 사용 -> 메서드 종료 시 스택프레임이 사라집니다.
- 값 타입(구조체/열거형)의 인스턴스 메서드에서 인스턴스 고유의 (저장) 속성을 수정할 수 없습니다.
(수정하려면 명시적으로 mutating 키워드 필요)
728x90
'iOS > Swift 문법' 카테고리의 다른 글
서브 스크립트(Subscripts) (0) | 2024.11.25 |
---|---|
타입 메서드 (0) | 2024.11.25 |
속성감시자(프로퍼티 옵저버, Property Observer) (0) | 2024.11.25 |
타입속성 (Type Properties) (0) | 2024.11.22 |
계산/연산 속성(Computed property) (0) | 2024.11.22 |