-
Swift4 :메소드 : Method : #메소드의 범위 : #mutating : #self #값 타입 수정스위프트: Swift/스위프트: 언어자체: 문법 2018. 9. 6. 11:06
안녕하세요 ! 씩이 입니다!
저는 Swift 와 iOS 를 공부하고 연구하는 학생입니다.
같은 분야를 공부하는 분들에게 조금이라도 도움이 주고 싶어서 공부하는 것들을 공유합니다.
제 3자가 있다고 가정하고 설명하기 때문에 존대를 하지 않는점 이해 부탁드립니다.
공유가 미래 라고 생각합니다.
한국의 모든 개발자분들 존경합니다!
- Swift version : Swift 4.2 Swift 언어
- 참고한 것들
- 씩이 Github
- 자료구조 소스파일 있습니다.
- iOS 관련 자료들, 정보들 정리해 두었습니다.
- 스위프트로 구현한 자료구조 : DataStructures in Swift4
- Swift4 : 연결리스트 (1 / 3) : #LinkedList : #DataStructrue : #자료구조
- Swift4 : 연결리스트 (2 / 3) : #LinkedList : #값 추가하기, push, append : #값 삽입하기,insert
- Swift4 : 연결리스트 (3 / 3) : #LinkedList : #값 제거하기, pop, removeLast, remove(at: )
- [스위프트 : 자료구조] 스택: Stack: 자료구조: DataStructure: 쌓기
- [스위프트 : 자료구조] 스택 : Stack : 프로토콜 지향 스택 구현하기
- [스위프트 : 자료구조] 큐 (1 / 4): Queue: #자료구조: #배열로 구현한 큐: #배열의원리
- [스위프트 : 자료구조] 큐 (2 / 4): Queue: #자료구조: #연결리스트: #더블연결리스트: #DoublyLinkedList
- [스위프트 : 자료구조] 큐 (3 / 4): Queue: #자료구조: #Stack으로 구현: #더블스택: #DoubleStack: #제일좋음
- [스위프트 : 자료구조] 큐 (4 / 4): Queue: #자료구조: #RingBuffer: #링버퍼로 구현한 큐: #고정된배열: #마지막!!
- [스위프트 : 자료구조] 큐: Queue: 프로토콜 지향 큐 구현하기
- 스위프트: 트리: Tree: #자료구조: #깊이우선탐색: #레벨정렬탐색: #검색알고리즘: Swift4
- 스위프트: 이진 탐색 트리(1 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- 스위프트: 이진 탐색 트리(2 / 2): #BinarySearchTree: #자료구조: #배열과 비교: #트리: #탐색: #삽입: #삭제
- [스위프트 : 자료구조] AVL Tree: 자가 균형 트리: #balance: #트리의 높이: #rotation메소드: #성능오짐
- [스위프트:자료구조] 트라이: Trie: 문자열 찾기: 단어 찾기
- [스위프트:자료구조] Heap: 힙 자료구조 (1 / 2) : Heap 이란?
- [스위프트:자료구조] Heap: 힙 자료구조 (2 / 2) : Heap 구현하기
- 스위프트로 구현한 알고리즘 : Algorithms in Swfit4
- [스위프트 : 알고리즘] 재귀호출 (1 / 6) : recursive: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 팩토리얼 (2 / 6) : factorial: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 거듭제곱 (3 / 6) : Power: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 피보나치 수열(4 / 6) : Fibonacci: 재귀호출 : 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 하노이의 탑 (5 / 6) : Hanoi: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트 : 알고리즘] 재귀 : 최대공약수 (6 / 6) : GCD: 재귀호출: 재귀함수: 반복문: 팩토리얼: 거듭제곱: 피보나치: 하노이의 탑: 최대공약수
- [스위프트:알고리즘] 이진 탐색[1 / 3]: Binary Search: 이진 탐색이 뭐야?
- [스위프트:알고리즘] 이진 탐색[2 / 3]: Binary Search: 이진 탐색: 반복문, 재귀호출로 구현하기
- [스위프트:알고리즘] 이진 탐색[3 / 3]: Binary Search: 이진 탐색: 프로토콜 지향으로 구현하기
- Swift 주제별 분류
- Swift4 : 제어 전달 명령문( Control Transfer Statement ) : #continue, #break, #return 키워드
- Swift4 : 클래스와 구조체 : #값을 대하는 방식 : #참조타입, 값 타입 : #===
- Swift4 : 프로퍼티 : #Property : #get, set : #willSet, didSet
- Swift4 : 메소드 : #Method : #영향력 범위 : #self : #mutating : #값타입 수정
- Swift4 : 프로토콜 1 : #Protocol : #설계 : #요구사항 : #델리게이트 패턴 전처리 (1 / 2)
- Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2)
- Swift4 : 제네릭 : #Generics : #왜필요해? : #where키워드 : #제약사항걸기
- Swift4 : 자동 참조 카운팅 : #Automatic Referece Counting : #ARC :#강한참조 : #Strong Reference Cycle : #메모리 누수
- Swift4 : 클로저: Closure: #표현방식: #왜필요해?: #효율적: #간결성: #생략
- [스위프트 : 기초] 서브스크립트 : Subscript : 지름길
메소드 : Method
- what's a Methods :
- 특정 타입과 연결된 함수들을 메소드라고 합니다. 여기서 특정 타입은 클래스나, 구조체, 열거형 등을 말합니다.
- 클래스로 예를 들면 특정 타입이 클래스가 되는 것이니, 해당 클래스와 연결되어서( 안에서 ) 정의된 함수들을 말하는 것이죠.
- 좀 더 세분화 하면 특성에 따라 인스턴스 메소드와, 타입 메소드로 나눌 수 있습니다.
- 인스턴스 메소드 : Instance Method
- What? : 특정 클래스, 구조체 혹은 열거형에 속한 함수들 입니다.
- 이러한 객체를 정의할 때는 필요하니까 정의를 하잖아요? 그 필요성을 충족시키는 핵심 역할이 함수 입니다. 프로퍼티는 단순한 변수 느낌이지만, 함수는 보다 여러 일을 수행할 수 있기 때문에 해당 객체와 직접적으로 연결되 있으므로, 메소드는 해당 인스턴스에 핵심적인 역할을 한다고 볼 수 있죠.
- 아래 예제에서 포함되 있는 설명 : #특정 타입이 뭔데? : #여러 가능의 인스턴스 메소드
123456789101112131415161718class Counter { // Counter 클래스 : 특정 타입인 것이죠var count = 0func increment() {// 인스턴스 메소드// Counter 라는 타입으로 인스턴스를 생성하면, increment() 라는 함수에 접근해서 작업을 수행시킬 수 있습니다. 이것이 인스턴스 메소드.count += 1 // count 를 1 더하는 작업을 수행시키네요. => 메소드가 Counter 클래스의 핵심 기능을 담당한다는 것 이해되죠?}func increment(by amount: Int) { // 매개변수로 넣은 수 많큼 증가시킬 수 있는 기능의 인스턴스 메소드count += amount}func reset() { // 되돌리는( reset ) 기능의 인스턴스 메소드count = 0}}let counter = Counter() //Counter 클래스 타입으로 인스턴스 생성하고 counter 상수에 저장. : counter = 0 ( 초기값 ) 인 상태counter.increment() // counter 상수에 있는 인스턴스를 이용해서 increment() 인스턴스 메소드에 접근 : counter = 1 인 상태counter.increment(by: 5) // 마찬가지로 counter 상수에 있는 인스턴스를 이용해서 increment(by:) 인스턴스 메소드에 접근 : counter = 6 인 상태cs - self 프로퍼티
- 모든 타입( 클래스, 구조체, 열거형 등이죠? ) 의 인스턴스는 암묵적으로 self 라고 불리는 프로퍼티를 가지고 있는데요. self 프로퍼티는 인스턴스 자체를 표현하기 위해 쓰는 것이에요! 인스턴스 메소드는 함수라서 중괄호 ( { } ) 로 둘러 쌓여 있는데, 그 안에서 현재 인스턴스를 참조하고자 할 때 사용합니다.
- 굳이 self 를 써주지 않는다면 Swift 는 자동으로 현재 인스턴스 안에 있는 프로퍼티나 메소드를 인식합니다. 위의 예제에서 increment() { self.count += 1 } 를 사용하지 않은 것 보이죠?
- 그럼 이건 굳이 self 왜 쓰냐 ?
- 인스턴스의 프로퍼티 이름과 인스턴스 메소드의 매개변수 이름이 같을 때? : 이해안되죠? 코드로 설명합니다.걱정ㄴㄴ
12345678910111213struct Point { // Point 구조체 타입.var x = 0.0, y = 0.0 // 프로퍼티func isToTheRightOf(x: Double) -> Bool { // 인스턴스 메소드return self.x > x// 앞의 : self.x 가 위에 있는 프로퍼티 x 를 뜻하고// 뒤의 : x 가 메소드 isToTheRightOf(x:) 메소드의 매개변수인 x 를 뜻합니다.// 이 둘을 구별해 주기 위해서 self 를 사용합니다.}}let somePoint = Point(x: 4.0, y: 5.0)if somePoint.isToTheRightOf(x: 1.0) { // 인스턴스 메소드의 반환값이 true ( 4 > 1 이므로 )print("This point is to the right of the line where x == 1.0") // 출력됩니다.}cs - 인스턴스 메소드 내에서 값 타입 수정하기 : mutating 키워드
- 기본적으로 값 타입의 프로퍼티들은 인스턴스 메소드 내에서 수정될 수 없습니다.
- 구조체나 열거등 등이 값 타입이죠? 구조체 인스턴스의 프로퍼티는, 해당 인스턴스 메소드 안에서 수정될 수 없다는 말입니다. ( 참조타입인 클래스는 수정 가능 )
- 이럴 때 mutating 키워드 를 사용해서 값 타입의 인스턴스 프로퍼티를 메소드 안에서 수정할 수 있습니다.
- 아래 예제에는 이런 것들이 포함되어 있습니다. : #mutating : #값 타입 수정
123456789101112struct Point { // 구조체 Pointvar x = 0.0, y = 0.0mutating func moveBy(x deltaX: Double, y deltaY: Double) { // mutate 키워드가 붙은 인스턴스 메소드x += deltaX // mutate 키워드가 붙었음으로 구조체의 프로퍼티 x 의 값을 변경할 수 있습니다.y += deltaY // 주의할 점 : 구조체 자체의 값을 변경하는 것이 아니라, 해당 구조체의 인스턴스 값을 변경하는 것, 구조체는 계속 x의 초기값 0}}var somePoint = Point(x: 1.0, y: 1.0)// 구조체 Point 인스턴스를 저장하고 있는 somePoint 변수// 구조체 인스턴스 받는 somePoint 가 변수임을 유의, 상수는 불변의 값이기 때문에 mutating 을 허용하지 않음! ( 당연한 말이죠? )somePoint.moveBy(x: 2.0, y: 3.0)// 인스턴스를 이용해서 메소드에 접근, 값 변경하면 -> somePoint변수는 이제 x, y 값이 변경됩니다.// 어디까지나 somePoint 에 국한된 이야기 란것 주의! 이 범위가 은근 헷갈리죠? ㅠㅠprint("The point is now at (\(somePoint.x), \(somePoint.y))") // 3,4 로 출력cs 타입 메소드는 타입 프로퍼티와 같이 정리할 예정입니다 ! coming soon'스위프트: Swift > 스위프트: 언어자체: 문법' 카테고리의 다른 글
댓글