오늘의 주제
1. 구조체
2. 클래스
안녕하세요, 야곰입니다.
지난 포스팅에서는 스위프트의 함수와 함께 스위프트에서 제공하는 컬렉션 타입에 대해 알아봤습니다.
2017/01/23 - [Swift] - Swift란 어떤 언어인가?
2017/01/25 - [Swift] - Swift 기초문법 - 변수, 상수, 기초 데이터 타입
2017/02/06 - [Swift] - Swift - 함수, 콜렉션 타입
구조체와 클래스
구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 용이합니다. 구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있습니다. 하나의 새로운 사용자정의 데이터 타입을 만들어 주는 것입니다.
객체지향 프로그래밍 패러다임을 알고 있다면 클래스라는 용어를 들어봤을 겁니다. 객체지향 프로그래밍 패러다임이 아니더라도 데이터를 구조화하여 관리하는 데 구조체를 사용해봤을 겁니다. 스위프트에서는 구조체와 클래스의 모습과 문법이 거의 흡사합니다. 다만, 구조체의 인스턴스는 값 타입이고, 클래스의 인스턴스는 참조 타입이라는 것이 이 둘을 구분하는 가장 큰 차이점입니다.
이제까지 우리가 알아본 스위프트의 데이터 타입과 열거형은 모두 값 타입니다. 그러나 구조체와 함께 배워볼 클래스는 참조 타입입니다. C 언어와 Objective-C의 포인터와 유사한 개념입니다.
참고로 스위프트는 참조 타입보다는 값 타입에 친절한 언어입니다.
구조체
구조체는 struct 키워드로 정의합니다.
struct [구조체 이름] { [프로퍼티와 메서드들] }
struct BasicInformation { var name: String var age: Int }
구조체 인스턴스의 생성 및 초기화
// 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이저를 사용하여 구조체를 생성합니다. var yagomInfo: BasicInformation = BasicInformation(name: "yagom", age: 99) yagomInfo.age = 100 // 변경 가능! yagomInfo.name = "Bear" // 변경 가능! // 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이저를 사용하여 구조체를 생성합니다. let hanaInfo: BasicInformation = BasicInformation(name: "hana", age: 99) hanaInfo.age = 100 // 변경 불가!
클래스
class [클래스 이름] { [프로퍼티와 메서드들] }
class [클래스 이름]: [부모클래스 이름] {
[프로퍼티와 메서드들]
}
사람의 기본정보를 프로퍼티로 갖는 클래스를 정의해보겠습니다.class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
클래스 인스턴스의 생성과 초기화
var yagom: Person = Person() yagom.height = 123.4 yagom.weight = 123.4 let hana: Person = Person() hana.height = 123.4 hana.weight = 123.4
클래스 인스턴스의 소멸
class Person { var height: Float = 0.0 var weight: Float = 0.0 deinit { print("Person 클래스의 인스턴스가 소멸됩니다.") } } var yagom: Person? = Person() yagom = nil // Person 클래스의 인스턴스가 소멸됩니다.
구조체와 클래스의 차이
- 값을 저장하기 위해 프로퍼티를 정의할 수 있습니다.
- 기능 수행을 위해 메서드를 정의할 수 있습니다.
- 서브스크립트 문법을 통해 구조체 또는 클래스가 가지는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있습니다.
- 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있습니다.
- 초기구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장할 수 있습니다.
- 특정 기능을 수행하기 위해 특정 프로토콜을 준수할 수 있습니다.
- 구조체는 상속할 수 없습니다.
- 타입캐스팅은 클래스의 인스턴스에만 허용됩니다.
- 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있습니다.
- 참조 횟수 계산(Reference Counting)은 클래스의 인스턴스에만 적용됩니다.
구조체와 클래스는 겉보기엔 정의하는 방법도, 인스턴스화하는 방법도, 프로퍼티와 메서드를 갖는다는 점을 비롯해 많은 부분에서 비슷해보입니다. 그러나 이 두 타입을 구분 짓는 가장 큰 차이점은 값 타입과 참조 타입이라는 것입니다. 그래서 참조 횟수 계산은 클래스의 인스턴스에만 해당됩니다.
스위프트의 기본 데이터 타입은 모두 구조체
public struct String { /// An empty 'String'. public init() }
구조체와 클래스 선택해서 사용하기
- 연관된 간단한 값의 집합을 캡슐화 하는 것만이 목적일 때
- 캡슐화된 값이 참조되는 것보다 복사되는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며 참조되는 것보다 복사되는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때
- 본 글의 일부내용은 필자의 저서 [스위프트 프로그래밍](2017, 한빛미디어)(http://www.hanbit.co.kr/store/books/look.php?p_code=B5682208459)에서 요약, 발췌하였음을 알립니다.
- 스위프트의 문법에 대해 더 알아보고 싶다면 애플의 Swift Language Guide[https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html]를 참고해도 많은 도움이 됩니다.
by yagom
facebook : http://www.facebook.com/yagomSoft
facebook group : https://www.facebook.com/groups/yagom/
twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )
p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.
RSS Feed 받기
'Swift > 기본문법' 카테고리의 다른 글
스위프트 시작하기 (0) | 2017.05.08 |
---|---|
Swift - 프로토콜, 익스텐션 (0) | 2017.03.07 |
Swift - 함수, 콜렉션 타입 (0) | 2017.02.06 |
Swift 기초문법 - 변수, 상수, 기초 데이터 타입 (0) | 2017.01.25 |
Swift란 어떤 언어인가? (0) | 2017.01.23 |