[Swift] 기본 문법 - 구조체와 클래스
구조체와 클래스는 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용합니다.
또, 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있어요.
다만, 구조체의 인스턴트는 값 타입이고, 클래스의 인스턴스는 참조 타입이라는게 차이점입니다.
구조체
구조체는 struct
로 정의합니다 !
struct 구조체 이름 {
프로퍼티와 메서드들
}
위와 같은 규칙을 통해 구조체를 한 개 만들어보겠습니다 !
struct IanInformation {
var name: String
var age: Int
}
구조체 인스턴스의 생성 및 초기화
구조체 생성 후, 인스턴스를 생성하고 초기화하고 싶을 땐, 기본적으로 생성되는 멤버 와이즈 이니셜 라이저를 사용합니다 !
인스턴스가 생성되고 초기화 된 후 프로퍼티 값에 접근하고 싶다면, 마침표.
를 사용하면 됩니다.
구조체를 상수 let
으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없지만, 변수 var
로 선언한다면 값을 변경할 수 있습니다 !
struct IanInformation {
var name: String
var age: Int
}
var ian: IanInformation = IanInformation(name: "ian", age: 12)
ian.name = "이안!"
ian.age = 19
let ian2: IanInformation = IanInformation(name: "ian2", age: 100)
ian2.name = "상수이므로 변경 불가 !" // 상수이므로 변경 불가
ian2.age = 1 // 상수이므로 변경 불가
클래스
클래스는 어떻게 정의하고 인스턴스를 어떻게 생성할까요 ?
클래스를 정의할 땐 class
라는 키워드를 사용합니다 !
class 클래스 이름 {
프로퍼티와 매서드
}
클래스는 상속을 받을 수 있다는 특징이 있어요.
상속을 받는 방법은
class 클래스 이름: 부모 클래스 이름 {
프로퍼티와 매서드
}
위와 같은 규칙을 이용하여 클래스를 만들어봐요 !
class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
클래스 인스턴스 생성과 초기화
클래스를 정의한 후, 인스턴스를 생성하고 초기화하고자 할 땐 기본적인 이니셜라이저를 사용합니다 !
인스턴스가 생성되고 초기화 된 후 프로퍼티 값에 접근하고 싶다면 마침표 .
를 사용합니다.
구조체와는 다르게 클래스의 인스턴스는 참조 타입이므로 클래스의 인스턴스를 상수 let
으로 선언해도 내부 프로퍼티 값을 변경할 수 있습니다.
class Person {
var height: Float = 0.0
var weight: Float = 0.0
}
var ian: Person = Person()
ian.height = 150.0
ian.weight = 100.0
let ian2: Person = Person()
ian2.height = 112.2
ian2.weight = 122.2
클래스 인스턴스의 소멸
클래스의 인스턴스는 참조 타입이므로 더 참조할 필요가 없을 때 메모리에서 해제 됩니다 !
참조 타입 : 데이터를 전달할 때 값의 메모리 위치를 전달합니다 ! 나중에 더 자세히 알아보겠습니다
이 과정을 소멸이라고 하는데, 소멸되기 직전 deinit
이라는 메서드가 호출됩니다. 클래스 내부에 deinit
메서드를 구현해주면 소멸되기 직전 deinit
메서드가 호출됩니다. 이렇게 호출 된 deinit
메서드는 디이니셜라이저
라고 부릅니다 ! deinit
메서드는 클래스당 하나만 구현할 수 있으며, 매개변수와 반환 값을 가질 수 없습니다.
class Person {
var height: Float = 0.0
var weight: Float = 0.0
deinit {
print("Person 클래스의 인스턴스가 소멸됩니다 ! ")
}
}
var ian: Person? = Person()
ian = nil // Person 클래서의 인스턴스가 소멸됩니다 !
보통 deinit
메서드에는 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 넣어줍니다.
예를 들어 인스턴스 소멸 전에 데이터를 저장한다거나 다른 객체에 인스턴스 소멸을 알려야할 땐 deinit
메서드를 구현해야 합니다.
구조체와 클래스의 차이
구조체와 클래스는 비슷한 점이 꽤 있습니다.
- 값을 저장하기 위해 프로퍼티를 정의할 수 있어요
- 기능 실행을 위해 메서드를 정의할 수 있어요
- 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있어요
- 초기화 될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있어요
- 초기구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장할 수 있어요
- 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있어요
확실히 다른 점도 있습니다.
- 구조체는 상속할 수 없어요
- 타입 캐스팅은 클래스의 인스턴스에만 허용됩니다
- 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있어요
- 참조 횟수 계산은 클래스의 인스턴스에만 적용합니다
값 타입과 참조 타입
구조체는 값 타입
클래스는 참조 타입 입니다.
값 타입과 참조 타입의 큰 차이는 무엇이 전달되느냐
라고 생각하면 편하실거에요 !
값 타입의 데이터를 함수의 전달인자로 전달하면 메모리에 전달인자를 위한 인스턴스가 새로 생성됩니다.
생성된 새 인스턴스에는 전달하려는 값이 복사되어 들어갑니다.
반면 참조 타입의 데이터는 전달인자로 전달할 때 기존 인스턴스의 참조를 전달하므로 새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달합니다.
구조체와 클래스 선택하여 사용하기
구조체와 클래스는 새로운 데이터 타입을 정의하고 기능을 추가한다는 점은 같습니다.
하지만 구조체 인스턴스는 항상 값 타입이고, 클래스 인스턴스는 참조 타입입니다. 생긴 건 비슷하지만 용도는 다릅니다 !
애플은 가이드라인에서 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 걸 권장합니다 !
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적
- 캡슐화 한 값을 참조하는 것 보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것 보다 복사하는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
출처: 스위프트 프로그래밍(야곰), iOS 프로그래밍을 위한 스위프트 기초(야곰)
Author And Source
이 문제에 관하여([Swift] 기본 문법 - 구조체와 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ian/Swift-기본-문법-구조체와-클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)