스위프트의 객체지향 프로그래밍
먼저 객체지향 프로그래밍이란 컴퓨터의 프로그램을 명령어의 목로긍로 보는 시각에서 벗어나 여러개의 독립된 단위 즉 객체들의 모임으로 파악하고자 하는 것이다
객체란?
객체(클래스 인스턴스)는 소프트웨어 구축에서 블로드로 쉽게 사용하고 재사용할 수 있는 독립적인 기능 모듈이다 객체를 구성하는 데이터 변수와 함수를 포괄적으로 클래스 멤버란고 한다
스위프트 클래스 선언하기
객체를 인스터스화하기 전에 클래스를 정의해야한다 스위프트에서 클래스를 선언할 때 새롭게 만드는 클래스가 어떤 부모 클래스에서 파생되었는지 지정한고 클래스에 포함할 프로퍼티와 메서드를 정의한다 클래스 이름의 시작은 대문자
1
2
3
4
5
class ClassName: Parentclass {
//: 프로퍼티
//: 인스턴스 메서드
//: 타입 메서드
}
프로퍼티 부분은 클래스 내에 포함될 상수와 변수를 정의, 인스턴스 메서트와 타인 메서드 부분은 이 클래스에서 호출되는 메서드들과 클래스의 인스턴스를 정의한다 타입 메서드는 클래스 레벨에서 동작( 새로운 인스터스 생성) 인스턴스 메서드는 클래스의 인스턴에 대한 작업( 두대의 프로퍼티를 변수에 대한 산술연산을 하고 결과 반환) 타입 메서드는 선언부 앞에 class 키워드 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
class Hero {
var damage: Float = 1
var hp: Float = 0
func displayHP() //: 인스턴스 메서드
{
print("HP: \(hp)")
}
class func getMaxHP() -> Float { //: 타입메서드
return 100.0
}
}
생성자 소멸자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Hero {
var damage: Float = 1
var hp: Float = 0
init(number: Float) //: 생성자
{
hp = number
}
deinit
{
//: 소멸자
}
func displayHP() //: 인스턴스 메서드
{
print("HP: \(hp)")
}
class func getMaxHP() -> Float { //: 타입메서드
return 100.0
}
}
점표기법을 통해서 변수의 값의 얻거나 프로퍼티의 값을 변경할 수 도 있다
저장 프로퍼티와 연산 프로퍼티
클래스 프로퍼티는 저장 프로퍼티와 연산 프로퍼티로 나뉜다 저장은 말 그대로 상수나 변수에 담기는 값 연산 프로퍼티는 프로퍼티의 값을 설정하거나 연산 로직에 따라 처리된 값
연산 프로퍼티는 게터를 생성하고 선택적으로 세터 메서드를 생성한다
지연 저장 프로퍼티
프로퍼티를 최초로 접근할 때만 초기화 작업을 하는것 lazy를 이용한다
1
2
3
4
5
6
7
class MyClass {
lazy var property: String = {
var result = resourceTask()
result = processData(data: result)
return result
}()
}
self 사용하기
다른 프로그래밍 언어에서 사용하는 self와 비슷하게 클래스 인스턴스에 속한 메서드난 프로퍼티를 가리킬 때 프로퍼티와 메서드 앞에 self를 사용할 수 있다
1
2
3
4
5
6
7
8
9
10
11
class MyClass {
var number = 100
func addTen() {
self.number += 10
}
func addTen2() {
number += 10
}
}
스위프트에서는 self가 기본값이라 위 메서드 2개는 같은 동작을 한다
스위프트에서 self를 사용하는 상황은 프로퍼티나 메서드를 클로저 표현식 내에서 참조할 경우이다 또는 함수의 매개변수가 클래스 프로퍼티와 동일한 이름을 가질 경우 사용한다
프로토콜
최소한의 요구사항을 정의하는 규칙들의 집합을 프로토콜이라고 한다 프로토콜은 protocol 키워드를 이용하여 선언되면 클래스가 반드시 포함해야하는 메서드와 프로퍼티를 정의한다
1
2
3
4
5
6
7
protocol MessageBuilder {
var name: String { get }
func buildMessage() -> String
}
class MyClass : MessageBuilder {
}
위 클래스는 오류가 난다 프로토콜이 요구하는 name과 메서드가 없기 때문이다
불투명 반환 타입
함수는 선언부에 결과의 타입이 포함되어야한다 특정 반환 타입을 지정하는 대신 불투명 반환 유형을 사용하면 지정된 프로토콜을 따르는 모든 타입이 반환될 수 있게한다 some 키워드를 이용해서 선언한다
1
2
3
func doubleFunc1(val: Int) -> some Equatable {
val * 2
}
스위프트에서 제공하는 표준 프로토콜 Equatable 을 따르기 위해서는 값들이 서로 동일한지 알 수 있어야 하지만 불투명 반환 타입은 모든 프로토콜에 사용될 수 있다
1
2
3
func doubleFunc2(val: String) -> some Equatable {
val + val
}
두개의 메서드는 완전히 서로 다른 구체환된 타입을 반환하지만 우리가 아는것은 Equatable 프로토콜을 따른다는 것이다 -> 실제 반환 타입을 아는것이 아니라 반환 타입의 자격에 대해 아는것이다