[Swift] 클래스

알파관·2022년 10월 1일
0
post-thumbnail

2022.09.27

당일 앱 스쿨에서 배운 '클래스'에 관한 지식을 복습하고자 포스팅을 하게 되었다. 복습 스터디를 통해서 지식정리를 어느정도 하였지만, 본 회고를 통해 더욱 확실하게 지식들을 내 것으로 만들어보자👀


📌 클래스와 객체지향언어

- 객체지향언어의 등장

세상에 모든 것은 '객체'라고 생각하는 사람들이 등장하고, 이러한 객체들 사이의 상호작용으로 프로그램이 동작한다는 개념에서 나오게된 언어가 바로 '객체지향언어'이다.

그러면, 객체언어라고 하면 될 것이지 왜 굳이 객체'지향'언어라고 하는 걸까?

그 이유는 바로, 객체언어를 만들기 위해서 절차지향 언어를 사용했다는 점 때문이다.

따라서, '객체'라는 단어 뒤에 '지향'이라는 단어를 붙이게되었다.

- 클래스란❓

'특정 역할을 수행하는 객체를 정의하는 타입'

'객체지향언어'의 핵심인 객체를 생성해내는 틀이라고 쉽게 이해할 수 있겠다.

클래스는 캡슐화 다형성 상속 이라는 3가지 특성을 가지며, 특정 역할을 수행하는 메서드와 프로퍼티로 구성된다.

프로퍼티는 또다른 말로 '인스턴스 변수'라고 하며, 클래스 내의 캡슐화된 데이터를 말한다.

여기서 '데이터 캡슐화'클래스에 저장되고 접근될 수 있는 데이터는 오직 해당 클래스 내에 정의된 메서드만을 통해서 가능하다는 것을 말한다.
(객체지향 프로그래밍의 핵심 목적이라고 한다)


📌 클래스 선언과 객체생성

- 클래스의 선언

class 키워드를 사용하여 아래와 같이 클래스를 선언할 수 있다.

class BankAccount {
	var accountBalance: Float = 0
    var accountNumber: Int = 0
    //프로퍼티
    
    func displayBalalnce() {
    	print("Number \(accountBalance)")
    }
    //인스턴스 메서드
    
    class func getMaxBalance() -> Float {
    	return 100000.00
    }
    //타입 메서드

클래스의 이름은 대문자로 시작한다는 것이 특징이다.

클래스 내부의 프로퍼티와 인스턴스 메서드를 정의하는 방법은 일반적인 변수/상수/함수를 선언하는 것과 동일한 방식이다.

위 코드를 보면 마지막에 class func 로 선언된 타입 메서드를 정의하는 부분이 있다.

개인적으로 인스턴스 메서드랑 타입 메서드가 처음 들었을 때 많이 헷갈렸는데, 그래서 둘의 차이를 간략하게 정리해보았다.

인스턴스 메서드타입 메서드
정의특정 타입의 '인스턴스'에서 호출하는 메소드타입 자체에서 호출되는 메소드
선언 키워드funcstatic func

타입이 클래스인 경우에는 예외적으로 static 대신 class를 앞에 붙인다.

- 객체 생성 및 메서드와 프로퍼티 접근

위의 클래스 선언문을 바탕으로 객체를 생성하는 방법은 아래와 같다.

let people: BankAccount = BankAccount()

클래스의 객체를 선언할 때는, 클래스 선언 때와 달리 소문자로 시작해야한다.

추후, 다른 포스팅에서 설명하겠지만 클래스의 인스턴스(객체)는 참조 타입이므로 상수로 선언하더라도 내부 프로퍼티 값 변경이 가능하다.

people.accountBalance //프로퍼티 접근
people.displayBalance() //메서드 접근
BankAccount.getMaxBalance() // 타입 메서드 접근(인스턴스가 아닌 타입(여기선 클래스)을 통해)

인스턴스 프로퍼티와 메서드에 접근하기 위해서, 인스턴스 뒤에 .(점 표기법)을 붙인다.

타입 메서드도 마찬가지로 .을 통해 접근이 가능하다
(단, 인스턴스가 아닌 타입을 통해 접근)


📌 클래스의 인스턴스 초기화 및 소멸

- 클래스 인스턴스 초기화

인스턴스 생성시에 초기화가 필요할 수도 있는데, 이럴 때 이니셜라이저를
init() 메서드를 사용한다.

init() {
	temperature = 32.0
}

가장 기본적인 init() 메서드를 선언하는 형식은 위와 같으며, init() 내에서 클래스 내부의 저장 프로퍼티를 초기화시킬 수 있다.

하지만, 만일 프로퍼티 선언 시에 초기화를 해버리거나 이니셜라이저에 매개변수가 없는 경우라면 이니셜라이저는 생략이 가능하다.
(이런 경우를 기본 초기화 구문 이라고 한다)

그렇다면, 만일 매개변수가 있는 이니셜라이저가 필요하다면 어떻게 해야할까?

그럴경우에는, 무조건 이니셜라이저를 아래와 같은 형식으로 직접 선언해주어야 한다.

init(_ kelvin: Double) {
	temperature = kelvin - 273.15
}

위 코드에서 이니셜라이저의 매개변수로 들어간 kelvin을 우리는 초기화 파라미터 라고 한다.

초기화 파라미터를 사용함으로써, 프로퍼티의 초기화를 사용자화 할 수 있게 된다.

또한, 초기화 파라미터를 사용함으로써 프로퍼티의 초기화를 클래스 인스턴스가 생성되는 시점으로 설정할 수 있게 된다.

아래의 코드 예시를 통해 클래스 인스턴스 초기화에 관한 개념을 정리해보자

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

var account1: BankAccount = BankAccount(number: 12312312, balance: 400.54)
//인스턴스 생성 시점에 프로퍼티 초기화

- 클래스 인스턴스 소멸하기

클래스의 인스턴스가 더 이상 필요가 없을 때, 해당 인스턴스는 Swift의 런타임 시스템에 의해 없어진다.

허나, 이렇게 인스턴스가 사라지기 직전에 반드시 해야 할 정리 작업이 있다면 이를 어떻게 명시해주어야 할까?

이럴 때 사용하는 것이 바로 소멸자 구현 이다.

클래스에서 소멸자를 구현할 때는 deinit 이라는 키워드를 사용한다.

소멸자의 구현은 아래와 같은 형식으로 할 수 있다.

deinit {
	//인스턴스가 사라지기 전에 수행할 작업
 }

deinit을 적용하여 위에서 우리가 배운 지식들을 적용하여 온전한 하나의 클래스를 선언해보면 아래와 같을 것이다.

class BankAccount {
	var accountBalance: Float = 0
    var accountNumber: Int = 0
    //인스턴스 프로퍼티
    
    init(number: Int, balance: Float) {
    	accountNumber = number
        accountBalance = balance
    }
    //이니셜라이저 
    
    deinit {
    	print("프로그램을 종료합니다")
    }
    //소멸자 
    
    func displayBalance() {
    	print("Number \(accountBalance)")
        print("Current balance is \(accountNumber)")
    }
    //인스턴스 메서드
    
    class func getMaxBalance() -> Float {
    	return 100000.00
    }
    //타입 메서드
}

var account1: BankAccount = BankAccount(number: 12312312, balance: 400.54)
//인스턴스 생성 시점에 프로퍼티 초기화

account1.accountBalance //프로퍼티 접근
account1.displayBalance() //메서드 접근
BankAccount.getMaxBalance() // 타입 메서드 접근(인스턴스가 아닌 타입(여기선 클래스)을 통해)

오늘 공부한 클래스의 기본개념 이외에도 클래스에 관한 더 많은 내용들이 있지만, 이들은 나중에 따로 다뤄볼 예정이다
(상속개념)

본 포스팅을 통해 아래의 개념들을 확실히 이해할 수 있었다 😀

  • 클래스의 선언
  • 인스턴스 생성
  • 인스턴스 초기화 & 소멸
  • 인스턴스를 통한 메서드 & 프로퍼티 접근 (점 표기법)
profile
iOS🍎

0개의 댓글