iOS프로그래밍기초(Smile Han)/문법 정리

[Swift] 문법 정리 - 클래스(class) vs 구조체(struct) vs 열거형(enum)

wse46 2024. 11. 24. 22:15
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2

위 영상을 보고 정리한 글입니다. (35:40 ~ 37:02)

 

 

 

# 구조체

  • 구조체/enum의 인스턴스는 값 타입, 클래스의 인스턴스는 참조 타입
  • 구조체는 상속 불가
struct Resolution { // 구조체 정의
    var width = 1024 // 프로퍼티
    var height = 76
}
let myComputer = Resolution() // 인스턴스 생성
print(myComputer.width) // 프로퍼티 접근

 

 

구조체 : Memberwise Initializer

struct Resolution { // 구조체 정의
    var width : Int // 프로퍼티
    var height : Int
}
let myComputer = Resolution(width:1000, hight:500) 
// Memberwise Initializer
print(myComputer.width)

 

 

 

클래스 내에 구조체

struct Resolution {
    var width = 1024
    var height = 76
}
class VideoMode {
    var resolution = Resolution()
    var frameRate = 0.0
}
let myComputer = VideoMode()
print(myComputer.width)

 

 

 

Swift의 기본 데이터 타입은 모두 구조체

public struct Int
public struct Double
public struct String
public struct Array<Element>

 

 


# 클래스(class) vs 구조체(structure)

 

클래스 : 참조 타입(reference type)

  • 상속 가능
  • 타입 캐스팅(is, as)을 통해 실행 시점에 클래스 인스턴스의 타입을 해석하고 검사할 수 있다
  • deinit 함수를 사용해 사용한 자원을 반환할 수 있다
  • 참조 카운팅을 통해 한 클래스 인스턴스를 여러 곳에서 참조(사용)할 수 있다
class Human {
    var age : Int = 1
}
var kim = Human()
var lee = kim // 참조 타입
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)
// 참조 타입은 복사할 때 주소를 복사해서 한 데이터의 reference가 2개 생김
  • 출력값
    1 1
    30 30
    20 20

 

 

구조체 : 값 타입(value type)

  • 간단한 데이터 값들을 한 데 묶어서 사용하는 경우
  • 전체 덩어리 크기가 작은 경우, 복사를 통해 전달해도 좋은 경우
  • 멀티 스레드 환경
  • 기존 타입의 특성을 상속할 필요가 없음
  • 너비, 높이를 표현하는 기하학적 모양을 처리할 경우
  • 좌표, 시스템의 각 좌표
struct Human {
    var age : Int = 1
}
var kim = Human()
var lee = kim // 값 타입
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)
// 값 타입은 복사할 때 새로운 데이터가 하나 더 생김
  • 출력값
    1 1
    30 20
    1 20

 

call by value vs call by reference

  • Swift에서 제공하는 Int, String, Array, Dictionary 등 기본 자료형들은 구조체로 만들어져 있어서 call by value 방식
  • enumcall by value 방식
  • 클래스call by reference 방식