[Swift5] Structures and Classes 1

Junyoung Park·2022년 3월 9일
0

Swift5 Docs

목록 보기
19/37
post-thumbnail

Structures and Classes

스위프트는 구조체와 클래스를 외부에서 선언하지 않아도 인터페이스가 자동으로 지원된다. 인터페이스를 통해 사용자는 코드를 통해 구조체와 클래스 등 내부에서 정의한 프로퍼티와 메소드, 변수나 상수 등에 접근할 수 있다.

구조체와 클래스

구조체와 클래스는 다음과 같은 공통점이 있다.

  • 값을 저장하는 프로퍼티를 정의한다.
  • 함수 기능을 제공하는 메소드를 정의한다.
  • 서브스크립트 문법을 사용해 값에 접근할 수 있는 방법을 제공한다.
  • 이니셜라이저를 통해 초깃값을 설정할 수 있다.
  • 디폴트 기능 이외에도 함수 기능을 확장할 수 있다.
  • 특정 종류의 스탠다드 함수 기능을 제공하는 프로토콜을 호출한다.

클래스만의 특징은 다음과 같다.

  • 상속을 통해 다른 클래스의 특성을 상속받는다.
  • 타입 캐스팅을 통해 런타임 도중 클래스 인스턴스가 무슨 타입을 가지는지 확인할 수 있다.
  • 이니셜라이저 해제를 통해 할당된 초깃값을 없앨 수 있다.
  • 레퍼런스 카운팅을 통해 인스턴스에 대한 참조를 하나 이상 할 수 있다.

스위프트 가이드라인에 따르면 구조체 사용이 더 필요하기 때문에, 필수적인 이유가 아니라면 클래스보다 구조체를 선언해 사용하기를 권하고 있다.

정의 문법

구조체와 클래스를 정의하는 코드는 비슷하다. structclass라는 키워드를 사용하면 된다.

struct SomeStructure {
    // structure definition goes here
}
class SomeClass {
    // class definition goes here
}

둘 중 어떤 타입을 정의하든, 사용자는 새로운 스위프트 타입을 정의하는 셈이다. 이때 기본적인 구조체명 또는 클래스명을 짓는 방법은 UpperCamalCase로 단어 구분 시 공백 없이 대문자를 사용하는 것이다. 프로퍼티나 메소드명을 지을 때에는 이와 반대로 lowerCamalCase로 처음은 소문자로, 단어가 붙을 때에는 대문자로 시작한 단어를 사용하면 된다.

struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

resolutionResolution() 값을 할당받고 있는데, 이처럼 클래스 내 선언된 변수 데이터 타입이 구조체일 수도 있다.

구조체와 클래스 인스턴스

위 구조체나 클래스를 사용하려면 인스턴스를 만들어야 한다.

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"

someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is now 1280"

값을 조회하거나 수정 모두 쉽다.

구조체 타입에 대한 멤버와이즈 이니셜라이저

memberwise initializer는 스위프트가 구조체를 정의할 때 자동으로 만들어놓은 초기화 방법이다. 이를 통해 새로운 구조체 인스턴스의 멤버 프로퍼티를 초기화할 수 있다. 즉 구조체 인스턴스를 선언할 때 괄호 안에 멤버별로 정의하려는 값을 설정할 수 있다는 말이다.

let vga = Resolution(width: 640, height: 480)

클래스는 멤버와이즈 이니셜라이저를 허용하지 않는다.

profile
JUST DO IT

0개의 댓글