본문 바로가기
공부/스위프트

[스위프트] 구조체(Struct)와 클래스(Class) - 공통점과 차이점

by 초코팅촉 2023. 8. 16.
728x90

스위프트에는 다른 언어처럼 구조체와 클래스가 있다.

이 둘은 공통적인 목적을 갖고 만들어졌다.

 

프로그램 소스코드의 추상화를 위해 사용하며

다른 언어와는 다르게 인터페이스와 파일이 필요 없다.

참고로 스위프트의 기본 데이터 타입은 모두 구조체로 이루어져 있다.

 

공통점

 프로퍼티를 정의할 수 있다.

 메서드를 정의할 수 있다.

 서브스크립트를 사용해(SomeClass.num같이) 프로퍼티에 접근할 수 있다.

객체를 초기상태로 설정해 주는 초기화 블록 정의 가능

객체에 함수적 기능 추가를 위한 확장(extends) 구문을 쓸 수 있다.

특정 형식의 함수적 표준을 제공하기 위한 프로토콜 구현할 수 있다.

 

차이점

구조체

• 구조체는 값타입.

• 값타입이기 때문에 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당된다.

 

클래스

• ARC로 메모리를 관리

 상속 가능하다.

 클래스는 참조타입

 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 한 변수에서만이라도 값을 변경하면 할당한 모든 변수가 영향을 받는다.

 타입 캐스팅으로 클래스의 인스턴스타입을 확인할 수 있다.

• 클래스의 인스턴스만 deinit을 호출할 수 있다.(인스턴스에 nil을 할당하면 메모리에서 해제되며 자동으로 실행된다.)

참조 횟수 계산은 클래스의 인스턴스에만 적용된다.

 

 

선언

둘 다 선언방법은 똑같다.

//구조체
Struct SampleStruct {
	//body
}

//클래스
Class SampleClass {
	//body
}

작명방식 또한 대문자 카멜케이스로 같다.

 

사용

//class 예시
class Human {
	var age: Int = 0
    var height: Double = 0.0
}

var jason = Human()
jason.age = 19
jason.height = 180.4

//struct 예시
struct Person {
	var age: Int = 0
    var height: Double = 0.0
}

var amy = Person()
amy.age = 12
amy.height = 142.1

기본적인 사용방법은 같다.

 

그러나 class는 반드시 위처럼 초기화를 해주거나 init메서드를 통해서 초기값을 무조건 지정해야 한다.

struct는 초기화가 없어도 나중에 인스턴스 생성 시에 값을 넣으며 생성할 수 있다.

아래 예시를 보자.

struct DrinkA {
    let name: String
    let alcohol: Double
}

class DrinkB {
    let name: String
    let alcohole: Double
    
    init(name: String, alcohole: Double) {
        self.name = name
        self.alcohole = alcohole
    }
}

var beer = DrinkA(name: "beer", alcohol: 5.0)

let soju = DrinkB(name: "soju", alcohole: 15.6)

 

Struct를 써야 하는 때

기본적으로 구조체와 클래스가 비슷하니까 그냥 둘 중 하나만 쓰면 되지 않나 생각할 수 있는데

애플에서는 다음 조건중 하나라도 해당되면 구조체의 사용을 권장한다.

1. 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때

2. 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때

3. 구조체에 저장된 프로퍼티가 value타입이며 참조보다 복사가 합당할 때

4. 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때

 

 

 

 

스위프트 - 구조체, 클래스