티스토리 뷰
정의 문법
,구조체와 클래스는 코드를 블럭으로 쌓아가는 유연한 구조를 만드는 일반적인 목적입니다. 구조체와 클래스의 기능을 추가하기 위해 변수, 상수, 함수를 만들 때와 동일한 문법을 사용하며 프로퍼티와 메소드를 정의할 수 있습니다. 다른 언어들과는 다르게 스위프트는 커스텀 구조체와 클래스를 만들기 위해 별도의 분리된 인터페이스나 파일들을 만들 필요가 없습니다. 스위프트에선 한 파일에 클래스나 구조체를 정의하면 자동적으로 외부 인터페이스가 외부에서도 사용할 수 있습니다.
구조체와 클래스를 비교하면
구조체와 클래스 둘 다 가능한 것들
- 값을 저장할 프로퍼티 정의 가능
- 기능을 제공할 메소드 정의 가능
- 서브스크립트 정의 가능(이건 차후에 나올 서브스크립트 챕터에 자세히)
- 생성자 정의 가능
- 기본적인 구현을 넘어서 추가적인 기능을 연장시켜줄 수 있음
- 프로토콜 채택 가능
클래스만 할 수 있는 일들
- 다른 한가지 클래스를 상속 가능
- 타입 캐스팅을 통해 런타임에서 클래스의 인스턴스 타입을 해석하고 체크할 수 있음
- 소멸자 사용 가능
- Reference counting(이건 처음 보는데 나중에 자세히 알아보자)
문서에서는 가이드라인으로 클래스보다 쉽기 때문에 구조체를 사용하는 것을 좀 더 선호하라고 나와있다. 클래스는 적절하고 필요한 타이밍에 사용 하라고 함. 너가 정의할 custom data 타입들은 대부분 구조체 혹은 열거형이 될 것이라고
정의 문법
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
인스턴스 생성
let someResolution = Resolution()
let someVideoMode = VideoMode()
// 가장 간단한 형태의 생성자
구조체의 Memberwise 생성자
let vga = Resolution(width: 640, height: 480)
구조체는 자동적으로 프로퍼티 값을 지정해줄 수 있는 memberwise 생성자를 만들어줌.
구조체와 열거형은 값 타입
값 타입은 값을 변수, 상수 혹은 함수를 통과할 때 값이 복사되는 타입.
모든 구조체와 열거형은 값 타입이기 때문에 애네 인스턴스 및 가지고 있는 프로퍼티는 전부 복사됨
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
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"
클래스는 참조 타입
참조 타입은 값을 변수, 상수 혹은 함수를 통과할 때 값이 복사되는 것이 아니라 같은 인스턴스에 대한 참조를 복사함
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
identical 연산자
같은 참조를 여러개의 상수, 변수가 가지고 있을 수도 있기 대문에 두 개의 상수,변수가 같은 클래스의 인스턴스를 참조하는 지 identical 연산자를 통해 확인 가능 ==는 같은 참조를, !=는 다른 참조를 가지고 있다는 의미.
identical to (represented by three equals signs, or ===) 가 equal to (represented by two equals signs, or ==) 와 같은 의미가 아니라는 것에 주목(한국어로는 identical이나 equal이나 의미가 거의 같아 원문을 그대로 가져옴) .identicald은 같은 참조를 비교하고, equal을 동일한 값을 가졌는지 비교
포인터
c, c++, objective-C 경험이 있다면 메모리 주소를 가리키는 포인터를 알고 있을 텐데 일부 참조 유형의 인스턴스를 나타내는 상수,변수는 C의 포인터와 유사하지만 포인터처럼 직접 메모리 주소를 저장하는 것과는 다르고 *표시도 사용하지 않음. 표준 라이브러리에 포인터를 제공하니 필요하다면 사용 가능하나 왠만해서 사용하지 않을 듯 싶다.
'Swift Language Guide' 카테고리의 다른 글
9. 메소드 (0) | 2020.11.06 |
---|---|
8. 프로퍼티 (0) | 2020.11.03 |
6. Enumerations (0) | 2020.11.01 |
5. Closures (0) | 2020.10.31 |
4. Functions (0) | 2020.10.29 |