훌이
후리스콜링개발
훌이

블로그 메뉴

  • 왈 (iOS APP)
  • Github
전체 방문자
오늘
어제
  • 전체 (171)
    • ⭐️ 개발 (140)
      • JAVA (4)
      • Web (5)
      • iOS & Swift (94)
      • iOS Concurrency (4)
      • Rx (18)
      • Git (6)
      • WWDC (1)
      • Code Refactor (3)
      • Server (1)
    • ⭐️ Computer Science (22)
      • 운영체제 (10)
      • 네트워크 (5)
      • PS (7)
    • 경제시사상식 (8)
    • 기타 등등 (0)

인기 글

최근 글

06-10 20:10

티스토리

hELLO · Designed By 정상우.
훌이

후리스콜링개발

[Swift] 클래스(Class) /구조체(Struct) /열거형(Enum) 정리 + 차이점
⭐️ 개발/iOS & Swift

[Swift] 클래스(Class) /구조체(Struct) /열거형(Enum) 정리 + 차이점

2021. 4. 29. 03:22
728x90
반응형

< 관련 링크 - 한글판 >

 

📚 목차

1️⃣  열거형 Enum

2️⃣  구조체 Struct

3️⃣  클래스 Class  

4️⃣  차이점

 

 

Swift는 객체지향 프로그래밍 언어입니다.

그렇기 때문에 우리는 클래스, 구조체, 열거형에서 각각의 타입을 가지는 인스턴스(=객체)를 생성해서 사용할 수 있습니다.

-> 이 부분에서 많이들 붕어빵과 붕어빵틀로 인스턴스와 클래스를 설명하곤 하죠.

 

클래스, 구조체, 열거형의 인스턴스를 사용하기 위한 준비 작업을 이니셜라이저 즉, 초기화라고 합니다.

 

자,, 왜 여기에 이렇게 주저리 글을 적었냐...

그것은 제가 이해가 안갔기에 정리를 해봤습니다..

 

자 본론으로 들어가 열거형, 클래스, 구조체가 뭔지

어떤 경우에 열거형/구조체/클래스를 쓰는지 등의 차이점도 정리해보겠습니다!

 


1️⃣ 열거형 Enumerations

: 같은 성질을 가지는 것들에 대한 목록들을 case 별로 나열한 것입니다.

  • 열거형 이름 자체는 UpperCamelCase을 사용합니다.
  • 각 case 이름은 lowerCamelCase을 사용합니다.
  • 각 case 자체가 고유의 값을 의미합니다.
  • 각 case는 한 줄에 개별로 / 여러개도 정의 가능합니다.
  • 열거형은 값 타입이며  상속이 불가능하고 확장이 가능합니다.

 

열거형의 기본형태

enum 이름 {
    case 이름1
    case 이름2
    case 이름3
    case 이름4, 이름5, 이름6
}

 

 

열거형의 분기처리

: 조건을 만족했을 때와 만족하지 못했을 때를 나누어 처리하는 것을 분기처리라고 하는데

switch 문과 enum 문을 합치면 case 별로 분기처리가 가능합니다.

 

 

 

-> 모든 case에 대한 분기처리를 해줄 경우에는 default가 따로 필요하지 않습니다.

north, south, east, west 총 4개의 case에 대해 분기처리를 해줬어여

 

 

 

열거형의 원시값 (raw Value)

: enum의 case에는 또 다른 값을 저장할 수 있고 문자열, 문자, 정수, 실수형 데이터 타입이 올 수 있습니다.

원시값 할당을 생략 시에는 0부터 1씩 증가하며, 차례대로 할당된답니다.

만약에 중간에 값을 할당할 경우에는 그 값부터 1씩 증가하게 됩니다.

 

 

 

 

열거형의 메소드

: 열거형 안에는 메소드도 추가할 수 있습니다.

 

 

 

 


 

 

⚠️구조체와 클래스는

여러 변수를 담을 수 있는 컨테이너 개념으로

데이터를 용도에 맞게 묶어 표현할 때 용이합니다.

 

  • 프로퍼티와 메소드를 사용해 구조화된 데이터와 기능을 가집니다.
  • 새로운 사용자 지정 타입을 만들어 줍니다.
  • 초기화 init을 정의해서 초기 상태를 설정할 수 있습니다.
  • extension이 가능합니다.
  • 프로퍼티값에 접근할 때 점(.)을 사용합니다.
  • 프로토콜 사용이 가능합니다.
  • 타입을 정의하기 때문에 UpperCamelCase를 사용합니다.

 

 

2️⃣ 구조체 Structure

: 구조체는 Swift의 대부분 큰 뼈대를 구성하고 있습니다. 대부분의 데이터의      자료형 타입(Int, String, Double, Float, Array 등)은 모두 구조체로 구현되어 있습니다.

 

 

 

-> 그래서 dataModel.swift 파일을 만들어 줄 때 우리가 자주,, struct 타입으로 구현을 해주나봐요~

 

 

구조체의 기본형태

struct 구조체 {
    프로퍼티와 메소드
}

 

 

구조체의 프로퍼티

 

 

 

 

* 구조체에서의 타입 프로퍼티 ? 

: 타입 프로퍼티 선언을 위해서는 static 키워드를 사용합니다.

특정 타입에 속한 프로퍼티로 그 타입에 해당하는 단 하나만의 프로퍼티를 생성하고

이니셜라이저가 없기 때문에 인스턴스 프로퍼티와 다르게 항상 초기값을 지정해야 합니다. 

 

초기값 설정을 안해주면 뜨는 오류

 

 

** 타입 프로퍼티를 사용하는 이유?

: 어떤 구조체/클래스 내의 프로퍼티를 사용하고 싶은데

클래스/구조체 전체를 굳이 메모리에 할당해서 사용할 필요는 없을 때 사용합니다.

 

따라서, 위 코드 속 static 키워드가 붙은 [ typeProperty ] 변수는  Sample 이라는 타입 자체에서 사용할 수 있는 프로퍼티입니다.

 

 

구조체의 메소드

 

 

 

 

구조체의 인스턴스

 

 

- 가변 인스턴스 내 가변 프로퍼티는 수정 가능

- 가변 인스턴스 내 불변 프로퍼티는 수정 불가능

- 불변 인스턴스 내 가변 프로퍼티는 수정 불가능

- 불변 인스턴스 내 불변 프로퍼티는 수정 불가능

 

 

구조체의 타입 프로퍼티와 타입 메소드

 

 

- 타입 프로퍼티와 타입 메소드를 일반 인스턴스에 호출하면 에러가 납니다.

- 타입 프로퍼티와 타입 메소드는 해당 타입 자체에서 사용할 수 있는 값과 함수이기 때문이죠.

 

구조체에서는 'static' 키워드를 통해 타입 프로퍼티/메소드인지 아닌지를 나눕니다.

 

 

 


3️⃣ 클래스 Class

: Apple 프레임워크의 대부분의 큰 뼈대는 클래스로 구성되어 있습니다.

 

 

클래스의 기본형태

class 이름 {
   /* 구현부 */
}

 

 

클래스의 프로퍼티 (구조체와 동일)

 

 

 

 

클래스의 메소드

 

 

⚠️ 타입 프로퍼티에서 class 키워드를 사용한다면 재정의 가능한 타입 메소드를 선언할 수 있습니다. (상속 = 오버라이딩이 가능)

 

 

 

클래스의 인스턴스

 

 

- 가변 인스턴스 내 가변 프로퍼티는 수정 가능

- 가변 인스턴스 내 불변 프로퍼티는 수정 불가능

- 불변 인스턴스 내 가변 프로퍼티는 수정 가능        ------>⚠️ 구조체와 다른 부분 (클래스는 참조이기 때문)

- 불변 인스턴스 내 불변 프로퍼티는 수정 불가능

 

 

클래스의 프로퍼티 (구조체와 동일)

 

 

 

 


 

4️⃣ 차이점

구조체 클래스
값 타입 call by value
( 데이터를 전달할 때 값을 복사하여 전달)
어떤 변수의 메모리 주소를 복사해서 보낼 때 = 복사본
참조 타입 call by reference
( 데이터를 전달할 때 값의 메모리 위치를 전달 )
어떤 변수의 메모리 주소 자체를 보낼 때 = 원본
상속 불가능 상속 가능 
( 타입 메소드의 class 키워드 -> 상속이 가능 = 재정의 가능 )
스택 메모리 영역에 할당 -> 속도가 빠름 힙 메모리 영역에 할당
레퍼런스 형태가 아니기 때문에 공유 불가능 레퍼런스 형태로 공유가 가능
항상 새로운 변수로 값의 복사가 일어나기 때문에 멀티 스레드 환경에서 문제가 일어날 확률이 적음 -

 

 

그럼 언제 구조체를 쓰고 언제 클래스를 쓸까요 ?

1. 서로 연관된 몇 개의 기본 데이터 타입들을 캡슐화하여 묶는 것이 목적일 때
2. 캡슐화된 데이터에 상속이 필요하지 않을 때
3. 캡슐화된 데이터를 전달하거나 할당하는 과정에서 참조 방식보다는 값이 복사되는 것이 합리적일 때
4. 캡슐화된 원본 데이터를 보존해야 할 때

 

이 경우에 하나 이상 해당할 경우 구조체를 쓰고, 이 외에는 클래스를 씁니다!

 

 

 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글

[iOS] 데이터 직접 전달 방식(2) - Segue prepare 메소드를 통해 전달  (1) 2021.04.29
[iOS] 데이터 직접 전달 방식(1) - Property를 통해 전달  (1) 2021.04.29
[iOS] UIPanGestureRecognizer 사용해서 모달화면 아래로 dismiss하기  (2) 2021.04.24
[iOS] velocity.y < 0 이면 왜 방향이 up일까?  (0) 2021.04.18
[iOS] 스토리보드/코드로 화면 전환하기 - Navigation(push/pop)  (1) 2021.04.15
    '⭐️ 개발/iOS & Swift' 카테고리의 다른 글
    • [iOS] 데이터 직접 전달 방식(2) - Segue prepare 메소드를 통해 전달
    • [iOS] 데이터 직접 전달 방식(1) - Property를 통해 전달
    • [iOS] UIPanGestureRecognizer 사용해서 모달화면 아래로 dismiss하기
    • [iOS] velocity.y < 0 이면 왜 방향이 up일까?
    훌이
    훌이

    티스토리툴바