조앤의 기술블로그
[Swift] Method and Subscript 본문
메소드는 특정 형식에 속하는 함수입니다.
<Instance Method>
인스턴스 메소드는 인스턴스를 통해 호출하고, 특정 인스턴스에 연관된 동작을 구현하는 메소드입니다.
func name(parameters) -> ReturnType {
Code
}
instance.method(parameters)
함수와 구현 방식은 동일하지만, 호출할 때 인스턴스를 호출하면서 점문법으로 메소드를 호출해야 합니다.
클래스, 구조체, 열거형에서 사용할 수 있습니다.
class Sample {
var data = 0
static var sharedData = 123
func doSomething() {
print(data)
Sample.sharedData
}
func call() {
doSomething()
}
}
let a = Sample()
a.data
a.doSomething()
a.call()
doSomething()과 call()이 인스턴스 메소드입니다.
(인스턴스멤버에서 타입멤버에 접근할 때는 타입형식을 써주어야 하므로 Sample.sharedData가 됩니다.)
호출할 때는 인스턴스인 a를 점문법과 함께 호출해주어야 합니다.
class Size {
var width = 0.0
var height = 0.0
func enlarge() {
width += 1.0
height += 1.0
}
}
let s = Size()
s.enlarge()
클래스의 속성값을 변경하는 인스턴스 메소드입니다.
struct Size {
var width = 0.0
var height = 0.0
mutating func enlarge() {
width += 1.0
height += 1.0
}
}
var s = Size()
s.enlarge()
구조체로 같은 예시를 만들어보았습니다.
이 때 주의해야 할 점은 값형식에서 속성을 바꾸는 메소드를 선언할 때에는 메소드 선언 앞에 'mutating'키워드를 붙여야 한다는 것입니다.
그리고 구조체의 가변성은 속성의 가변성에 영향을 미치기 때문에 메소드를 호출하기 위해선 인스턴스를 var 키워드로 선언해야 합니다.
<Type Method>
타입 메소드는 인스턴스가 아닌, 형식에 연관된 메소드입니다.
static func name(parameters) -> ReturnType {
statements
}
class func name(parameters) -> ReturnType {
statements
}
Type.method(parameters)
static 은 오버라이딩 할 수 없고, class는 서브클래스에서 오버라이딩 할 수 있는 타입 메소드입니다.
class Circle {
static let pi = 3.14
var radius = 0.0
func getArea() -> Double {
return radius * radius * Circle.pi
}
class func printPi() {
print(pi)
}
}
Circle.printPi()
class StrokeCircle: Circle {
override static func printPi() {
print(pi)
}
}
getArea()와 printPi()는 타입메소드입니다.
printPi() 메소드를 static으로 선언할 경우, 서브클래스인 StrokeCircle에서 오버라이딩할 수 없습니다. 따라서 class로 선언해야합니다.
<Subscript>
요소에 접근할 때 인덱스, 키, 범위로 접근하는 것을 서브스크립트라고 합니다.
let list = ["A", "B", "C"]
list[0]
서브스크립트를 직접 구현하는 방법에 대해 알아보겠습니다.
subscript(parameters) -> RetureType {
get {
return expr
}
set(name) {
statements
}
}
[예제]
class List {
var data = [1, 2, 3]
subscript(index: Int) -> Int {
get {
return data[index]
}
set {
data[index] = newValue
}
}
}
var l = List()
l[0] // 1
l[1] = 123 // 값 변경
서브스크립트를 직접 구현하여 인덱스로 값에 접근할 수도 있고, 값을 변경할 수도 있습니다.
struct Matrix {
var data = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
subscript(row: Int, col: Int) -> Int {
return data[row][col]
}
}
let m = Matrix()
m[0, 0]
2차원 배열의 서브스크립트를 구현한 예제입니다.
참고, 코드인용 - KxCoding.com - Hello, Swift 강의
'Study > Swift' 카테고리의 다른 글
[Swift] Type Casting (타입 캐스팅) (0) | 2020.02.25 |
---|---|
[Swift] Inheritance and Polymorphism(상속과 다형성) (0) | 2020.02.24 |
[Swift] Property(프로퍼티) #2 (0) | 2020.02.20 |
[Swift] Property(프로퍼티) #1 (0) | 2020.02.20 |
Tuples (튜플) (0) | 2020.02.18 |