Swift의 struct와 C에서의 struct는 유사한 구조를 가지고 있지만, 여러 중요한 차이점이 있습니다. 이 차이점들은 언어의 설계 철학과 기능성, 사용 용도에서 비롯됩니다.

C에서의 struct

  • 데이터의 집합: C에서 struct는 여러 데이터 항목(멤버 변수)을 하나의 단위로 묶는 방법을 제공합니다. 이러한 멤버 변수는 다양한 데이터 타입을 가질 수 있습니다.
  • 메모리 할당: C의 struct는 메모리 상에서 연속된 공간을 차지합니다. 멤버 변수들은 선언된 순서대로 메모리에 배치됩니다.
  • 값 타입: C에서 struct는 값 타입(Value Type)입니다. struct를 다른 변수에 할당하거나 함수에 전달할 때, 메모리 내의 실제 데이터가 복사됩니다.
  • 메서드 없음: C의 struct에는 메서드를 직접 포함할 수 없습니다. 대신, struct의 인스턴스를 매개변수로 받는 함수를 정의하여 기능을 구현할 수 있습니다.

Swift에서의 struct

  • 데이터와 기능의 캡슐화: Swift의 struct는 데이터(속성) 뿐만 아니라 기능(메서드)도 함께 캡슐화할 수 있습니다. 이는 struct를 사용하여 더 복잡한 동작을 쉽게 모델링할 수 있게 해줍니다.
  • 값 타입: Swift에서 struct 또한 값 타입입니다. 하지만 Swift는 struct, enum 및 기본 데이터 타입(int, double, string 등)에 대해 값 타입을 권장합니다. 이는 참조 카운팅 오버헤드 없이 효율적인 메모리 관리를 가능하게 합니다.
  • 상속 불가능: Swift의 struct는 상속할 수 없습니다. 이는 클래스와의 주요 차이점 중 하나입니다. 다형성을 달성하기 위해서는 프로토콜을 사용할 수 있습니다.
  • 멤버와이즈 초기화자: Swift의 struct는 자동으로 멤버와이즈 초기화자(Memberwise Initializer)를 제공합니다. 이 초기화자를 통해 각 속성을 초기화할 수 있으며, 모든 속성에 대해 명시적으로 초기값을 제공하지 않아도 됩니다(기본값이 있는 경우).

요약

C의 struct와 Swift의 struct는 기본적인 용도는 유사하지만, Swift의 struct는 메서드를 포함할 수 있고, 상속 대신 프로토콜을 사용하여 다형성을 구현하는 등의 차이점이 있습니다. Swift는 값 타입을 사용하여 참조 카운팅 오버헤드를 줄이고, 메모리 사용을 최적화하는 설계를 채택하고 있습니다.

 

C에서 상속 흉내 내기

비록 C 언어에서 직접적인 상속을 지원하지 않지만, 개발자들은 몇 가지 기법을 사용하여 상속과 유사한 효과를 낼 수 있습니다. 이러한 기법 중 하나는 첫 번째 멤버로 기반 struct를 포함하는 것입니다. 예를 들어

typedef struct {
    int baseProperty;
} Base;

typedef struct {
    Base base;  // 'Base' struct를 첫 번째 멤버로 포함
    int derivedProperty;
} Derived;

이 방법을 사용하면, Derived 타입의 변수가 Base 타입의 속성에 접근할 수 있게 됩니다. 또한, 함수 포인터를 struct에 포함시켜 메서드와 비슷한 패턴을 구현할 수 있으며, 이를 통해 다형성을 흉내 낼 수도 있습니다.

typedef struct {
    void (*functionPointer)(void);
} StructWithFunction;

하지만 이러한 접근 방법은 실제 객체 지향 프로그래밍 언어에서 제공하는 상속의 모든 이점을 제공하지는 않습니다. 특히, 타입 캐스팅, 가상 메서드, 오버라이딩 같은 고급 객체 지향 기능을 모방하기에는 한계가 있습니다.

결론

C 언어에서 struct를 사용한 상속은 언어의 기본 기능을 넘어서는 일종의 창의적인 해결책이며, 실제 객체 지향 프로그래밍의 깊이와 유연성에는 미치지 못합니다. 그럼에도 불구하고, C 언어의 강력한 기능과 더불어 이러한 기법들은 여전히 유용하게 사용될 수 있습니다.

#include <stdio.h>

// 함수 선언
void myFunction(void) {
    printf("Hello, I'm a function pointed to by a struct!\n");
}

// 구조체 정의
typedef struct {
    void (*functionPointer)(void); // 함수 포인터 멤버
} StructWithFunction;

int main() {
    // 구조체 인스턴스 생성
    StructWithFunction myStruct;
    
    // 함수 포인터에 myFunction 함수의 주소 할당
    myStruct.functionPointer = myFunction;
    
    // 구조체를 통해 함수 호출
    myStruct.functionPointer();
    
    return 0;
}

========== 사족 ===========

처가댁(성환), 제주도 드론 샷 //이번 주는 이 포스트가 조회수 1위를 했다.

여행 카테고리는 꾸준한 듯. 당연히 프로그래밍 보다 인기가 좋닼ㅋㅋ

처가댁이랑 제주도에서 찍었었던...

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

스토리보드 이동 방법  (0) 2019.02.14
제주도 항공 촬영  (0) 2019.01.19
userDefault 활용  (0) 2019.01.16
Practical Swift  (0) 2019.01.14
iOS UI 기초 - Swift UI  (2) 2019.01.03

+ Recent posts