Class와 Struct
- 클래스와 구조체는 프로그램의 코드를 조직화하기 위해 일반적으로 사용합니다.
- OOP를 위한 필요 요소이기도 한다.
- 객체 지향 프로그래밍(OOP)이란 무엇일까? -> https://s2ung.tistory.com/45
- Swift는 다른 프로그래밍 언어와는 다르게 interface 파일과 implementation를 분리해서 만들지 않아도 됩니다.
- 하나의 파일에 구조체나 클래스를 정의해주면 Swift가 자동으로 알아서 해당 클래스와 구조체를 사용할 수 있는 인터페이스를 생성해줍니다.
Class와 Struct의 공통점
- 값을 저장하기 위한 프로퍼티 정의
- Properties란 무엇일까? -> https://s2ung.tistory.com/46
- 기능을 제공하기 위한 메소드 정의
- subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의
- 초기 상태를 설정할 수 있는 Initializer 정의
- 기본 구현에서 기능 확장
- 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 승인(conform)
Class만의 특징
- 상속(Inheritance): 클래스의 여러 속성을 다른 클래스에 물려 줌
- 타입 캐스팅(Type Casting): 런타임에 클래스 인스턴스의 타입을 확인
- 소멸자(Deinitializers): 할당된 자원을 해제(free up) 시킴
- 참조 카운트(Reference counting): 클래스 인스턴스에 하나 이상의 참조가 가능
- Struct는 다른 코드로 전달될 때 항상 복사되서 전달됨 -> RC(참조 카운트)를 사용하지 않음
Class와 Struct 선언과 사용
- 선언법은 동일 class, struct 키워드 뒤에 생성할 이름 선언
- 새로운 클래스, 구조체를 선언할 때 마다 Swift에서 완전 새로운 타입을 생성 -> 중복된 이름 사용이 불가능합니다.
- 위와 같이 ExampleClass를 ExampleStruct 내의 값으로 선언 후 사용 가능합니다.
- 물론 반대도 가능합니다.
- 클래스, 구조체 이름 뒤에 빈 괄호를 적어 각각의 인스턴스를 생성할 수 있습니다.
- 인스턴스 생성 후 각 프로퍼티에 접근 할 수 있습니다.
Struct(구조체) 초기화
- 모든 구조체는 초기화 시 프로퍼티를 선언할 수 있는 초기자를 자동으로 생성해서 제공해줍니다.
- 구조체 안의 프로퍼티만 정의 해주면 자동으로 사용이 가능합니다.
Struct(구조체) , Enum(열거형), Calss(클래스)의 값 타입
- Struct, Enum -> 값 타입
- 값 타입이란 무엇일까요?
- 함수에서 상수나 변수에 전달 될 때 그 값이 복사돼서 전달 됩니다.
- 예시로 확인해 보겠습니다!
- 출력되는 값을 확인해 보면 원래 값이 담겨 있던 ex에는 500이 여전히 담겨있고 값을 바꿔준 cinema에는 2000이 담겨져 있는 것을 확인할 수 있습니다.
- cinema는 ex의 값을 copy 했기 때문에 둘은 같지 않고 완전히 다른 인스턴스임을 확인 할 수 있습니다.
- 즉 다른 인스턴스의 변화는 그 인스턴스에만 영향을 끼치고 다른 인스턴스에는 영향을 주지 않는다는 것을 알 수 있습니다.
- 말 그대로 선언하는 순간 값을 복사하는 것이지 원래 값을 가져오지 않습니다.
- 따라서 값을 변경해줘도 원래 값에 영향을 주지 않는 것입니다.
- 이것을 Stack 메모리 할당이라고 합니다.
- Class -> 참조 타입
- 참조타입이란 무엇일까요?
- 값 타입과는 다르게 변수나 상수에 값을 할당 하거나 함수에 인자로 전달할 때 그 값이 복사되지 않고 참조됩니다.
- 참조의 뜻은 그 값을 갖고 있는 메모리를 바라보고 있다는 뜻입니다.
- 예시로 확인해보겠습니다!
- 참조타입이란 무엇일까요?
- classEx라는 클래스 인스턴스를 생성하고 각 프로퍼티에 값을 넣어줍니다.
- secondClassEx라는 상수를 선언 후 위에 선언한 classEx 클래스 인스턴스를 할당해줍니다.
- 그리고 secondclassEx의 프로퍼티 값을 변경해줍니다.
- struct와는 다르게 classEx, secondClassEx의 프로퍼티 값들이 모두 동일한 것을 확인할 수 있습니다.
- 복사한 값을 변경해주는 것이 아닌 바라보고 있는 값 자체를 변경해줘서 그렇습니다.
- 이것을 Heap 메모리 할당이라고 합니다.
- Heap, Stack 할당 관련 정리 --->>>>
Class, Struct 선택
- 주 목적이 관계된 간단한 값을 캡슐화 하기 위한 것인 경우
- 인스턴스가 참조되기 보다는 복사되는 것을 기대하는 경우
- 저장된 프로퍼티가 참조되기 보다 복사되기를 기대하는 경우
- 프로퍼티나 메소드 등을 상속할 필요가 없는 경우
간단히 생각해봐서 class의 struct와는 다른 특징은 값을 참조한다, 상속이 가능하다 등등이 있습니다.
상속할 필요가 없는 경우, 또한 기존 값을 변경하지 않고 값을 복사 후 컨트롤 하고 싶은 경우에 Struct을 사용하면 될 것 같습니다.!
'IS' 카테고리의 다른 글
iOS Swift - 앱의 생명주기 (0) | 2023.03.21 |
---|---|
iOS Swift 공식 문서 Study - Property(프로퍼티) (0) | 2023.03.14 |
iOS Swift - SocketIO(양방향 통신) (0) | 2023.02.28 |
iOS Swift - 개인 앱 출시 프로젝트 - FURY (0) | 2023.02.28 |
iOS Swift - Rx Input Output pattern (0) | 2023.02.26 |