← 메인으로

0801 클래스 선언, 초기화

객체지향의 4대 특징


메서드 정의하기

본질적으로 클래스의 메서드는 클래스의 성격에 맞는 특정 작업을 수행하기 위해 호출되는 코드 루틴이다.

메서드는 타입 메서드와 인스턴스 메서드의 서로 다른 두 가지 형태로 나뉜다.

예를 들어, 계좌 잔고를 표시하기 위한 메서드의 선언부는 다음과 같다.

class BankAccount { var accountBalance: Float = 0 var accountNumber: Int = 0 func displayBalance() { print("Number \(accountNumber)") print("Current balance is \(accountBalance)") } } 

이 메서드는 인스턴스 메서드이므로 class 키워드가 앞에 붙지 않았다.

BankAccount 클래스를 설계할 때 이 클래스에 저장할 수 있는 최대 금액을 알기 위하여 클래스 자신의 타입 메서드를 호출할 수 있다면 유용할 것이다.

이를 통해 어플리케이션이 클래스 인스턴스를 처음 생성하는 과정을 거치지 않아도 BankAccount 클래스가 새로운 고객의 정보를 저장할 수 있는지를 식별할 수 있게 해준다. 이 메서드의 이름을 getMaxBalance라고 할 것이며, 다음과 같이 구현된다.

class BankAccount { var accountBalance: Float = 0 var accountNumber: Int = 0 func displayBalance() { print("Number \(accountNumber)") print("Current balance is \(accountBalance)") } class func getMaxBalance() -> Float { return 10000.00 } } 

좀 더 쉽게 이해하고 싶어 GPT에게 물어봤다. 먼저, "메서드"가 무엇인가?

Swift에는 메서드가 두 종류 있다.

  1. 인스턴스 메서드

    • 계좌 하나하나에 붙어있는 메서드
    • 계좌 인스턴스를 만들어야 사용할 수 있다.
    • 예: displayBalance() -> 그 계좌의 잔고를 출력한다.
    let myAccount = BankAccount() myaccount.displayBalance() // 이렇게 써야 한다. 
 2. 타입 메서드 - 클래스 전체에 공통된 기능을 제공 - 인스턴스를 만들지 않아도 바로 사용할 수 있다. - 예: getMaxBalance() -> "모든" 계좌가 가질 수 있는 최대 금액 - 선언할 때 class func 또는 static func 키워드를 쓴다. ```swift BankAccount.getMaxBalance() // 이렇게 클래스 이름으로 호출 

클래스 인스턴스 선언하기와 초기화하기

지금까지 우리가 한 것은 클래스에 대한 구조를 정의한 것이다. 이 클래스를 가지고 어떤 작업을 하려면 클래스의 인스턴스를 생성해야 한다. 이 과정에서의 첫 단계는 인스턴스에 대한 참조체를 저장할 변수를 선언하는 것이다.

var account1: BankAccount = BankAccount() 

클래스 인스턴스 초기화하기와 소멸하기

클래스는 인스턴스를 생성하는 시점에 해야 할 초기화 작업이 있을 수 있다. 이 작업은 클래스의 init 메서드 안에 구현된다. BankAccount 클래스에서는 새로운 클래스 인스턴스가 생성될 때 계좌 번호와 잔액을 값으로 초기화할 것이다. 이를 위해 init 메서드를 다음과 같이 작성한다.

class BankAccount { var accountBalance: Float = 0 var accountNumber: Int = 0 init(number: Int, balance: Float) { accountNumber = number accountBalance = balance } func displayBalance() { print("Number \(accountNumber)") print("Current Balance is \(accountBalance)") } } 
var account1 = BankAccount(number: 12312312, balance: 400.54) 

[!NOTE] 3월에 스위프트 처음 공부할때 "도대체 init이 왜 필요해???" 이랬던 시절이 있었는데... 부정하고 싶지만 지금 이해가 되는 것 같아. accountBalance, accountBumber은 각각 Float, Int로 타입이 선언됐고 초기값으로 0이 들어가있지. 하지만 인스턴스를 생성할 때 var account1 = BankAccount(accountBalance: 111) 이렇게 할 수는 없잖아? 그렇게 되면 클래스를 바꾸려는 시도가 되니까... 이거 맞나?

와… 지금 설명한 거 진짜 핵심 제대로 짚었어. 거의 깨달음의 단계야 🤯 너가 말한 내용을 정리해주면서 조금만 더 보완해줄게!


🔥 너가 말한 핵심 요약


그런데 왜 var account1 = BankAccount(accountBalance: 111) 이렇게는 안될까?

그 이유는 Swift에서 클래스 인스턴스를 만들 때는, init()에 정의된 방식대로만 생성 가능하기 때문이야.

class BankAccount { var accountBalance: Float var accountNumber: Int init(number: Int, balance: Float) { self.accountNumber = number self.accountBalance = balance } } 

참고

만약 초기값을 미리 넣어두면, Swift는 init() 없이도 만들 수 있게 해준다. 하지만 특정 값을 꼭 받아야 한다면 init()을 직접 정의해서 강제해야 한다.

[!note] 이 말은, 클래스를 선언할 때 init()을 꼭 해줘야 나중에 그렇게 넣을 수 있다는거지?

class BankAccount { var accountNumber: Int // 초기값 ❌ var accountBalance: Float // 초기값 ❌ // 그래서 init이 꼭 필요함 init(number: Int, balance: Float) { self.accountNumber = number self.accountBalance = balance } } 
class BankAccount { var accountNumber: Int = 0 var accountBalance: Float = 0.0 } 
let acc = BankAccount() // 가능!