본문 바로가기
⌨️ Language/swift

[Swift] 클래스와 구조체

by hyebin (Helia) 2024. 3. 19.

클래스 VS 구조체

공통점

  • 값을 저장하기 위한 프로퍼티 정의
  • 기능을 제공하기 위한 메소드 정의 
  • subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의
  • 초기 상태를 설정할 수 있는 initializer 정의
  • 기본 구현에서 기능 확장
  • 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응(conform)

차이점(클래스만 가능)

  • 상속 (Inheritance): 클래스의 여러 속성을 다른 클래스에 물려 줌
  • 타입 캐스팅 (Type casting): 런타임에 클래스 인스턴스의 타입을 확인
  • 소멸자 (Deinitializers): 할당된 자원을 해제(free up) 시킴
  • 참조 카운트 (Reference counting): 클래스 인스턴스에 하나 이상의 참조가 가능

구조체를 사용하는 경우

  • 주 목적이 관계된 간단한 값을 캡슐화(encapsulate) 하기 위한 것인 경우
  • 구조체의 인스턴스가 참조되기 보다 복사되기를 기대하는 경우
  • 구조체에 의해 저장된 어떠한 프로퍼티가 참조되기 보다 복사되기를 기대하는 경우
  • 구조체가 프로퍼티나 메소드 등을 상속할 필요가 없는 경우

 

클래스

클래스 선언 문법

class VideoMode {
    var resolution = Resolution()  // Resolution 구조체를 값으로 사용
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

클래스 인스턴스 생성

클래스 이름 뒤에 () 빈 괄호 붙이면 인스턴스 생성

let someVideoMode = VideoMode()    // 클래스 인스턴스 생성

프로퍼티 접근

점 문법을 사용해서 클래스 인스턴스의 프로퍼티와 하위레벨 프로퍼티에 접근 가능

print(\\(someVideoMode.frameRate)")
// 0.0 출력

점 문법을 사용해서 값 할당 가능

someVideoMode.resolution.width = 1280

print("The width of someVideoMode is now \\(someVideoMode.resolution.width)")
// "The width of someVideoMode is now 1280" 이 출력

클래스는 참조 타입

 참조 타입이란?

 

변수나 상수에 값을 할당을 하거나 함수에 인자로 전달할 때 그 값이 복사되지 않고 참조(그 값을 갖고 있는 메모리를 바라보고 있다)됨

let tenEighty = VideoMode()

tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty

alsoTenEighty.frameRate = 30.0

print("The frameRate property of tenEighty is now \\(tenEighty.frameRate)")
// "The frameRate property of tenEighty is now 30.0" 출력
  • let alsoTenEighty = tenEighty 구문에서 alsoTenEighty상수가 tenEighty 인스턴스를 복사한 것이 아니라 참조한 것이기 때문에 나중에 30으로 변경된 값으로 출력됨
  • 바라보고 있는 메모리 주소를 동일하게 바라보고 참조하고 있는 것

식별 연산자

상수와 변수가 같은 인스턴스를 참조하고 있는지 비교하기 위해 식별 연산자를 사용함

  • === : 두 상수나 변수가 같은 인스턴스를 참조하고 있는 경우 참
  • !== : 두 상수나 변수가 다른 인스턴스를 참조하고 있는 경우 참

 

구조체

구조체 선언 문법

struct Resolution {
    var width = 0
    var height = 0
}

구조체

인스턴스 생성

구조체 이름 뒤에 () 빈 괄호 붙이면 인스턴스 생성

let someResolution = Resolution()    // 구조체 인스턴스 생성

프로퍼티 접근

print("The width of someResolution is \\(someResolution.width)")
// "The width of someResolution is 0" 출력

 

구조체형의 멤버 초기화

  • 모든 구조체는 초기화 할 때 프로퍼티를 선언할 수 있는 초기자를 자동 생성해 제공
  • 아래 예시에서 구조체 안에 width와 height프로퍼티만 정의했다면 자동으로 사용 가능
let vga = Resolution(width: 640, height: 480)

 

구조체와 열거형은 값 타입

값 타입이란?

 

함수에서 상수나 변수에 전달될 때 그 값이 복사되서 전달됨

let hd = Resolution(width: 1920, height: 1080)

var cinema = hd
반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 메서드  (0) 2024.03.21
[Swift] 프로퍼티  (0) 2024.03.20
[Swift] 클로저  (1) 2024.03.18
[Swift] 예외 처리와 함수  (4) 2024.03.17
[Swift] 조건/반복문  (1) 2024.03.17

댓글