본문 바로가기
iOS/Swift

[iOS/Swift] 클래스(Class)의 선언과 구성요소 파악하기

by iosdevlime 2023. 1. 31.

지난 포스팅의 주제인,

인스턴스(객체)를 실체화 하는 추상화된 틀, 클래스(Class)에 대한

 

선언방식, 그리고 구성요소에 대해 예시코드를 바탕으로 살펴보도록 하겠습니다.

 

 

아래 내용은 이번 포스팅에서 계속해서 다룰 예시 상황입니다.

A 은행은 청년을 위한 저축계좌 상품을 만들었습니다. 
- 해당 계좌는 총 1,000,000원 저축 한도가 정해져 있습니다.
- 또한, 계좌번호와 현재의 잔액을 파악할 수 있는 기능이 있습니다.

 

 


 

 

 

Swift 클래스 선언하기

인스턴스(객체)의 구체화를 위한 '청사진' 만들기

 

A은행은, 저축계좌 상품을 만들기 위해

청사진(Blueprint), 용어 그대로 설계를 목적으로 한 틀인

 

공통적인 조건의 계좌 클래스(Class)를 생성합니다.

 

 

 

클래스 기본구문

  • 새롭게 생성하는 클래스(틀)는, 클래스의 이름과 속성(프로퍼티) 및 행위(메서드)를 포함합니다.
    • 프로퍼티(Property) 는 클래스 내 포함되는 변수와 상수를 정의합니다.
    • 메서드(Method) 는 특정 작업을 수행하는 고유의 함수(Function)입니다.
  • 아래 코드는, 클래스의 기본 선언 형태(구문)입니다.
    • Swift 명명규칙(표기법)에 의해, 클래스의 이름Upper Camel Case 로 표기합니다.
class 새로운 클래스 이름 : 부모 클래스 {

    // 프로퍼티(Properties)
    // 인스턴스 메서드(instance method) -> 호출되는 메서드
    // 타입 메서드(Type method) -> 해당 클래스 자체의 인스턴스
 
 }
 
 // A은행에서 개설하는 계좌 Class 선언
 
 Class YouthBankAccount {
 
    // Properties, methods
    
 }

 

 


 

 

프로퍼티(Property)및 메서드(Method) 추가

클래스의 속성과 행위, 즉 추상화 된 기능 정의하기

 

A은행은 'YouthBankAccount' 란 이름의 저축계좌의 틀을 생성했습니다.

추가적으로 어떤 기능들이 필요할까요?

 

 

 

프로퍼티(인스턴스 프로퍼티) 추가하기

  • 객체지향 프로그래밍의 특징인 '캡슐화'에 따른 클래스만의 저장 데이터를 선언합니다.
    • 클래스 내부에 정의되고, 캡슐화 된 데이터를 프로퍼티(Property) 라고 합니다.
    • 또한, 인스턴스 생성 시 활용한다 하여 인스턴스 변수(Instance Variable)이라고도 합니다.
  • YouthBankAccount 클래스는, 계좌번호와 잔고 데이터가 포함될 필요가 있습니다.
    • 따라서, 위 2가지 데이터를 변수나 상수를 선언할 시와 동일하게 선언, 추가합니다.
    • accountBalance(잔고 데이터), accountNumber(계좌번호)
// 클래스 내 캡슐화 된 데이터를 프로퍼티 또는 인스턴스 변수라고 부름
// BankAccount의 프로퍼티 -> 계좌번호, 계좌에 남은 잔고

class YouthBankAccount {
    var accountBalace: Float = 0
    var accountNumber: Int = 0
}

 

 

2가지 형태의 메서드 추가하기

  • 데이터가 생성된 YouthBankAccount 클래스는, 성격에 맞는 작업을 수행 할 필요가 있습니다.
    • 메서드는 인스턴스 메서드(Instance Method) 타입 메서드(type Method)로 구분됩니다.
  • '인스턴스 메서드'는, 인스턴스(구체화)를 생성한 후 외부에서 작업을 하는 용도로 선언됩니다.
    • 예를 들면, 클래스 내부에 위치한 2개의 프로퍼티 변수에 대한 산술연산이나 출력 등의 용도입니다.
class YouthBankAccount {
    var accountBalace: Float = 0
    var accountNumber: Int = 0
    
    // 인스턴스 메서드 -> 2개 변수의 값을 출력한다.
    func displayBalance() {
        print("계좌번호 : \(accountNumber)")
        print("잔액 : \(accountBalace))")
    }
}

 

  • 반면에, '타입 메서드'는 클래스 내부 레벨에서 활용되는 저장형 메서드입니다.
    • 별도의 인스턴스를 거치지 않아도, 클래스가 새로운 정보를 저장할 수 있는지 식별합니다.
class YouthBankAccount {
    var accountBalace: Float = 0
    var accountNumber: Int = 0

    func displayBalance() {
        print("계좌번호 : \(accountNumber)")
        print("잔액 : \(accountBalace)")
    }

    // 현재 클래스에 저장할 수 있는 최대 금액을 파악할 수 있는 타입 메서드
    func getMaxBalance() -> Float {
        return 100000.00
    }
}

 

 


 

 

인스턴스 생성 및 초기화(init), 소멸(deinit)하기

클래스를 구체화 하기 위한 인스턴스 생성, 그리고 프로퍼티 값의 초기화와 소멸

 

YouthBankAccout의 틀이 얼추 구성되었습니다.

  • 계좌 잔액(accountBalance)와 계좌번호(accountNumber)가 프로퍼티로 선언되었고,
  • 계좌 잔액과 번호를 출력하는 인스턴스 메서드,
  • 클래스 내부에 최대 금액을 설정하는 타입 메서드가 완성되었습니다.

 

그렇다면, 아래와 같은 예시 설정을 추가해볼까요?

KATE는 YouthBankAccount 계좌를 새롭게 생성합니다.
계좌의 이름은 'kateAccount' 로 설정하며, 계좌번호는 전화번호로 등록합니다.

지난 2월에 500,000원을 입금했으나, 친구에게 선물을 하기 위해 계좌를 해지하고자 합니다.

 

KATE가 가장 먼저 해야 할 일은?

 

바로,

YouthBankAccount란 상품에서 새로운 계좌(인스턴스)를 생성하는 일입니다.

 

 

 

인스턴스 생성 및 초기화(initializer) 하기

  • 추상화 된 클래스, YouthBankAccount 상품을 활용하기 위해 인스턴스를 생성합니다.
    • 첫 번째 단계는, 인스턴스에 대한 참조체(변수)를 선언하는 것에서 시작합니다.
var kateAccount: YouthBankAccount = YouthBankAccount()

 

  • 이후, 계좌에 원하는 금액(accountBalace)과 번호(accountNumber)를 선언하고자 하는데?
    • 하나의 클래스(틀)에서 KATE만의 고유한 계좌(인스턴스)를 만들기 위해,
    • 초기화(Initializer) 작업이 반드시 필요합니다!
  • '초기화'란, 인스턴스가 클래스의 속성값을 사용자 임의로 작성하기 위한 과정입니다.
    • init() 메서드를 통해 초기화가 선언되지 않을 경우,
    • 클래스 내부 프로퍼티의 할당값이 초기화 값이 됩니다.
// 해당 인스턴스가 아닌, 새로운 인스턴스가 또 생성될 경우
// 계좌번호와 잔액을 반드시 '초기화' 할 필요가 있으므로
// 기존 YouthBankAccount 클래스 내부에 init() 메서드를 활용함

class YouthBankAccount {
    var accountBalace: Float = 0
    var accountNumber: Int = 0

    // 새로운 인스턴스를 생성할 때마다, 직접 계좌번호와 잔액을 초기화 할 수 있도록
    // init 메서드를 작성 -> 프로퍼티를 활용해, 일종의 매개변수를 만들어 준다고 생각하면 편함
    init(number: Int, balance: Float ) {
        accountNumber = number
        accountBalace = balance
    }

    func displayBalance() {
        print("계좌번호 : \(accountNumber)")
        print("잔액 : \(accountBalace)")
    }

    class func getMaxBalance() -> Float {
        return 100000.00
    }
}

 

  • 초기화를 거치게 되면, 새로운 인스턴스를 생성할 때 KATE 본인이 값을 대입할 수 있습니다. 
    • init() 선언 없이, 계좌번호와 잔액이 YouthAccountBank 내부에 설정되어 있다면?
    • KATE는 계좌번호와 잔액을 설정할 수 없습니다.
// init() 메서드 매개변수를 활용해 계좌번호와 잔액을 설정
var kateAccount: YouthBankAccount = YouthBankAccount(number: 1234-5678, balance:500000)


kateAccount.displayBalance()
// 계좌번호 : 1234-5678
// 잔액 : 500000.0

 

  • Kate는 계좌의 해지(소멸)를 희망하게 되며, 이때 활용되는 개념이 바로 소멸화(deinit)입니다. 
    • init()을 통해 초기화 된 계좌번호, 잔액을 정리하기 위해 deinit() 메서드를 사용합니다.
    • 클래스 내부에 소멸자(deinitializer)를 구현하며, 해당 인스턴스에 nil 값을 할당합니다.
// 해당 인스턴스가 아닌, 새로운 인스턴스가 또 생성될 경우
// 계좌번호와 잔액을 반드시 '초기화' 할 필요가 있으므로
// 기존 YouthBankAccount 클래스 내부에 init() 메서드를 활용함

class YouthBankAccount {
    var accountBalace: Float = 0
    var accountNumber: Int = 0

    init(number: Int, balance: Float ) {
        accountNumber = number
        accountBalace = balance
    }
    
    
    // deinit() 메서드를 작성, 내부에 소멸 작업을 수행합니다.
    deinit {
     print("계좌가 해지되었습니다")
    }

    func displayBalance() {
        print("계좌번호 : \(accountNumber)")
        print("잔액 : \(accountBalace)")
    }

    class func getMaxBalance() -> Float {
        return 100000.00
    }
}

// 기존에 선언한 kateAccount의 값을 소멸하기 위해 nil을 할당한다!
kateAccount = nil // "계좌가 해지되었습니다"

// 이후, kateAccount의 프로퍼티 혹은 메서드를 호출해도, nil값만이 호출됨
kateAccount.accountBalance // nil

 

 


 

 

메서드 호출과 프로퍼티 접근

점 표기법(dot notation)을 활용한 프로퍼티 및 메서드 접근

 

앞서 살펴본 내용을 정리해보자면, 다음과 같습니다.

  • 클래스의 선언
  • 프로퍼티
  • 메서드(인스턴스 메서드, 타입 메서드)
  • 초기화(init)와 소멸화(deinit)

그렇다면,

클래스에 있는 프로퍼티에는 어떻게 접근하며, 메서드는 어떻게 호출할 수 있을까요?

 

(사실, 위 예시 코드에서 이미 다뤄왔지만 한번 더 짚고 넘어가자면..)

바로 점 표기법(dot notation)을 이용하는 방식입니다.

 

 

 

점 표기법(dot notation)

  • 생성한 인스턴스의 이름 다음에 점(.)을 찍은 후, 프로퍼티 혹은 메서드 이름에 접근합니다.
    • 프로퍼티, 메서드 둘다 동일한 방식으로 접근 혹은 호출합니다.
// accountNumber 프로퍼티 접근
kateAccount.accountNumber // 1234-5678

// displayBalace() 인스턴스 호출 
kateAccount.displayBalance() // 계좌번호 : 1234-5678 잔액: 500000

 

  • 다만, 타입 메서드는 인스턴스가 아닌 클래스에서 호출되어야 합니다.
    • 새로운 인스턴스(변수)를 생성한 후, 클래스 이름 뒤에 점(.)을 찍은 후, 타입메서드를 참조합니다.
var maxAllowed = BankAccount.getMaxBalance()

 

 

 


 

클래스의 선언과 구성요소, 그리고 구체화인 인스턴스를 생성하는 과정을 살펴보았습니다.

 

클래스, 프로퍼티, 메서드, 인스턴스 와 같은

다소 헷갈릴 수 있는 용어에 대한 정리는 추후 CS 관련 포스팅에서 다루도록 하겠습니다.

 

다음 포스팅에서는

클래스 내부에 있는 '프로퍼티'에 대한 다양한 유형에 대해 알아보겠습니다. 

 

 

댓글