조앤의 기술블로그

[Swift] Method and Subscript 본문

Study/Swift

[Swift] Method and Subscript

쬬앤 2020. 2. 21. 15:03

메소드는 특정 형식에 속하는 함수입니다. 

 

<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