스위프트는 객체지향 어플리케이션 개발을 광범위하게 지원한다. 하지만, 객체지향 프로그램이라는 주제는 너무 커서 그 내용만으로 책 한 권을 쓸 수도 있을 정도다. 그 대신 우리는 객체지향 프로그래밍에 포함된 기본 개념을 살펴본 후에 스위프트 앱 개발과 관련된 개념을 공부할 것이다.
객체란 무엇인가?
객체(Class instance)는 소프트웨어 어플리케이션을 구축하는 블록으로 쉽게 사용하고 재사용할 수 있는 독립적인 기능 모듈이다.
- 작업을 수행하기 위한 객체나 인스턴스에서 접근되고 호출되는 속성(프로퍼티)과 함수(메서드)로 객체가 구성된다. 객체를 구성하는 데이터 변수와 함수를 포괄적으로 클래스 멤버라고 한다.
클래스란 무엇인가?
빌딩이 건축되면 어떤 모양일지를 정의하는 청사진이나 건축가의 도면처럼 클래스는 객체가 생성될 때의 모습을 정의한다. 예를 들어, 메서드들이 하게 될 일이 무엇이며 어떤 프로퍼티들이 존재할 지 등을 정의한다.
스위프트 클래스 선언하기
객체를 인스턴스화하기 전에 먼저 객체에 대한 '청사진'인 클래스를 정의해야 한다. 새로운 스위프트 클래스를 선언할 때 새롭게 만드는 클래스가 어떤 부모 클래스 에서 파생되었는지를 지정하고 클래스에 포함할 프로퍼티와 메서드를 정의한다. 새로운 클래스에 대한 기본 구문은 다음과 같다.
class 새로운 클래스 이름: 부모 클래스 { // 프로퍼티 // 인스턴스 메서드 // 타입 메서드 } 선언부의 프로퍼티 부분은 이 클래스 내에 포함될 변수와 상수를 정의하며, 스위프트에서 변수나 상수를 선언할 때와 동일한 방법으로 선언된다. 은행계좌에 대한 클래스를 생성하며 기본 개념을 공부해보자.
class BankAccount { } - 클래스 이름을 지을 때 규칙은 각 단어의 첫 번째 문자를 대문자로 선언한다는 것이다. 예를 들어, UpperCamelCase처럼 말이다. 이와 대조적으로 프로퍼티 이름과 함수의 이름은 lowerCamelCase처럼 첫 번째 문자를 소문자로 한다.
클래스에 인스턴스 프로퍼티 추가하기
객체지향 프로그래밍의 핵심 목적은 데이터 캡슐화라는 개념이다. 데이터 캡슐화의 기본 개념은 클래스에 저장되고 접근될 수 있는 데이터는 오직 해당 클래스 내에 정의된 메서드만을 통해서 된다는 것이다.
클래스 내의 캡슐화된 데이터를 프로퍼티 또는 인스턴스 변수라고 한다.
BankAccount 클래스의 인스턴스는 은행 계좌 번호와 계좌에 남은 잔고 데이터를 저장하게 될 것이다. 프로퍼티는 스위프트에서 변수나 상수를 선언할 때와 동일한 방법으로 선언되므로 다음과 같이 변수들을 추가할 수 있다.
class BankAccount { var accountBalance: Float = 0 var accountNumber: Int = 0 } - 프로퍼티를 정의했으니 이제 데이터 캡슐화 모델에 충실하면서도 우리가 만든 프로퍼티를 가지고 작업을 할 수 있는 클래스의 메서드를 정의하자.
메서드 정의하기
본질적으로 클래스의 메서드는 클래스의 성격에 맞는 특정 작업을 수행하기 위해 호출되는 코드 루틴이다.
- 메서드는 타입 메서드와 인스턴스 메서드의 서로 다른 두 가지 형태로 나뉜다. 타입 메서드는 클래스 레벨에서 동작(예: 클래스의 새로운 인스턴스 생성하기)한다. 반면, 인스턴스 메서드는 클래스의 인스턴스에 대한 작업(예: 두 개의 프로퍼티 변수에 대한 산술 연산을 하고 결과를 반환)만 한다.
잘 하다가 갑자기 또 앞이 깜깜해진다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋ GPT 호출!
| 용어 | 쉽게 말하면 | 비유 |
|---|---|---|
| 클래스 | 설계도 | 건축 도면 |
| 인스턴스 | 클래스로 만든 실체 | 지어진 실제 건물 |
| 객체 | = 인스턴스 (같은 말) |
- Swift에선 클래스를 먼저 만들고, 그걸 기반으로 인스턴스를 생성해서 사용한다.
class BankAccount { var accountBalance: Float = 0 var accountNumber: Int = 0 } // 인스턴스 생성(객체 생성) let myAccount = BankAccount 데이터 캡슐화란?
클래스 안에 데이터(=프로퍼티)를 넣고 그 데이터는 클래스 내부에서만 다룰 수 있게 막는 것!
class BankAccount { var accountBalance: Float = 0 func deposit(amount: Float) { accountBalance += amount } func withdraw(amount: Float) { accountBalance -= amount } - 외부에서 직접 balance를 막 건드리지 않고, deposit, withdraw 같은 메서드를 통해서만 조작!
타입 메서드 VS 인스턴스 메서드
| 메서드 종류 | 선언 방식 | 언제 사용함? |
|---|---|---|
| 인스턴스 메서드 | func | 객체 하나하나에 대해 동작 |
| 타입 메서드 | static func 또는 class func | 전체 클래스 단위에서 동작 |
class BankAccount { static var bankName = "Swift Bank" // 타입 프로퍼티 var accountBalance: Float = 0 func deposit(amount: Float) { accountBalance += amount } static func printBankName() { print(bankName) } } let acc = BankAccount() acc.deposit(amount: 100) // 인스턴스 메서드 BankAccount.printBankName() // 타입 메서드 정리
- 클래스는 객체를 찍어내는 설계도
- 인스턴스 = 클래스 기반으로 만들어진 하나의 실체
- 객체는 속성(프로퍼티)과 행동(메서드)로 구성됨
- 메서드는 인스턴스 메서드와 타입 메서드로 나뉨
- 캡슐화는 데이터 보호를 위한 원칙("무조건 메서드를 통해 다뤄!")
메서드 정의하기(재도전)
- 메서드는 타입 메서드와 인스턴스 메서드의 서로 다른 두 가지 형태로 나뉜다. 타입 메서드는 클래스 레벨에서 동작(예를 들어, 클래스의 새로운 인스턴스 생성하기)한다. 반면, 인스턴스 메서드는 클래스의 인스턴스에 대한 작업만 한다.
- 인스턴스 메서드는 자신이 속하게 될 클래스의 여는 괄호와 닫는 괄호 안에 선언되며, 표준 스위프트 함수 선언 구문을 사용하여 선언된다.
- 타입 메서드는 인스턴스 메서드와 동일한 방법으로 선언되지만, 선언부 앞에 class 키워드가 붙는다는 점이 다르다.
[[0730 개발 공부하다가...]]
도대체 객체지향이 뭘까?
객체지향(Object-Oriented-Programming)은 간단히 말하면, 현실 세계의 사물을 프로그래밍에 반영하는 방식이다.
쉽게 말해 객체지향은 데이터(속성)와 그 데이터를 다루는 기능(메서드)을 하나의 객체로 묶어서 프로그램을 구성하는 방식. 예를 들어, 자동차를 프로그래밍으로 표현한다고 하면!
class Car { var color: String var speed: Int func drive() { print("주행 중!") } func brake() { print("브레이크 작동!") } } - 속성: color, speed
- 기능: drive(), brake()
- 자동차는(Car) 하나의 객체로 정의되고, 우리는 Car()을 이용해 이 객체를 계속 만들 수 있다.
Car() 이걸 보니 꼭 함수를 실행하는 거랑 비슷하게 생겼다.
왜 객체지향을 쓰는 걸까?
- 현실 세계와 유사한 사고방식
- 사람, 고양이, 커피머신 등등을 객체로 모델링할 수 있다.
- 코드 재사용성(재활용 가능)
- class나 struct로 만든 객체는 계속 재사용이 가능하다.
- 유지보수가 가능
- 기능별로 객체를 분리해 관리하기에 고치기 쉽다.
- 협업에 좋음
- 역할별로 클래스를 나눠 각자 작업이 가능하다.
객체지향의 4대 특징
- 캡슐화: 속성과 메서드를 하나로 묶고, 외부에서 접근 못하게 숨기는 것(private)
- 클래스에 저장되고 접근될 수 있는 데이터는 오직 해당 클래스 내에 정의된 메서드만을 통해서 된다.
- 클래스 내의 캡슐화된 데이터를 프로퍼티 또는 인스턴스 변수라고 한다.
- 상속: 기존 클래스의 속성과 기능을 물려받아 새로운 클래스를 만드는 것.
- 다형성: 같은 함수 이름이지만, 상황에 따라 다르게 작동함(오버라이딩, 프로토콜 등)
- 추상화: 핵심만 드러내고, 불필요한 것은 숨김
메서드 정의하기
본질적으로 클래스의 메서드는 클래스의 성격에 맞는 특정 작업을 수행하기 위해 호출되는 코드 루틴이다.
메서드는 타입 메서드와 인스턴스 메서드의 서로 다른 두 가지 형태로 나뉜다.
- 타입 메서드: 클래스 레벨에서 동작(예를 들어, 클래스의 새로운 인스턴스 생성하기)
- 인스턴스 메서드: 클래스의 인스턴스에 대한 작업(예를 들어, 두 개의 프로퍼티 변수에 대한 산술 연산을 하고 결과를 반환하는 것)만 한다.