-
Swift - MethodProgramming/Swift 2021. 11. 6. 14:51
안녕하세요 BeePeach입니다 :)
지금까지 struct, class의 구성 멤버들 중에 Property에 대해서 공부해봤습니다.
오늘은 Method(메서드)에 대해서 공부해보려고 합니다.
그럼 시작하겠습니다!
Method
메서드는 이름은 거창해 보이지만 우리가 이전에 공부했던 function(함수)와 다를 게 없습니다.
특정한 Type에 속해있는 함수를 메서드라고 합니다.
메서드는 struct, class, enum에서 선언할 수 있습니다.
그리고 프로퍼티처럼 Instance Method(인스턴스 메서드), Type Method(타입 메서드)로 나뉩니다.
인스턴스 메서드는 Instance(인스턴스)와 관련된 메서드입니다.
당연히 호출할 때도 인스턴스를 통해서 호출하겠죠??
타입 메서드는 Type과 관련된 메서드입니다.
마찬가지로 호출할때 Type을 통해서 호출합니다.
Swift는 class뿐만 아니라 structure, enumeration에도 method를 선언할 수 있습니다.
이러한 차이점이 C 또는 Objective-C와의 차이점입니다.
Instance Method
인스턴스 메서드는 Instance Property(인스턴스 프로퍼티)와 같이 인스턴스에 속한 메서드입니다.
메서드를 통해서 인스턴스 프로퍼티를 수정하거나 접근하고 인스턴스가 원하는 작업을 도와주는 역할을 합니다.
객체지향 프로그래밍에서는 객체끼리 서로 의사소통하고 상호작용 하는 데 사용됩니다.
Counter라는 class에 5가지 메서드를 작성해보았습니다.
문법은 함수와 다를게 하나도 없습니다.
단지 class안에 속해있는 차이밖에 없습니다.
인스턴스 메서드를 정의하는 스코프에서는 인스턴스 프로퍼티, 타입 프로퍼티, 인스턴스 메서드에 접근할 수 있습니다.
increse 메서드에서 self.count로 인스턴스 프로퍼티인 count에 접근하는 것을 볼 수 있습니다.
reset 메서드를 보면 count에 접근하는데 self를 사용하지 않았습니다.
추론이 가능하다면 이렇게 self를 생략하는 게 가능합니다.
self 프로퍼티는 간단하게 말하자면 인스턴스 메서드 안에서 사용한다면 자기 자신 인스턴스를 나타냅니다.
그리고 zero라는 타입 프로퍼티를 선언했습니다.
타입 프로퍼티도 마찬가지로 인스턴스 메서드 안에서 사용할 수 있습니다.
타입 프로퍼티는 인스턴스로 접근하는 게 아니라 타입으로 접근해야죠??
그래서 self를 사용하는 게 아니라 Self를 사용합니다.
Self는 타입 자체를 나타냅니다. 그래서 Line22와 Line23은 같은 기능을 하는 코드입니다.
하지만 Self는 self와 다르게 생략할 수 없습니다.
그럼 Counter 클래스를 가지고 인스턴스를 생성해 보도록 하겠습니다.
인스턴스 메서드를 호출하는 방법은 인스턴스를 생성하고 나서 그 인스턴스로 접근하면 됩니다.
인스턴스가 없다면 호출할 수 없습니다.
increse 메서드로 count를 1씩 증가시키고 있습니다.
increse(by:) 메서드로 원하는 만큼 증가시킬 수도 있습니다.
Mutating
Struct와 Class는 값 타입, 참조 타입, 상속을 제외하면 크게 다른 점이 없습니다.
그래서 위에 코드의 class를 struct로 바꿔도 문제가 없을 거 같아서 바꿔보도록 하겠습니다.
그랬더니 모든 메서드에서 에러가 발생한 게 아니라 위에 3개의 메서드에서만 에러가 발생합니다.
무슨 차이인지 잘 보니 에러가 발생한 메서드들은 모두 프로퍼티의 값을 변경하고 있습니다.
Struct와 Enum과 같이 값 타입에서는 기본적으로 인스턴스 메서드 안에서 프로퍼티의 값을 수정할 수 없습니다.
그 이유는 값 타입은 복사본을 생성하기 때문입니다.
그래서 프로퍼티 값을 변경하면 복사본만 바뀌고 원본은 바뀌지 않는 것이죠.
우리는 생각 없이 코드에서 프로퍼티 값이 변경될 거라고 생각하고 작성을 하고 넘어갔는데 값이 변경되지 않는다면 나중에 오류를 찾아내기 힘듭니다. 겉으로 봤을 때는 문제가 없으니까요!
이 문제를 해결하는 방법은 간단합니다.
func 앞에 mutating 키워드만 작성해주면 됩니다.
mutating을 적어주면 메서드가 끝날 때 변경된 내용이 기존 sturct에 적용이 됩니다.
위에서 class에서 사용했던 것처럼 이제 인스턴스를 생성해서 호출해보면 에러가 발생합니다.
그 이유는 이전 포스팅에서 설명을 했습니다.
프로퍼티 값이 변경이 되므로 let으로 인스턴스를 생성하면 에러가 발생합니다.
var로 변경해주면 에러가 나지 않는 것을 확인할 수 있습니다.
Type Method
Type Method(타입 메서드)는 특정 타입에 관련된 메서드입니다.
인스턴스로 접근하는 게 아니라 타입을 통해서 접근하는 메서드입니다.
타입 메서드는 struct, class, enum에서 사용할 수 있습니다.
타입 메서드는 static, class 키워드를 func 앞에 적어주면 됩니다.
static과 class의 차이는 class 키워드는 Class에서만 사용이 가능하고 class 키워드로 선언한 타입 메서드만 override가 가능합니다.
Circle 클래스를 보면 타입 프로퍼티인 pi와 인스턴스 프로퍼티인 radius를 선언했습니다.
그리고 인스턴스 메서드 getArea 를 선언했습니다.
인스턴스 메서드 안에서 Self를 이용하여 타입 프로퍼티에 접근할 수 있는 것을 확인할 수 있습니다.
그리고 printPi라는 타입 메서드를 선언했습니다.
자세히 보면 self.pi로 타입 프로퍼티에 접근하는 것을 볼 수 있습니다.
self 프로퍼티가 타입 메서드 안에서 사용되면 Type 자체를 의미합니다.
타입 메서드에서 인스턴스 프로퍼티에 접근하려고 하면 에러가 발생합니다.
self 하게 되면 인스턴스가 아니라 타입에 접근이 되기 때문입니다.
인스턴스 메서드는 인스턴스 이름으로 접근을 하고 타입 메서드는 타입의 이름으로 접근을 하는 것을 확인할 수 있습니다.
참고자료
여러분의 새로운 도전을 응원합니다 | KxCoding
Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기
kxcoding.com
https://docs.swift.org/swift-book/LanguageGuide/Methods.html
Methods — The Swift Programming Language (Swift 5.6)
Methods Methods are functions that are associated with a particular type. Classes, structures, and enumerations can all define instance methods, which encapsulate specific tasks and functionality for working with an instance of a given type. Classes, struc
docs.swift.org
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Inheritance (상속) (0) 2021.11.11 Swift - Subscript (0) 2021.11.07 Swift - Property Wrapper Projecting Value (0) 2021.11.05 Swift - Property Wrapper (0) 2021.10.28 Swift - Type Property (0) 2021.10.27