Roel Notebook

[Swift] Structure And Class

by Roel Downey
728x90
반응형

공부하고 정리할 내용

- 구조체 (Structure)

- 클래스 (Class)

 

구조체와 클래스는 필요한 형식을 용도에 맞게 묶어 표현하고자 할 때 유용하다. 구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있다. 필요한 형식을 만드는데 새로운 사용자정의 데이터 타입(Custom Data Type)을 만들어 주는 것이다.

구조체 (Structures)

구조체 정의

구조체는 struct 키워드로 정의한다. 구조체 이름은 대문자 카멜케이스 (UpperCamelCase)를 사용한다.

구조체 프로퍼티와 메서드는 소문자 카멜케이스(LowerCamelCase)를 사용한다.

 

struct StructName {
    property 
    method 
    initializer
    subscript
}

 

Person 구조체 정의

 

 

인스턴스가 생성되고 초기화된 후 프로퍼티 값에 접근하고 싶다면 마침표(Period(.))를 사용하면 된다. 구조체를 상수 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없고, 변수 var로 선언하면 내부의 프로퍼티가 var로 선언된 경우에 값을 변경해줄 수 있다.

 

클래스

클래스 정의

클래스를 정의할 때는 class라는 키워드를 사용한다. 클래스 이름은 대문자 카멜케이스 (UpperCamelCase)를 사용한다.

클래스 프로퍼티와 메서드는 소문자 카멜케이스(LowerCamelCase)를 사용한다.

class ClassName {
    property
    method
    initializer
    deinitializer
    subscript
}

 

 

Person 클래스 정의

 

 

클래스 인스턴스의 소멸 (디이니셜라이저(Deinitializer))

 

클래스의 인스턴스는 참조 타입이므로 더는 참조할 필요가 없을 때 메모리에서 해제 된다. 이 과정을 소멸이라고 한다. 클래스 내부에 deinit 메서드를 구현해주면 소멸되기 직전 deinit 메서드가 호출된다.

deinit 메서드는 클래스당 하나만 구현할 수 있으며, 매개변수와 반환 값을 가질 수 없다.

 

Person 클래스에 구현된 deinit 메서드

 

 

그럼 디이니셜라이저(Deinitializer)는 언제 사용해야할까? 

 

보통 deinit 메서드에는 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 넣어준다. 예를 들어 인스턴스 소멸 전에 데이터를 저장한다거나 다른 객체에 인스턴스 소멸을 알려야 할 때는 특히 deinit 메서드를 구현해야 한다. 

 

 

구조체와 클래스의 같은 점과 다른 점

같은점 구조체 클래스
Property  - 값을 저장하기 위해 프로퍼티(Property)를 정의
Method  - 기능을 제공하기 위해 메서드(Method)를 정의
Subscript  - 서브스크립트(Subscript) 문법을 통해 특정 값(구조체 또는 클래스가 갖는 값(프로퍼티))에 접근하도록 서브스크립트를 정의
Initializer  - 초기 상태를 설정할 수 있는 이니셜라이저(Initializer)를 정의
Extension  - 초기 구현과 더불어 새로운 기능 추가를 위해 익스텐션(Extension)을 통해 확장
Protocol  - 특정 기능을 실행하기 위해 특정 프로토콜(Protocol) 따름(conform)

 

다른점 구조체 클래스
Inheritance 상속 불가 상속 가능
Type casting X 런타임에 클래스 인스턴스의 타입에만 허용
Deinitializers 사용 불가 가능
Reference counting 다른 코드로 전달될 때 항상 복사되서 전달되고, 참조 카운트를 사용하지 않는다.  클래스 인스턴스에 하나 이상의 참조가 가능
Type 값 타입 참조 타입

 

 

값 타입과 참조 타입

구조체는 값 타입이고 클래스는 참조 타입이다. 값 타입과 참조 타입의 가장 큰 차이는 ' 무엇이 전달되느냐 ' 이다. 예를 들어 어떤 함수의 전달인자로 값 타입의 값을 넘긴다면 전달될 값이 복사 되어 전달된다. 그러나 참조 타입이 전달인자로 전달될 때는 값을 복사하지 않고 참조(주소)가 전달 된다. 

함수의 전달인자로 넘길 때도 참조가 전달되며 다른 변수 또는 상수에 할당될 때도 마찬가지로 참조가 할당된다.

 

값 타입과 참조 타입의 차이

 

 

 

식별 연산자(Identity Operators)

클래스의 인스턴스끼리 참조가 같은지 확인할 때는 식별 연산자(Identity Operators)를 사용한다.

 

식별 연산자를 사용하여 두 참조가 같은 인스턴스를 가리키고 있는지 비교

 

 

 

언제 구조체와 클래스를 선택해서 사용해야할까?

프로젝트의 성격에 따라, 데이터의 활용도에 따라, 특정 타입을 구현할 때 구조체와 클래스 둘 중 하나를 선택해서 사용해야한다.

애플 가이드라인에서 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 것을 권장 한다.

- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때

- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때

- 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는 것이 합당할 때

- 다른 타입으로부터 상속을 받거나 자신을 상속할 필요가 없을 때

 

예) 좌표를 표현하고 싶을때 , Size 표현하고 싶을때

 

 

[참고 링크]

Apple Developer: [Structures and Class]

 

 

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] Initialization (초기화)  (0) 2019.08.28
[Swift] Enumerations  (0) 2019.07.16
[Swift] Functions  (0) 2019.07.12
[Swift] Optional  (0) 2019.07.12
[Swift] Collection [ 간단하게 정리하기]  (0) 2019.07.12

블로그의 정보

What doing?

Roel Downey

활동하기