Swift에서의 Class

2024. 11. 24. 22:43·App Development/Swift

Class란?

Class는 Swift에서 참조 타입으로 객체의 상태와 동작을 정의하는 설계 도구입니다.

  • 동일한 객체를 여러 변수에서 참조할 수 있음.
  • 상위 클래스를 확장하여 새로운 클래스 설계가 가능.
  • 참조 횟수를 추적하여 메모리 해제를 자동으로 관리(ARC를 통한 메모리 관리).
  • 상속이 필요하거나 다형성을 구현해야 하는 경우에 사용함.
  • 간단한 데이터 구조에서는 struct가 더 적합함.

Class와 Struct 한 눈에 비교하기

특성 Class Struct
참조 타입 vs 값 타입 참조 타입 (Reference Type): 동기화됨 값 타입 (Value Type)
상속 가능 여부 상속 가능 상속 불가능
deinit 지원 여부 지원 미지원
변경 가능 여부 var로 선언 시 변경 가능 모든 프로퍼티가 기본적으로 불변(let)

 

상속(inheritance)란?
클래스 간에 공통된 기능과 속성을 재사용하고, 기존 Class를 확장하여 새로운 기능을 추가할 수 있도록 설계된 것을 의미합니다.

 

Class에서의 초기화(Initialization)와 init() 호출

Swift는 모든 저장 프로퍼티가 초기화되도록 강제합니다.

 

따라서 class의 init() method가 인스턴스를 생성할 때 모든 저장 프로퍼티에 유효한 값을 설정합니다. init()을 통해 매개변수를 가진 생성자 method를 만들어야 매개변수를 넣어 그 값을 가진 객체를 만들 수 있습니다.

class YoutuberClass {
	var name: String
    var subscribersCount: Int
    
    // init() method call
    init(name: String, subscribersCount: Int){
    	self.name = name
        self.subscribersCount = subscribersCount
    }
}

 

self라는 구조체의 인스턴스를 사용하여 name와 subscribersCount라는 매개변수를 가진 생성자 method를 호출하였습니다.

 

상속 시, 서브클래스는 반드시 super.init() 을 호출하여 상위 클래스의 초기화를 완료해야 합니다.

class Animal {
	var name: String
    init(name: String){
    	self.name = name
    }
}

class Dog: Animal {
	var breed: String
    
    init(name: String, breed: String) {
    	self.breed = breed
        super.init(name: name) // 상위 클래스 초기화 호출
    }
}

 

Class 사용 시 주의할 점

  • 참조 타입으로 인해 강한 참조 순환 문제(Strong Reference Cycle)이 발생할 수 있음.
강한 참조 순환 문제란?

객체 간의 강한 참조로 인해 메모리가 해제되지 않는 문제를 말하며, 이로 인해 메모리 누수(더 이상 필요하지 않은 메모리가 해제되지 않고 계속 점유된 상태로 남아있는 현상)가 발생할 수 있습니다.
Swift는 ARC를 사용하여 메모리를 관리합니다. 두 객체가 서로를 강하게 참조하고 있으면 ARC는 참조 카운트를 0으로 만들지 못하므로 메모리를 해제하지 않습니다.

 

class Person {
	var pet: Pet?
}

class Pet {
	var owner: Person?
}

var person: Person? = Person()
var pet: Pet? = Pet()

person?.pet = pet
pet?.person = person

 

이를 해결하기 위해 weak나 unowned 키워드로 순환 참조를 방지합니다.

  • weak: 참조 카운트를 증가시키지 않습니다. 옵셔널로 선언해야 하며, 참조 대상이 해제되면 자동으로 nil이 됩니다.
  • unowned: 참조 카운트를 증가시키지 않습니다. 옵셔널이 아니며 참조 대상이 항상 존재한다고 가정할 때 사용합니다.
 
저작자표시 비영리 동일조건 (새창열림)

'App Development > Swift' 카테고리의 다른 글

Swift의 매개변수(parameter) 정리하기  (0) 2024.11.30
Swift에서의 completion  (0) 2024.11.26
Swift의 Closure 란?  (0) 2024.11.25
Swift의 ARC (Automatic Reference Counting)  (0) 2024.11.24
Swift 분기 처리 정의와 종류  (0) 2024.11.23
'App Development/Swift' 카테고리의 다른 글
  • Swift에서의 completion
  • Swift의 Closure 란?
  • Swift의 ARC (Automatic Reference Counting)
  • Swift 분기 처리 정의와 종류
Genie Choi 지니 초이
Genie Choi 지니 초이
  • Genie Choi 지니 초이
    Genie World
    Genie Choi 지니 초이
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • Genie (3)
      • Projects (6)
      • Up-to-date learning (0)
      • App Development (10)
        • React Native (1)
        • Swift (9)
      • Marketing Tool (1)
        • Mobile Measurement Platform (1)
        • CRM Marketing (0)
      • Linux (5)
      • AWS (2)
        • EC2 (1)
        • Route 53 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Genie Choi 지니 초이
Swift에서의 Class
상단으로

티스토리툴바