iOS-SOPT-iNNovation/iOS_Traning

<5주차> Struct 가 무엇이고 어떻게 사용하는지 설명하시오

Closed this issue · 5 comments

<5주차> Struct 가 무엇이고 어떻게 사용하는지 설명하시오

Struct

스위프트에서 구조체라고 불립니다.
값이 변수나 함수에 할당될때 값복사 즉, 해당값의 복사본을 수정해도 해당값은 영향이 없습니다.
생성자를 따로 정의하지않아도 memberwise initializer가 있어서 구조체는 자동으로 생성자를 만들어줍니다.

인스턴스를 생성해서 속성 및 함수에 접근할 수 있습니다.

할수없는것
상속
타입변환

iJoom commented

Struct 구조체
메모리 복사가 아닌, 값 복사가 이루어짐(인스턴스도 Value). 그래서 레퍼런스 카운트 ARC 영향을 받지 않음
공간에 한계가 있어서 스택 오버플로우 조심
또한 상속을 받을 수 없어서 상속이 필요없는 경우에는 구조체를 쓰는 것이 맞다고 생각.

Struct란?*
class와 struct를 흔히 비교하는데, struct는 value 타입입니다.
그렇기 때문에 값을 전달할 때, 주소값을 넘겨주는 reference 타입과는 다르게 현재 값을 복사하는 값의 복사가 일어납니다.
이러한 특징으로 값을 전달할 때 공유하는 공간에 대해 걱정할 필요가 없습니다. 저는 주로 DTO로 값만을 전달할 때 사용합니다.
그리고 복잡한 프로퍼티를 갖는 경우가 아니고 단순 값을 가지고 로직만을 필요로 할 때 struct를 사용합니다.

또한 class와 struct의 차이에서 struct는 별도로 init을 생성하지 않아도 인스턴스를 생성할 수 있는 memberwise initializer을 제공합니다.
또한 class는 상속이 가능하지만 struct는 상속이 불가능합니다. 다만 프로토콜의 채택은 가능합니다.

Struct

Struct는 스위프트의 구조체이다.
구조체의 특징은 자동으로 생겨난 멤버 초기자(memberwise initializer)를 가지고 있어 이것을 사용하여 구조체 인스턴스의 멤버 속성을 초기화할 수 있습니다. 이는 클래스 인스턴스에는 없는 기능입니다.

그리고 구조체는 값 타입으로, 변수나 상수에 하당하거나 함수에 전달할 때, 그 값이 복사되는 (copied) 타입을 말합니다. 이와 반대되는 개념으로 참조 타입이 있는데 참조 타입은 변수나 상수에 할당되거나 함수에 전달될 때 복사하지 않고 기존 인스턴스를 가리키는 참조를 사용하게 되는데 클래스가 이러한 참조 타입입니다.

구조체는 클래스와 많은 공통점이 있습니다.

  • 값을 저장하기 위한 속성 정의하기
  • 기능을 제공하기 위한 메소드 정의하기
  • 첨자 연산 구문으로 값에 접근할 수 있도록 첨자 연산 정의하기
  • 초기 상태를 설정하기 위한 초기자 정의하기
  • 기능을 기본 구현이상으로 확대하도록 확장하기
  • 정해진 종류의 표준 기능을 제공하도록 프로토콜 준수하기

하지만 클래스에서 가능하지만 구조체에는 불가능한 기능들 또한 있습니다.

  • 상속
  • 타입 변환
  • 정리자
  • 참조 카운팅

Struct

하나의 코드 블록으로, 이 안에 변수나 상수를 넣어 값을 저장할 수도 있고 함수를 넣어 기능을 정의할 수도 있다.
특정 기능을 실행할 수 있는 함수와, 값을 저장할 수 있는 변수와 상수의 특성들을 모두 모아놓은 것.

구조체는 코드의 유연성에 도움이 된다. 객체를 분리해 하나의 타입으로 개발하고싶을 때 사용한다.

클래스와의 공통점

  • 변수나 상수를 사용해 값을 저장하는 프로퍼티를 정의할 수 있음.
  • 함수를 사용해 기능을 제공하는 메서드를 정의
  • 속성값에 접근할 수 있는 방법을 제공하는 서브스크립트를 정의할 수 있음.
  • 객체에 함수적 기능을 추가하는 확장(extends) 구문을 사용할 수 있음.
  • 특정 형식의 함수적 표준을 제공하기 위한 프로토콜을 구현할 수 있음.

클래스와의 차이점

  • 클래스는 특성을 다른 클래스에게 상속시킬 수 있지만, 구조체는 불가능
  • 실행 시 컴파일러가 클래스 인스턴스의 타입을 미리 파악할 수 없음.
  • 인스턴스가 소멸되기 직전 처리해야 할 구문을 등록해놓을 수 없음.
  • 클래스는 인스턴스가 전달될 때 참조 형식으로 제공되며, 구조체는 값 형식. 또한, 클래스의 참조 개수는 제한이 없음.