객체 지향 프로그래밍
이라고 한다.변수
를 프로퍼티
, 함수
를 메서드
라고 한다.프로퍼티 + 메서드 = 멤버(Member)
iOS UIKit Framework는 대부분 클래스로 구현돼있음.
class Monster {
var clothes: String
var speed: Int
var power: Int
var exp: Double
init(clothes: String, speed: Int, power: Int, exp: Double) {
self.clothes = clothes
self.speed = speed
self.power = power
self.exp = exp
}
func attack() {
print("몬스터가 공격했다!")
}
}
객체
를 인스턴스
라고 한다.프로퍼티
와 메서드
에 접근할 수 있다.var easyMonster = Monster(clothes: "Orange", speed: 1, power: 10, exp: 50)
easyMonster.clothes
easyMonster.speed
easyMonster.exp
easyMonster.power
받은
클래스는 자식클래스(Sub Class)
라고 부르고, 상속을 해준
클래스는 부모 클래스(SuperClass)
라고 부른다.기반 클래스(Base Class)
라고 한다.class BossMonster: Monster {
var bossName = "끝판왕보스"
func bossUniqueAttack() {
print("보스만의 강력한 공격!!")
}
}
var boss = BossMonster(clothes: "Black", speed: 100, power: 50000, exp: 2000000)
boss.bossName
boss.clothes
: 상속받을 클래스 이름
을 작성하면 상속할 수 있다.override
키워드가 붙는다.class BossMonster: Monster {
override func attack() {
// 부모 클래스 내용도 같이 실행하고 싶을 때
super.attack()
print("보스 일반 공격!!")
}
}
func attack()
은 상속한 부모 클래스인 Moster
클래스 안에 이미 정의돼있는 메서드이다. 이때 앞에 override
를 붙이면서 자식 클래스에서 재정의하고 있다.print("보스 일반 공격!!")
은 재정의한 자식 클래스 만의 기능이지만 이때 부모 클래스의 기능도 함께 사용하고 싶은 경우, 기존 메서드의 이름 앞에 super
이라는 키워드를 붙여주면 된다.boss
를 생성하고 boss.attack()
을 실행하면 '몬스터가 공격했다!', '보스 일반 공격!!' 총 두 줄이 프린트된다.프로퍼티 선언과 동시에 초기화하는 경우
optional
타입으로 선언한다면 오류가 뜨지 않는다. 하지만 이때 프로퍼티의 값이 nil이라면 런타임 에러가 발생할 수 있으니 주의해야한다! (➡️ 옵셔널이 필요없는 경우인데 오류를 피하기 위해 옵셔널로 선언하는 경우는 피해야한다)초기화 메서드
init
키워드의 초기화 함수를 선언해줘야한다. 하지만 구조체는 초기화 함수가 자동으로 제공하기 때문에(멤버와이즈 초기화 구문(MemberWise Initializer)) 초기화 메서드를 추가적으로 구현할 필요가 없다.struct Monster {
var clothes: String
var speed: Int
var power: Int
var exp: Double
}
// 구조체는 초기화 구문 혹은 초기값 설정이 없어도 멤버와이즈 초기화 구문이 자동으로 제공되기 때문에 오류가 나지 않는다.
Value Type
으로 인스턴스를 다른 변수에 할당 후 값을 변경해줘도 주소를 전달한 것이 아니라 값만 전달했기 때문에 기존 인스턴스의 값은 변경되지 않는다. 서로 영향을 미치지 않는 독립적인 관계라고 볼 수 있다.Reference Type
으로 서로 메모리 주소를 전달한다. 따라서 인스턴스를 다른 변수에 할당 후 값을 변경해주면 같은 위치에 있는 데이터에 대한 주소를 두 변수가 공유하고 있는 것이기 때문에 두 변수의 값이 모두 변경된다.분류 | Class | Struct |
---|---|---|
Initializer(초기화) | 초기화 함수(init)을 통해 프로퍼티 초기화를 시켜주거나 프로퍼티 선언과 동시에 모든 프로퍼티를 초기화 시켜줘야한다. | 멤버와이즈 초기화 구문(Memberwise Initializer)이 자동으로 제공되기 때문에 초기값 설정 혹은 초기화 함수를 구현하지 않아도 된다. |
Type(타입) | Reference Type(참조 타입) | Value Type(값 타입) |
@IBAction func datePickerValueChanged(_ sender: UIDatePicker) {
let format = DateFormatter()
format.dateFormat = "yy년 MM월 dd일" // 21/10/20
let value = format.string(from: sender.date)
print(value)
// 100일 뒤: TimeInterval
let afterDate = Date(timeInterval: 86400 * 100, since: sender.date)
print(afterDate)
}
인스턴스 프로퍼티
, 타입 프로퍼티
, 연산 프로퍼티
, 타입 메서드
, 인스턴스 메서드
, 타입 캐스팅
, 디이니셜라이저
, 초기화 위임
등 개념 살펴보기