객체지향 프로그래밍 (프로그래밍 패러다임)
클래스 : 붕어빵 틀
객체 (실제 데이터) : 각 붕어빵
class Dog { // 대문자로 시작
var name = "강아지" // 변수와 함수를 묶음으로 다룬다
var weight = 0
func sit() {
print("\(name)이 앉다.")
}
func layDown() {
print("누웠다.")
}
// 각 변수와 함수를 '멤버'라고 한다 '.' 찍어서 사용 가능
// 클래스 내의 변수 -> "속성(property)"
// 클래스 내의 함수 -> "메서드(method)"
}
var bori = Dog() // 실제 찍어낸 데이터 (객체 생성)
bori.name // 객체 속성에 접근
var choco = Dog()
choco.name = "초코" // 데이터 변경
choco.name // 변경된 데이터
클래스와 크게 다른 개념x
struct Bird {
var name = "새"
var weight = 0.0
func fly() {
print("날아간다")
}
}
var aBirt = Bird() // instance 생성
aBird.name = "참새" // instance 속성에 접근
하나하나 찍어낸 것 : 인스턴스 (실제로 메모리에 할당되어 구체적 실체를 갖춘 것)
클래스의 instance는 객체(object)라고 부른다
메모리 저장 방식의 차이 (자료 참고)
메모리 관련 내용은 따로 정리
둘 차이는 강의자료
class Dog {
// 타입만 선언한다
var name: String
var weight: Double
// 생성자 (initializer)
init(n: String, w: Double) {
name = n
weight = w
}
/* // 같은 명칭을 사용하고 싶을 때 self 사용. 일반적으로 같지 않아도 그냥 self 사용 가능하다
init(name: String, weight: Double) {
// 실제 인스턴스의 값 -> self
self.name = name
self.weight = weight
}
*/
func sit() {
print("\(self.name)이 앉았습니다") // self.name으로 사용 가능
}
}
var bori = Dog(n: "보리", w: 15.0)
bori.name // 보리
bori.weight // 15.0
var choco = Dog(n: "초코", w: 7.0)
choco.name // 초코
choco.weight // 7.0
// 동일한 코드
var dog3 = Dog.init(~~~)
var dog3 = Dog(~~~)
class Dog3 {
var name: String?
var weight: Int
init(weight: Int) {
// self.name = "강아지" // 기본값을 제시해주는 것도 가능 -> 출력 시 Optional("강아지")
self.weight = weight
}
/* // 함수 인자 자체로 초기값(기본값)을 세팅해줄 수도 있다
init(name: String = "강아지", weight: Int) {
self.name = name
self.weight = weight
}
*/
func sit() {
print("\(name)이 앉았습니다")
}
}
var dog777 = Dog3(weight: 10)
dog777.name // nil (값이 없어도 상관은 없지만 nil로 초기화가 된다.)
dog777.weight // 10
// 도서 관리 프로그램
class Book {
var name: String
var price: Int
var publisher: String
var author: String
var totalPage: Int
init(n: String, p: Int, pub: String, a: String, t: Int) {
self.name = n
self.price = p
self.publisher = pub
self.author = a
self.totalPage = t
}
var book1 = Book(n: "스위프트", p: 30000, pub: "애플", a: "잡스", t: 200)
var book2 = Book(n: "코틀린", p: 25000, pub: "안드로이드", a: "봉구", t: 300)
// 영화 정보 프로그램
class Movie {
var name: String
var genre: String
var mainActor: String
var director: String
var day: String
init(n: String, g: String, m: String, d: String, day: String) {
self.name = n
self.genre = genre
self.mainActor = m
self.director = d
self.day = day
}
}
구분 | struct | class |
---|---|---|
메모리 관련 | 값 저장 in Stack 복사 전달 메모리에서 자동 제거 | 값 저장 in Heap 주소 전달 ARC로 관리 |
type | value type | reference type |
let / var | let 선언(인스턴스) -> 저장 속성이 모두 상수로 선언 | let 선언(인스턴스) -> 가르키는 인스턴스 고정 |
initializer | memberwise 자동 제공 | 편의 생성자 존재 |
property in method | 메서드 내에서 속성 변경 불가능 (단, mutating 키워드로 가능) | 메서드 내에서 속성 변경 가능 |
deinitializer | 소멸자 없음 | 소멸자 있음 |
상속 가능여부 | 불가능 | 가능 |