ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로토콜/구조체/클래스에 관하여
    Swift 2020. 11. 23. 17:27

    안녕하세요. 그린입니다!

    이번 포스팅에서는 제가 학습하며 나름대로 간단하게 헷갈리는 부분을 정리한것을 공유하겠습니다.

    바로 프로토콜/구조체/클래스에 관하여 이야기를 해볼까 합니다..!

    스위프트를 처음 접하며 공부하다보니 왜 다른 언어와 달리 프로토콜 지향이며 구조체가 중요한지 궁금했습니다.

    아직 명확하게 해답을 찾은건 아니지만 어느정도 정리된 부분을 기재하였으니 만약 다른 사항이거나 의견이 있으시면

    댓글 달아주시면 감사하겠습니다 :-)

     

    1. 프로토콜 : 어떤 기능을 실행하기 위해 프로퍼티와 메서드 그리고 다른 기능들의 틀이다.

    우선 스위프트는 객체 지향이면서 프로토콜 지향 언어이기도 하다.

    스위프트의 대부분은 기본 타입이 구조체로 구현되어있다.

    클래스는 상속을 받아 구현되지만 구조체는 상속이 되지 않는데 어떻게 기본 타입들의 공통된 기능을 가질 수 있는것일까??

    우선 프로토콜은 아래와 같이 틀을 만들고 구조체를 통해 그 틀의 정해진 요구사항을 구현한다.

     

    프로토콜 정의와 사용

     

    이런식으로 프로토콜을 선언하고 구조체에서 프로토콜을 채택하여 기능들을 정의하여 구현한다.

    이렇게 공통의 기능을 할 수 있게 프로토콜을 정의해둔다면 여러 구조체에서 해당 프로토콜을 채택하여 원하는 방식대로 사용하면된다.

    그러나 위의 방식대로하면 프로토콜의 프로퍼티와 메서드를 전부 꼭 구현해주어야 한다. 그러면 너무 힘들어지지 않겠는가..?

    그래서 extension이 존재한다.

     

    -. extension : 프로토콜을 정의하면 해당 사항들을 전부 구조체에서 꼭 구현해야한다고 했는데 이것의 어려움을 해소해줄수 있다.

    익스텐션을 사용하여 초기 기능을 정의해주면 구조체에서 해당 기능을 구현하지 않더라도 오류가 나지 않는다. 아래와 같이 사용된다.

    (위 코드의 연장선.)

     

    extension 사용

    만약 해당 기능에 대한 초기 구현말고 다른 동작을 원할때는 그냥 단순하게 기능을 재정의 해주면된다.

    -. 그럼 왜 프로토콜을 지향해야 될까 ? 클래스 대신 기본 타입에서도 쓰이고 지향되는 이유가 뭘까 ? 

    1) 구조체는 값 타입이다. 구조체가 상속이 된다면 좋겠지만 상속은 클래스 타입에서만 가능하다.

    참조 타입으로 사용하면 참조를 추적하는 과정들을 거치기에 값 타입을 활용하는것보다 더 많은 비용이 든다.

    이에 마침 상속이 없어도 기능을 다시 매번 구현해주지 않아도 되는 프로토콜 덕에 널리 사용이 된다.

    2) 프로토콜로 초기 구현을 해둠으로써 모듈화가 된다. 모듈화를 해줌으로써 더 편리한 유지보수가 가능해진다.

     

    2. 클래스

    -. 참조 타입

    -. 메모리에서 힙 영역에 할당되어 속도가 느리다.

    -. 상속이 가능하고 다중 상속도 가능하다

    -. 타입 캐스팅이 가능하여 인스턴스에 따라 여러 동작이 가능하다.

    -. 디이니셜라이저가 존재한다. (메모리 해제를 위한 deinit 메서드)

    -. 참조 타입임으로 인스턴스를 상수 let으로 선언해도 내부 프로퍼티의 값을 변경 할 수 있다.

     

    3. 구조체

    -. 값 타입

    -. 메모리에서 스택 영역에 할당되어 속도가 빠르다.

    -. 상속이 불가능하다.

    -. 매번 새로운 변수로 값을 복사하기에 멀티스레드 환경에서 문제 소지가 적다.

     

    [공통점]

    -. 컨테이너 역할 (프로퍼티/메서드를 담음) > 데이터를 묶어 표현하여 구조화된 기능을 가진다.

    -. 프로퍼티와 메서드를 정의할 수 있다.

    -. 초기화 시 이니셜라이저를 정의할 수 있다.

    -. 익스텐션으로 확장이 가능하다.

    -. 프로토콜을 따를 수 있다.

    -. 서브 스크립트 사용이 가능하다. ( "." 을 통해 프로퍼티 및 메서드에 접근이 가능한것을 서브 스크립트라고함)

     

    [차이점]

     -. 값 타입과 참조 타입

    -. 구조체는 상속 불가

    -. 타입 캐스팅 및 디이니셜라이저는 클래스의 인스턴스만 가능

    -. 참조횟수계산은 클래스의 인스턴스만 가능

     

    [구조체를 권장함으로 구조체를 사용하는 상황]

    -. 값들을 캡슐화 할때

    -. 참조보다 값을 복사하는것이 나을때

    -. 상속이 필요 없을때

     

    여기서 참조 타입은 값 타입과 다르게 값이 복사되는것이 아니라 그 값의 메모리를 참조한다.

    따라서 인스턴스를 통해 값을 주면 해당 참조된 원래의 값도 변한다.

     

    이렇게 이번 포스팅에서는 프로토콜에 대한 간단한 개념과 클래스/구조체의 공통점과 차이점에 대해 특성을 알아보았습니다.

    아직 세가지의 문법을 어느시점에 적용해야하는지 감이 오지 않을 수 있습니다.

    이 부분은 실력이 향상되며 실전을 통해 감이 올거라 생각합니다.

    감사합니다! :-D

    'Swift' 카테고리의 다른 글

    고차함수와 함수형 프로그래밍  (0) 2020.12.18
    제네릭  (0) 2020.12.13
    접근레벨 및 이니셜라이저 관련  (0) 2020.11.19
    객체지향 프로그래밍 패러다임  (0) 2020.11.08
    랜덤함수  (0) 2020.11.04
Designed by Tistory.