지난 포스팅의 주제인,
인스턴스(객체)를 실체화 하는 추상화된 틀, 클래스(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 관련 포스팅에서 다루도록 하겠습니다.
다음 포스팅에서는
클래스 내부에 있는 '프로퍼티'에 대한 다양한 유형에 대해 알아보겠습니다.
'iOS > Swift' 카테고리의 다른 글
[iOS/Swift] 클래스의 계층구조, 상속(Inheritance)의 개념과 활용 (0) | 2023.02.13 |
---|---|
[iOS/Swift] 간단하게 알아보는 프로퍼티(Property)의 유형 (0) | 2023.02.12 |
[iOS/Swift] 프레임워크(Framework)와 클래스(Class)와의 관계 (1) | 2023.01.30 |
[iOS/Swift] 클로저 표현식을 간단하게! 문법 경량화 (0) | 2023.01.27 |
[iOS/Swift] 클로저 표현식(Closure Expression)과 1급 객체 조건 (0) | 2023.01.26 |
댓글