xxo' TIL/WIL

IOS/Swift

[Swift] 클래스(Class)와 구조체(Struct) - 구조체(Struct)

xxoxec 2025. 6. 20. 16:46
Swift에서 class와 struct는 프로그램의 코드를 추상화 하기 위해 사용됩니다.
모두 객체를 생성할 수 있는 데이터 타입이지만 클래스는 참조 타입(reference type), 구조체는 값 타입(value type)으로, 데이터를 캡슐화하는 데 사용되는 사용자 정의 데이터 타입입니다.
구조체와 클래스는 프로퍼티와 메소드를 사용하여 구조화된 데이터와 기능을 가질 수 있으며,
새로운 사용자 정의 데이터 타입을 만듭니다.
클래스와 구조체는 비슷하지만 몇 가지 차이점이 있습니다.
구조체는 객체처럼 메모리에서 복사되며, 참조 타입인 클래스와는 다르게 변경 시 값이 복사됩니다.
복사 및 전달방식, 상속 지원 여부, 메모리 관리 방식 등에서 차이가 발생 합니다.

 

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures/

 

Documentation

 

docs.swift.org

 

객체(object)란?

더보기
객체(object)란?

개발을 하게 되면 가장 많이 마주치고 만들고 쓰인다. 객체는 어떤 속성을 가지고 있고, 행동도 할 수 있다.

객체들은 서로 모여서 협력하고 스스로의 책임이 있다. 책임 관점에서는 무엇인가를 해야 하고 정보를 알고 있다.

예) 객체: 사람

  • 속성
    • 나이
    • 성별
    • 이름
  • 행동
    • 일을 한다
    • 밥을 먹는다

swift에서 객체는 클래스나 구조체의 인스턴스를 의미한다. 주로 클래스나 구조체로 정의되며, 클래스는 참조 타입(reference type), 구조체는 값 타입(value type)이다. 클래스의 인스턴스 생성 시 해당 객체는 메모리에서 참조가 전달되고, 구조체는 복사되는 방식으로 동작한다. swift는 객체 지향 프로그래밍(OOP)을 지원하며, 클래스나 구조체를 정의하고 이를 바탕으로 객체를 생성할 수 있다. 객체 구현 시 class , struct 를 이용해서 구현 가능하다.

 

클래스의 인스턴스는 전통적으로 객체(object)로 알려져 있다. 하지만 Swift 구조체와 클래스는 다른 언어보다 기능적으로 훨씬 더 유사하며, 많은 부분들에서는 클래스 또는 구조체 유형의 인스턴스에 적용되는 기능을 설명한다.

따라서 더 일반적인 용어인 인스턴스(instance)가 사용된다.

 

구조체(Struct) : struct는 데이터와 관련된 함수를 하나의 단위로 묶어서 표현하는 데이터 구조이다. 구조체는 여러 속성(변수 또는 상수)과 메서드(함수)를 포함할 수 있다. 구조체의 인스턴스는 실제 값을 복사하여 저장하므로, 한 변수에서 구조체 인스턴스를 다른 변수에 할당하면 두 변수는 독립적인 별도의 값을 갖게 된다. 사용자가 원하는 데이터 타입을 만들 때 사용하며, struct 키워드를 사용해서 선언하고 중괄호 {} 안에 속성과 메서드를 작성한다. 주요 특징으로는

  • 값 타입(Value Type) : 구조체는 값 타입으로 값을 복사하여 전달한다. 클래스는 참조 타입이기 때문에 동일한 객체를 공유한다.
  • 상속 불가 : 구조체는 상속을 지원하지 않는다. 하지만 프로토콜을 채택할 수 있다.
  • 프로퍼티와 메서드 : 구조체는 프로퍼티(변수)와 메서드를 가질 수 있다. 이 메서드는 구조체의 데이터를 변경할 수 있다.
  • 불변성 : 구조체는 기본적으로 불현이다. 구조체의 인스턴스를 변경하려면 var로 선언해야 하며, let으로 선언된 구조체는 불변이다.
  • 클로저와의 상호작용 : 구조체는 클로저와 함께 사용될 때 복사된 값이 클로저 안에서 변경될 수 있다.
  • 초기화 : 구조체는 기본적으로 제공되는 초기화 메서드를 갖지만, 필요에 따라 맞춤형 초기화 메서드를 정의할 수 있다.
struct 구조체이름 {
    // 속성 및 메서드 정의
}

struct 키워드를 사용해서 선언하고 중괄호 {} 안에 속성과 메서드를 작성한다.

movie 구조체는 name이라는 속성을 가지며, movie 구조체의 인스턴스 movie를 생성하고 초기화한 후, 해당 속성들을 출력

변수로 설정할 경우 속성에 접근 시 점(dot) 문법을 사용해 접근 및 변경이 가능하다.

위 코드에서 name은 영화 이름을 저장하고 있는 stored property이다. property의 설명은 밑에 추가.

타입을 확인해보면 만들어진 movie라는 객체인것을 확인 가능
Movie struct 만들기 예1
Elevator struct 만들기 예2

엘리베이터는 위 아래로 움직이는 동작과 현재 층 수를 표시하는 기능 등을 가져야 한다.

구조체로 표현하면 위의 코드에서 Elevator라는 구조체를 정의하고, currentFloor 변수를 사용하여 현재 층을 저장하였다.

또한 moveUp과 moveDown 함수를 통해 엘리베이터가 움직이는 동작을 구현했으며,

이렇게 struct를 사용하면, 여러 변수와 함수를 하나의 단위로 묶어서 객체를 표현하고 관리할 수 있다.

그리고 var elevator = Elevator()와 같이 구조체의 인스턴스를 생성하여 해당 객체를 사용할 수 있다.

 

computed property : 객체는 속성을 가지고 있고, 그것을 우리는 property 라고 부른다.

swift에는 값을 저장하고 있는 stored property가 있고, 저장된 값이 아닌 계산된 값을 반환하는 computed property가 있다.

값을 저장하는  stored property, 가공된 계산된 값을 반환하는 computed  property

 

property observers : property 값이 변경되는 것을 감지할 수 있다.

didSet으로 property 값이 변경되는 것을 감지하고 나서 호출

 

method : 객체는 행동(기능)을 가지고 있고, 그것을 method 라고 부른다. (객체가 가지고 있는 함수라고 생각하면 된다.)

func 키워드를 이용해서 구현한다.

Student 객체의 기말고사 점수 메소드 만들기

 

mutating method : struct 인스턴스 생성 시 이용해서 상수로 생성하면, property 변경할 수 없다.

struct 인스턴스 생성 시 var 를 이용해서 변수로 생성하면, property 변경할 수도 있고 없을 수도 있다.

  • 변경 가능한 경우 : store property 가 var로 선언된 경우
  • 변경 가능하지 않은 경우 : store property 가 let으로 선언된 경우

struct에서 method가 store property 값을 변경하는 경우, mutating 키워드를 메소드 앞에 붙여줘야 한다.

struct의 내부 프로퍼티 값을 변경하는 메소드 같은 경우에 mutating 키워드를 메소드 앞에 붙여야한다.

 

String struct 톺아보기

구조체의 String 구조 정의를 보려면 command + 클릭으로 확인 가능
String struct  톺아보기 예제

 

initializer (생성자) : 해당 struct 를 만들 수 있게 해주는 특별한 타입의 메소드. 

init 키워드를 이용해서 생성하며, struct 는 meberwise initializer 가 기본으로 따라온다.

initializer가 될 수 있게  meberwise initializer 자동으로 생성되서 객체 인스턴스 생성
프로퍼티 중에 initializer 되지 않은 것들 중에서 따로 초기화 해줘야 함

 

현재 객체 지칭하기 : method 에서 현재 객체를 지칭할 때 self 키워드를 이용한다.

특히 initializer 에서 파라미터와 내부 프로퍼티 이름 간 구분을 지어줄 때 용이하다.

현재 객체를 지칭할 때 self 키워드를 이용

 

Lazy properties : 퍼포먼스 측면에서 인스턴스 생성 시, 프로퍼티가 쓰이는 시점에 생성하는 방법이 있다.

lazy 키워드를 이용하면 쓰이는 시점에 생성 가능하다.

secondhanditem이 생성되는 시점에, 인스턴스가 생기는 시점에 history도 바로 initializer 되서 print
lazy 키워드를 이용하면 쓰이는 시점에 생성 가능

 

Static Methods & Properties : 지금까지 만든 메서드와 프로퍼티는 개별 인스턴스를 만들 때 사용되는 것이었다.

개별 인스턴스와 달리, 해당 타입의 속성, 해당 타입 자체의 메서드를 만들어야 할 때가 있음. (타입 메서드, 타입 프로퍼티 라고 부름)

이때 static 키워드를 이용해서 타입의 속성 및 메서드를 정의할 수 있다.

 

Access Control : 객체 간 협력을 하다 보면, 협력 객체가 현재 객체에 접근할 때가 있다.

외부 객체가 현재 객체의 프로퍼티 등을 임의로 수정할 때가 있는데 그럴 경우,

  • 다만 외부 객체가 수정되면 안 되는 경우가 있고 이때 프로퍼티 및 메서드 접근 제어(access control)를 할 수 있다.

접근 제어

  • 외부 접근 가능 > public > internal(기본) > fileprivate > private > 내부 접근 가능 

접근 제어가 안되었을 때

처음 설정 시와 동일한 결과 값 출력
접근 제어가 안되어있을 시 설정 값 변경이 된 것을 확인 가능

접근 제어가 되었을 때

접근 제어 가능 하지 않도록 id, bill 프로퍼티에 private 사용
바깥에서 접근 하지 못하도록 시스템에서 경고, 에러를 냄

 

구조체를 사용하는 것이 유리한 경우
  • 연관된 값들의 집합을 캡슐화하는 것이 목적인 경우
  • 캡슐화된 값을 참조하는 것보다 복사하는 것이 합당할 경우
  • 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때
  • JSON 필드와 1:! mappring 되는 간단한 모델이 필요할 때

 

 

 


 

 

클래스와 구조체의 공통점
  • 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가진다.
    • 프로퍼티(속성)를 정의해서 값을 저장할 수 있다.
    • 메서드(행동)를 정의해서 기능을 제공할 수 있다.
  • 새로운 사용자 정의 타입을 만든다.
  • 초기화(init)를 정의하여 초기 상태를 설정할 수 있다. 생성자를 정의해서 초기 상태를 세팅할 수 있다.
  • 확장(extension)할 수 있다. 기본 구현 외 추가 기능을 더 할 수 있다.
  • 프로토콜(protocol) 사용이 가능하다. 프로토콜을 구현해서 특정 기능을 제공할 수 있다.
  • 특정 값에 접근할 수 있는 서브스크립트(subscript) 문법 사용이 가능하다.
  • 프로퍼티 값에 접근하고 싶다면, 점(dot) 문법을 사용한다.
클래스와 구조체의 차이점
  • 클래스는 상속을 시킬 수 있다. 구조체의 경우 불가능.
  • 클래스는 레퍼런스 카운팅을 통해 클래스 인스턴스에 대한 하나 이상의 참조를 허용한다.
  • 클래스는 deinitializer 호출 시, 이미 할당된 리소스에서 해제할 수 있다.
특성 클래스(class) 구조체(struct)
타입 참조 타입(Reference Type) 값 타입(Value Type)
상속 상속 가능(Inheritance) 상속 불가
메모리 관리 참조 카운팅(Reference counting) 값 복사(Copying values)
변경 가능성 클래스 인스턴스는 변경 가능(mutating 필요 없음) 구조체는 mutating 키워드 필요

 

참고 : Choosing Between Structures and Classes

https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes

 

Choosing Between Structures and Classes | Apple Developer Documentation

Decide how to store data and model behavior.

developer.apple.com