서문
- Swift에서는 구현한 struct와 class에 대해 별도의 인터페이스와 구현 파일을 만들 필요가 없다
단일 파일로 struct 또는 class를 정의하면 외부 인터페이스가 자동으로 다른 코드에서 사용할 수 있습니다
(당최 무슨 말인지 모르겠으니 더 읽어보자) - Swift에서는 객체(object)보다는 인스턴스로 표현한다
- 다른 언어대비 struct와 class가 기능적으로 훨씬 가깝다
Struct와 Class 비교
- Swift에서는 struct와 class간 기능적으로 유사하고 공통점이 많다
- 클래스의 추가 기능은 복잡성을 증가시키기 때문에
- 일반적으론 추론이 쉬운 Struct 사용을 선호하고 / 필요할 때 Class를 사용합니다
- Struct와 Class의 공통 기능
- 저장 프로퍼티를 가짐
- 메서드 정의 가능
- 서브스크립트 정의 가능 (이건 아직 모르겠다)
- init( ) 정의 가능
- extension 사용 가능
- 프로토콜 사용 가능
- Class만의 추가 기능
- 상속 가능
- 타입 캐스팅을 사용하여 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있다???
- deinit( )을 정의할 수 있다
- 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락합니다???
- Struct만의 기능
- 멤버 프로퍼티 초기화를 다음과 같이 간편한 구문으로 구현할 수 있다
let vga = Resolution(width: 640, height: 480)
- 멤버 프로퍼티 초기화를 다음과 같이 간편한 구문으로 구현할 수 있다
- 정의
-
- 모든 프로퍼티에 default 정의
- class의 저장 프로퍼티로 struct 인스턴스 사용
- name은 optional로 정의
struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }예제
-
- 인스턴스 생성
- 예제
- init 함수를 정의했다면 실행된다
let someResolution = Resolution() let someVideoMode = VideoMode()
- 예제
- 프로퍼티 사용
- 예제
- dot으로 접근
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
- dot으로 접근
- 예제
Struct와 enum은 값 타입이다
- 기본
- 상.변수로 할당될 때나 함수로 전달될 때 copy되어 전달된다
- 그러므로 새로이 할당한 변수나, 함수에서 전달받은 것을 변경한다고 해서 원본에는 영향이 없다
- 지금까지 다루었던 모든 기본 타입(정수, 부동소수점, 부울, 문자열, 딕셔너리 등)은 값 타입이며 struct로 구현되어 있다
- 실제로는 최적화가 적용되어 요소가 수정될 때만 새로 복사된다
- 예제
let hd = Resolution(width: 1920, height: 1080) var cinema = hd cinema.width = 2048 //Struct는 값 타입이므로 //cinema를 변경하더라도 hd에는 영향이 없다
- 값 타입은 인스턴스를 상수로 선언하면 프로퍼티도 변경이 불가하다
struct def { var num = 1 } let b = def() //컴파일 에러 b.num = 2
- b를 상수로 생성하면 프로퍼티 num이 변수더라도 변경이 불가하다
- b에는 def( )로 인해 생성된 "인스턴스 자체"가 저장된다.
- 그러므로 b.num을 변경한다는 것은 b를 변경하는 것과 같은 일이 되는 원리로 동작하여 변경이 불가하다
Class는 참조 타입이다
- 기본
- 참조 타입은 상.변수로의 할당 및 함수 parameter 전달에 있어 copy본이 아닌 인스턴스의 참조를 전달한다
- 실제로는 하나의 인스턴스에 다른 2개의 이름을 갖는 것과 같다
- 예제
let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 //tenEighty.frmaeRate 역시 30.0으로 변경됨
- 참조 타입은 인스턴스를 상수로 선언하더라도 프로퍼티는 변경이 가능할 수 있다
class abc { var num = 1 } let a = abc() a.num = 2
- a가 상수더라도 프로퍼티 num이 변수면 변경이 가능하다
- a는 값 타입에서와 달리, 생성된 "인스턴스 자체"가 저장되는게 아닌 생성된 "인스턴스에 대한 참조"가 저장된다
- a.num = 2로 인해 변경되는 것은 a가 아니라 a가 참조하는 인스턴스가 바뀌게 되는 원리로 동작하여 변경이 가능하다
- 식별 연산자
- Class는 참조 타입이므로 여러 상.변수가 실제론 하나의 Class 인스턴스를 가리킬 수 있다
- 코드간 거리가 멀면 헷갈리므로 확인하는 방법이 제시되었다
- ===와 !==
if tenEighty === alsoTenEighty { //They refer to same Class Instance ... } if tenEighty !== alsoTenEighty { //They refer to different Class Instance ... }
- 포인터
- 일부 참조 타입의 인스턴스를 참조하기 위해 음... 이건 나중에 보자
'Swift > Language Guide' 카테고리의 다른 글
Methods - #1/1 (0) | 2021.09.12 |
---|---|
Properties - #1/1 (0) | 2021.09.12 |
Control Flow - #2/2 (0) | 2021.09.12 |
Control Flow - #1/2 (0) | 2021.09.12 |
Functions - #1/1 (0) | 2021.09.12 |
댓글