문법

[iOS] 2025.03.18 문법(class, init)

ioskkt 2025. 3. 18. 14:52

class

  • 연관된 상태는 변수, 상수에 저장하고, 행동은 함수를 정의한 후 그룹화하여 데이터타입으로 사용할 수 있음.
  • 프로퍼티와 메소드로 구성되어 있음.
  • 프로퍼티 : struct, class 안에 있는 변수, 상수
  • 메소드 : struct, class 안에 있는 함수
  • class의 인스턴스를 생성하여 사용할 수 있음.
  • class 안에서 사용되는 변수와 상수인 프로퍼티에는 default 값을 정해줄 수 있음.
  • class의 인스턴스를 생성할 때 반드시 초기화를 해줘야 함.
  • init 초기화를 제공해야 함.
  • 모든 프로퍼티에 default값을 제공한다면 init 초기화를 생략할 수 있음.
  • 모든 프로퍼티가 Optional인 경우 init 초기화를 생략할 수 있음.
  • 초기화를 도와주는 convenience initializer를 제공함.
  • class를 사용해서 만들어진 인스턴스는 Reference Type임.
  • 인스턴스를 let으로 만들어도 프로퍼티 변경이 됨.
  • 함수에 class의 인스턴스를 전달하고 프로퍼티를 변경하면 원본도 변경이 됨.
  • 상속 가능
  • 하위 클래스가 상위 클래스의 속성(프로퍼티)과 행동(메소드)를 물려받아서 사용할 수 있음.

 

class 구현방법, 초기화방법, 사용방법

1. 기본 정의 방법

// 기본 정의(구현) 방법
class 클래스이름 {
    // 파라미터 선언
    // 메소드 선언
    
    // 파라미터가 있다면 init을 사용하여 초기화
}

// 사용방법 (인스턴스로 만드는 방법)
let 인스턴스이름 = 클래스이름()
// () 안에 init에 들어가는 파라미터를 채워주면 됨.

2. init 방법(초기화 방법)

  • 인스턴스를 생성할 때 모든 프로퍼티를 초기화해야 하며, 이를 위해 init 키워드를 사용함.
  • 모든 프로퍼티의 값을 할당해줘야 함.
  • 예외 : 값이 없을 수 있는 옵셔널타입, 초기값을 준 프로퍼티
  • init을 여러개 만들 수 있음.
  • convenience init 기능 제공

 

지정초기화

// 일반적인 init

class Person {
    var name: String // 값을 저장하는 저장 프로퍼티
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let person = Person(name: "Brody", age: 25)

 

기본값초기화

  • 프로퍼티에 기본값을 넣으면 초기화를 진행하지 않아도 됨.
class Person {
    var name: String = "이름없음"
    var age: Int = 0
}

let person = Person()

// 혹은 파라미터를 받지 않는 init에서 모든 프로퍼티 값을 정해줄 수 있습니다.

class Person {
    var name: String
    var age: Int
    
    init() {
        self.name = "이름없음"
        self.age = 15
    }
}

 

여러개의 Init 사용

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    init(name: String) {
        self.name = name
        self.age = 0
    }
    
    init() {
        self.name = "이름없음"
        self.age = 15
    }
}
// 인스턴스를 생성하는 방식, 초기화 방식에 따라 값이 다름
let person1 = Person(name: "Aiden", age: 34)
print(["\(person1.name)", "\(person1.age)"].joined(separator: ", "))
// Aiden, 34
let person2 = Person(name: "Aiden")
print(person2.name)
// Aiden
let person3 = Person()
print(person3.name, person3.age)
// 이름없음 15
let person4: Person = Person()
print("\(person4.name), \(person4.age)")
// 이름없음, 15

 

conveniece init : 보조 초기화

  • 클래스에서만 사용할 수 있는 기능.
  • self.init을 사용하여 초기화를 도와줌.
// 컨비니언스 이니셜라이저(convenience initializer) 사용해보기
// 파라미터에 값을 할당하지 않고 컨비니언스 이니셜라이즈를 사용해도 비슷한 효과를 낼 수 있습니다.

class Person {
    var name: String
    var age: Int // 기본값을 주지 않았어요!
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    convenience init(name: String) { // convenience init에서 name만 받은 후 아래 init에서 기본값을 정해줄 수 있습니다.
        self.init(name: name, age: 0)
    }
}

let person = Person(name: "Aiden") // name 프로퍼티만 전달해줌.
print(person.name)
print(person.age) // 0 -> convenience init의 age 값을 전달받음.

deinit : 소멸자

  • class 에서만 사용 가능함.
  • 사용이 종료된 인스턴스가 메모리에서 해제될 때 자동 호출됨.
  • 직접 호출은 할 수 없음.
  • 예를 들어 파일을 열고 데이터를 작성하는 클래스를 생성하면 클래스 인스턴스를 할당 해제하기 전에 파일을 닫아야 함.