구조체와 클래스(Structure and Class)

린다·2022년 2월 18일
0

The Swift Language Guide

목록 보기
3/7
post-thumbnail

아래의 글은 The swift programming languagebbiguduk님, jusung님의 번역본을 보며 공부한 내용입니다.

Struct vs Class

공통점

  • 값을 저장하는 프로퍼티 정의
  • 기능 제공을 위한 메서드 정의
  • subscript 정의
  • 초기화 정의
  • extension 정의
  • protocol 채택 가능

차이점

  • Class는 추가적인 기능이 가능함
    • 상속 가능
    • 타입 캐스팅을 사용하여 class 인스턴스의 타입을 확인 및 해석 가능
    • 초기화 해제 구문(deinit)을 통해 인스턴스에 할당된 리소스 해제 가능
    • 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락
    • 이러한 추가 기능들은 복잡성이 증가할 수 있으므로 대부분의 사용자 정의 데이터 타입은 구조체 혹은 열거형

정의

struct SomeStructure {
    // structure definition goes here
}
class SomeClass {
    // class definition goes here
}
  • struct, class의 이름은 UpperCamelCase, 프로퍼티와 메서드는 lowerCamelCase
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()

프로퍼티 접근

print("The width of someResolution is \(someResolution.width)")
// Prints "The width of someResolution is 0"
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"

Memberwise Initializer

  • 구조체만 가능함
  • 자동적으로 생성되는 memberwise initializer가 있음
let vga = Resolution(width: 640, height: 480)

구조체, 열거형 = 값타입

  • 변수, 상수에 할당되거나 함수에 전달될 때 복사되는 값 타입
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd // 복사, hd와 cinema는 독립적인, 완전 다른 인스턴스

클래스 = 참조타입

  • 복사되지 않고 참조가 전달되는 타입

Untitled

  • 변수, 상수 할당 후 값 변경 시 모두 할당 전 객체도 함께 변경됨
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
  • 이때 tenEighty 자체는 상수로 선언됨. 하지만 프로퍼티의 값을 변경하는 것은 상수 자체를 변경하는 것은 아니기 때문에 변경이 가능함.
  • tenEighty, alsoTenEighty 자체는 VideMode 인스턴스를 저장하지 않고 해당 인스턴스를 둘 다 참조하고 있음

식별 연산자(Identity Operators)

  • 2개의 상수 혹은 변수가 클래스의 같은 인스턴스를 참조하는지 확인할 때 사용하는 식별 연산자
  • 동일 인스턴스(===), 동일하지 않은 인스턴스(!==)

0개의 댓글