Swift - 구조체와 클래스 1

 

구조체와 클래스의 비교 및 정의 문법

구조체와 클래스 (Structures and Classes) #1


  • 범용적으로 사용되는 유용한 구조로 상수, 변수, 함수를 정의하는 것과 같은 구문으로 속성 및 메서드를 추가할 수 있다.
  • 단일 파일로 구조체나 클래스를 정의하면 자동으로 다른 코드에서(import 문을 통해) 사용할 수 있다.

구조체와 클래스의 비교

  • 공통점
    • 값을 저장하는 프로퍼티 정의
    • 기능 제공을 위한 메서드 정의
    • 서브 스크립트 구문을 사용하여 값에 접근할 수 있도록 하는 수Subscripts 정의
    • 초기 상태를 설정하기 위한 초기화 정의
    • 기본 구현을 넘어서는 기능적 확장을 위한 Extensions
    • 특정 종류의 표준 기능을 제공하는 Protocols 준수
  • 클래스만의 추가적인 기능
    • 상속이 가능하다.
    • 타입 캐스팅을 통해 런타임 시 클래스 인스턴스 타입을 확인하고 해석할 수 있다.
    • 초기화 해제 구문(Deinitializers)을 사용하여 클래스의 인스턴스가 할당된 리소스를 해제할 수 있다.
    • 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허용한다.
  • 클래스가 지원하는 기능은 복잡성이 증가한다.
  • 따라서 일반적으로 추론하기 쉬운 구조체를 선호하고 클래스는 필요한 경우에만 사용하는 것이 권장된다.

구조체와 클래스의 선택

  • 기본적으로 구조체를 사용하라
  • Objective-C와의 호환이 필요한 경우 클래스를 사용하라
  • 모델링한 데이터의 독자성을 위해서는 클래스를 사용하라.
  • 모델의 상속과 동작의 공유를 위해서는 구조체와 프로토콜을 사용하라

Choosing Between Structures and Classes

정의 문법

  • 구조체와 클래스는 비슷한 정의 문법을 가지고 있다.
  • 구조체는 struct, 클래스는 class 키워드를 사용한다.
struct SomeStructure {
	// 구조체 정의 구문 작성
}

class SomeClass {
	// 클래스 정의 구문 작성
}

Swift에서 구조체와 클래스를 만드는 것은 새로운 type을 정의하는 것이다. 따라서 표준 Swift type 명명 규칙에 따라 구조체와 클래스는 UpperCamelCase(대문자로 시작하는 카멜 케이스)로, 프로퍼티와 메서드는 lowerCamelCase(소문자로 시작하는 카멜 케이스)로 명명한다.

struct Resolution {
	var width = 0
	var height = 0
}

class VideoMode {
	var resolution = Resolution()
	var interaced = false
	var frameRate = 0.0
	var name: String?
}
  • Resolution 구조체는 width와 height 두 개의 stored 프로퍼티를 가지고 있으며 0으로 초기화 되어 Int 타입으로 유추된다.
  • VideoMode 클래스는 네 개의 stored 프로퍼티가 있으며 그 중 처음 것은 Resolution 구조체의 인스턴스 이다.
  • 이 코드는 단지 Resolution 구조체와 VideoMode 클래스의 외형만 설명한다.