-
Swift4 : 클래스와 구조체 : #값을 대하는 방식 : #값 타입, 참조 타입 : #value type : #reference type : #=== 연산자스위프트: Swift/스위프트: 언어자체: 문법 2018. 9. 5. 00:58
안녕하세요 ! 씩이 입니다!
저는 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 : 지름길
구조체와 클래스 (Structures and Classes)- 다른 언어의 구조체, 클래스와 다른 점.
다른 언어들과 다른 점은 구조체나 클래스를 단일 파일로 정의하고, 해당 구조체나 클래스에 대한 외부 인터페이스를 다른 코드에서 자동으로 사용할 수 있다는 것입니다.- 구조체와 열거형은 값 타입 : Value Types
값 타입 ( value type ) 이란 값이 변수나 상수에 할당되거나 함수에 넘겨질 때 값이 복사하는 과정을 거치는 것 입니다. 구조체와 열겨형이 값 타입이라는 말은 그들이 생성하는 인스턴스들은 넘겨지거나 어떤 행동을 취할 때 항상 복사된다는 말입니다.실제로 거의 모든 스위프트 기본 타입들 ( Int, Float, Bool, String, Array ...등등 ) 은 값 타입 이고, 그 타입들의 내부를 보면 실제로 모두 구조체 입니다. 예를 들어 Int 자료형을 쓰는 것은 Int 라는 구조체를 쓰는 것이죠.값 타입을 예를 들어 설명하면.123456789101112131415161718192021struct Resolution { //구조체var width = 0var height = 0}let hd = Resolution(width: 1920, height: 1080) // Resolution 인스턴스 를 상수 hd 에 저장하고var cinema = hd// 현재 hd 에 있는 값을 cinema 변수에 저장한다// 이 둘은 같은 값을 가지고 있지만 내부에서는 완전히 다른 인스턴스다.cinema.width = 2048 // cinema 의 width 프로퍼티에 2048 할당하기.print("cinema is now \(cinema.width) pixels wide")// Prints "cinema is now 2048 pixels wide"print("hd is still \(hd.width) pixels wide")// Prints "hd is still 1920 pixels wide"// 서로 다른 인스턴스라는 증거// 1. cinema 인스턴스의 값이 변경되더라도, hd 의 값에는 아무런 영향이 없다.// 2. 상수 hd 에 있는 인스턴스를 변수 cinema 에 넣어서 값을 수정했다는 것은// cinema의 인스턴스는 값만 같고, 상수가 아닌 변수라는 형식의 새로운 인스턴스라는 것을 증명.cs 데이터 구조를 그림으로 표현하면 아래와 같습니다.
같은 방식으로 열거형에도 예를 들면, 다음과 같습니다.
123456789101112131415enum CompassPoint { //열거형case north, south, east, westmutating func turnNorth() { // mutating 은 함수의 내부에 있는 프로퍼티 값이 외부의 프로퍼티 값을 수정할 수 있다는 권한입니다.self = .north}}var currentDirection = CompassPoint.westlet rememberedDirection = currentDirectioncurrentDirection.turnNorth()print("The current direction is \(currentDirection)")print("The remembered direction is \(rememberedDirection)")// Prints "The current direction is north"// Prints "The remembered direction is west"// 서로 다른 인스턴스이기 때문에 값에 영향을 미치지 못합니다. 값 타입이므로 복사에 의해 값만 전달된 방식이기cs - 클래스는 참조타입 : Reference Type
구조체와는 다르게 값이 변수나 상수에 할당되거나 함수에 넘겨질 때 복사되지 않습니다. 복사본이 아니라 동일한 기존 인스턴스에 대한 참조 인 것이죠.참조 타입을 예를 들어 설명 해야합니다. 은근히 복잡합니다! 여기서부터 집중해야 이해할 수 있습니다.코드의 흐름에 따라서 주석을 활용해서 설명합니다.12345678910111213141516171819202122232425262728293031323334353637class VideoMode { // 클래스var resolution = Resolution()var interlaced = falsevar frameRate = 0.0var name: String?}struct Resolution { // 구조체var width = 0var height = 0}let hd = Resolution(width: 1920, height: 1080)// 상수 hd 에 저장된 Resolution 인스턴스// 주의해야 할 것이 Resolution 인스턴스 자체가 저장되어 있는 것이 아니라// 구조체 Resolution 의 틀로 찍어내고 값을 1920, 1080 로 설정한 아예 새로운 인스턴스 라는 것!let tenEighty = VideoMode()// 상수 tenEighty 에 할당된 VideoMode 참조정보// 상수 tenEighty 에 저장된 것은 VideoMode 의 인스턴스 가 아니라 VideoMode 클래스를 가리키는 '참조정보' 가 저장됨tenEighty.resolution = hdtenEighty.interlaced = truetenEighty.name = "1080i"tenEighty.frameRate = 25.0let alsoTenEighty = tenEighty// 상수 alsoTenEighty 에는 상수 tenEighty 에 저장되 있는 '참조정보' 가 저장됩니다.// 정리하자면 상수 alsoTenEighty 와 상수 tenEighty 에는 동일한 VideoMode 클래스를 가리키는 '참조정보' 가 저장되는 것.alsoTenEighty.frameRate = 30.0// alsoTemEighy 는 상수인데 어떻게 VideoMode 하위 프로퍼티인 frameRate 를 수정하는 것이냐 하면은// alsoTemEighy 가 저장하고 있는 값은 VideoMode 를 가리키는 '참조정보' 이기 때문에// '참조정보' 가 변하는 것이 아니라, 참조되고 있는 VideoMode 의 하위 프로퍼티가 바뀌는 것입니다. 그러므로 수정가능print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")// Prints "The frameRate property of tenEighty is now 30.0"// alsoTenEighty 로 수정했는데 tenEtighty 의 frameRate도 수정된 상태입니다.// 이것으로 같은 '참조정보' 를 가지고 있는 두 상수는, 하나의 상수만 변경시켜도 '참조정보' 가 같으므로 모두 변경됨을 알 수 있습니다.cs 자 . 여기까지가 클래스와 구조체에서 제울 중요한, 그들이 값을 대하는 방식입니다.
- Identity Operators : ID 연산자 : ( === , !== )
클래스는 참조 타입이기 때문에 내부적으로 여러개의 변수나 상수가 같은 인스턴스를 참조할 가능성이 있습니다. ( 앞에서 설명했으니 너무나 당연하죠? ) 하지만 이것은 어디까지나 참조타입에서 생기는 문제점이기 때문에 구조체나 열거형 같은 값 타입의 형식에서는 해당되지 않습니다.
두 상수나 변수가 같은 인스턴스를 참조하는 지 알아내려고 할 때 이 연산자를 사용합니다. ( == 값이 같다는 의미의 Equal 연산자와 착각할 수 있음을 주의 )
- Identical to ( === )
- Not identical to ( !== )
소스 코드에서 사용해 보면 아래와 같습니다.
1234if tenEighty === alsoTenEighty {print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")}// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
cs
정리하겠습니다.
- 값 타입 : 구조체 , 열거형 : 복사된 새로운 인스턴스를 만들어서 전달하는 방식으로 값을 대함
- 참조 타입 : 클래스 : 참조를 전달하는 방식으로 값을 대함, 즉 인스턴스의 참조 정보를 전달하는 것.
(추가 . 18.09.05)글로만 보면 이해하기 어려우실 것 같아 X-Code 로 작성하고 , 코드 중간에 Break Point ( 코드 중간에 변수 값의 변화를 알아볼 수 있는 도구 ) 걸어서 출력받은 값입니다. 위에서 설명한 것과 같이
1. tenEighty 와 alsoTenEighty 는 메모리 주소( 참조정보 ) 를 저장
2. hd 와 tenEighty.resolution 은 값만 저장저장방식이 다른 게 눈에 보이죠?
'스위프트: Swift > 스위프트: 언어자체: 문법' 카테고리의 다른 글
Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2) (0) 2018.09.07 Swift4 : 프로토콜 1 : #Protocol : #설계 : #요구사항 : #델리게이션 : #델리게이트 패턴 ( 1 / 2 ) (0) 2018.09.07 Swift4 :메소드 : Method : #메소드의 범위 : #mutating : #self #값 타입 수정 (0) 2018.09.06 Swift4 : 프로퍼티 : #Properties : #get, set " #willSet,didSet (0) 2018.09.05 Swift4: 제어 전송 명령문( Control transfer statement ) : continue, break, return (0) 2018.09.04 댓글