클래스 VS 구조체
공통점
- 값을 저장하기 위한 프로퍼티 정의
- 기능을 제공하기 위한 메소드 정의
- subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의
- 초기 상태를 설정할 수 있는 initializer 정의
- 기본 구현에서 기능 확장
- 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응(conform)
차이점(클래스만 가능)
- 상속 (Inheritance): 클래스의 여러 속성을 다른 클래스에 물려 줌
- 타입 캐스팅 (Type casting): 런타임에 클래스 인스턴스의 타입을 확인
- 소멸자 (Deinitializers): 할당된 자원을 해제(free up) 시킴
- 참조 카운트 (Reference counting): 클래스 인스턴스에 하나 이상의 참조가 가능
구조체를 사용하는 경우
- 주 목적이 관계된 간단한 값을 캡슐화(encapsulate) 하기 위한 것인 경우
- 구조체의 인스턴스가 참조되기 보다 복사되기를 기대하는 경우
- 구조체에 의해 저장된 어떠한 프로퍼티가 참조되기 보다 복사되기를 기대하는 경우
- 구조체가 프로퍼티나 메소드 등을 상속할 필요가 없는 경우
클래스
클래스 선언 문법
class VideoMode {
var resolution = Resolution() // Resolution 구조체를 값으로 사용
var interlaced = false
var frameRate = 0.0
var name: String?
}
클래스 인스턴스 생성
클래스 이름 뒤에 () 빈 괄호 붙이면 인스턴스 생성
let someVideoMode = VideoMode() // 클래스 인스턴스 생성
프로퍼티 접근
점 문법을 사용해서 클래스 인스턴스의 프로퍼티와 하위레벨 프로퍼티에 접근 가능
print(\\(someVideoMode.frameRate)")
// 0.0 출력
점 문법을 사용해서 값 할당 가능
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \\(someVideoMode.resolution.width)")
// "The width of someVideoMode is now 1280" 이 출력
클래스는 참조 타입
⭐ 참조 타입이란?
변수나 상수에 값을 할당을 하거나 함수에 인자로 전달할 때 그 값이 복사되지 않고 참조(그 값을 갖고 있는 메모리를 바라보고 있다)됨
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print("The frameRate property of tenEighty is now \\(tenEighty.frameRate)")
// "The frameRate property of tenEighty is now 30.0" 출력
- let alsoTenEighty = tenEighty 구문에서 alsoTenEighty상수가 tenEighty 인스턴스를 복사한 것이 아니라 참조한 것이기 때문에 나중에 30으로 변경된 값으로 출력됨
- 바라보고 있는 메모리 주소를 동일하게 바라보고 참조하고 있는 것
식별 연산자
상수와 변수가 같은 인스턴스를 참조하고 있는지 비교하기 위해 식별 연산자를 사용함
- === : 두 상수나 변수가 같은 인스턴스를 참조하고 있는 경우 참
- !== : 두 상수나 변수가 다른 인스턴스를 참조하고 있는 경우 참
구조체
구조체 선언 문법
struct Resolution {
var width = 0
var height = 0
}
구조체
인스턴스 생성
구조체 이름 뒤에 () 빈 괄호 붙이면 인스턴스 생성
let someResolution = Resolution() // 구조체 인스턴스 생성
프로퍼티 접근
print("The width of someResolution is \\(someResolution.width)")
// "The width of someResolution is 0" 출력
구조체형의 멤버 초기화
- 모든 구조체는 초기화 할 때 프로퍼티를 선언할 수 있는 초기자를 자동 생성해 제공
- 아래 예시에서 구조체 안에 width와 height프로퍼티만 정의했다면 자동으로 사용 가능
let vga = Resolution(width: 640, height: 480)
구조체와 열거형은 값 타입
⭐ 값 타입이란?
함수에서 상수나 변수에 전달될 때 그 값이 복사되서 전달됨
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] 메서드 (0) | 2024.03.21 |
---|---|
[Swift] 프로퍼티 (0) | 2024.03.20 |
[Swift] 클로저 (1) | 2024.03.18 |
[Swift] 예외 처리와 함수 (4) | 2024.03.17 |
[Swift] 조건/반복문 (1) | 2024.03.17 |
댓글