본문 바로가기
Languages/Swift

사당 iOS 스터디 2주차 - 구조체와 클래스

by 탄이. 2018. 7. 23.









구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용

구조체의 인스턴스는 값 타입이고, 클래스의 인스턴스는 참조 타입

스위프트의 데이터 타입과 열거형은 모두 값 타입

소스파일 하나에 여러 개의 구조체와 여러 개의 클래스를 정의하고 구현해도 문제가 없습니다.

구조체 안에 구조체, 클래스 안에 클래스 등과 같이 중첩 타입의 정의 및 선언이 가능

__9.1 구조체

9.1.1 구조체 정의

  • 구조체를 정의한다는 것은 새로운 타입을 생성해주는 것과 마찬가지

  • 대문자 카멜케이스를 사용하여 이름을 지어줍니다.

9.1.2 구조체 인스턴스의 생성 및 초기화

  • 구조체에 기본 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름으로 자동 지정

  • 인스턴스가 생성되고 초기화된 후 프로퍼티 값에 접근하고 싶다면 마침표(.)를 사용

__9.2 클래스

스위프트의 클래스는 부모클래스가 없더라도 상속 없이 단독으로 정의가 가능

9.2.1 클래스 정의

9.2.2 클래스 인스턴스의 생성과 초기화

  • 스위프트에서도 객체라고 부르는 것이 틀린 것은 아니지만, 스위프트 공식 문서에는 좀 더 한정적인 인스턴스라는 용어를 사용

  • 구조체와는 다르게 클래스의 인스턴스는 참조 타입이므로 클래스의 인스턴스를 상수 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있습니다.

9.2.3 클래스 인스턴스의 소멸

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

  • 보통 deinit 메서드에는 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 넣어줍니다.

__9.3 구조체와 클래스의 차이

같은 점

  • 값을 저장하기 위해 프로퍼티를 정의할 수 있습니다.

  • 기능 실행을 위해 메서드를 정의할 수 있습니다.

  • 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있습니다.

  • 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있습니다.

  • 초기구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장할 수 있습니다.

  • 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있습니다.

다른 점

  • 구조체는 상속할 수 없습니다.

  • 타입캐스팅은 클래스의 인스턴스에만 허용됩니다.

  • 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있습니다.

  • 참조 횟수 계산(Reference Counting)은 클래스의 인스턴스에만 적용됩니다.

9.3.1 값 타입과 참조 타입

  • 어떤 함수의 전달인자로 값 타입의 값을 넘긴다면 전달될 값이 복사되어 전달

  • 참조 타입이 전달인자로 전달될 때는 값을 복사하지 않고 참조(주소)가 전달

  • 데이터를 함수의 전달인자로 전달하거나 새로운 변수에 할당할 때

    • 값 타입

      • 값 타입의 데이터를 함수의 전달인자로 전달하면 메모리에 전달인자를 위한 인스턴스가 새로 생성

      • 생성된 새 인스턴스에는 전달하려는 값이 복사되어 들어갑니다.

    • 참조 타입

      • 참조 타입의 데이터는 전달인자로 전달할 때 기존 인스턴스의 참조를 전달하므로 새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달

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

9.3.2 스위프트의 기본 데이터 타입은 모두 구조체

  • 기본 데이터 타입은 모두 값 타입이라는 뜻

__9.4 구조체와 클래스 선택해서 사용하기

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

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

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

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

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

  • 좌표계

    • x: Int

    • y: Int

    • width: Float

    • height: Float

    • depth: Float

이런 몇 가지 상황을 제외하면 클래스로 정의하여 사용합니다. 대다수 사용자정의 데이터 타입은 클래스로 구현할 일이 더 많을 것

똑똑한 스위프트의 복사 처리

  • 다수의 배열 또는 딕셔너리 등의 데이터를 복사하고 이용할 때 메모리를 비효율적으로 사용한다고 오해할 수 있습니다. 그렇지만 스위프트는 꼭 필요한 경우에만 ‘진짜 복사’를 합니다.

  • 스위프트가 적절히 알아서 효율적으로 처리



참고


야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019



2018/07/23 - [삽질/Swift] - 사당 iOS 스터디 - 함수

2018/07/23 - [삽질/Swift] - 사당 iOS 스터디 - 옵셔널


댓글