반응형
Swift 가 객체지향 프로그래밍(OOP; Object-Oriented Programming) 언어라고 했던 것 기억하나요?
지금까지 우리는 크게 생각하지 않고 .
이라는 연산자를 쓰곤 했습니다. a.b
라고 한다면, a
의 하위 속성인 b
를 언급하는 것입니다. 혹은 a.c()
처럼 a
에게 c라는 함수
를 실행시키라고 명령하기도 했죠. 그 이유를 여기서 다뤄보도록 하겠습니다. 진지하게 다루면 무척이나 심오한 영역이 될 수도 있어서, 가벼운 마음으로 설명을 들어보고 재미없거나 어렵다면 섣불리(?) 포기하시기 바랍니다.
일단 구조체(Struct)와 클래스(Class)의 코드를 한 번 살펴볼까요?
- 구조체(Struct)
struct Work {
var task: String
var hoursToDo: Int
}
var firstWork = Work(task: "강의자료 작성하기", hoursToDo: 3)
var secondWork = Work(task: "분리수거 하기", hoursToDo: 1)
- 클래스(Class)
class Student {
var name: String
var house: String
init(name: String, house: String) {
self.name = name
self.house = house
}
}
var joo = Student(name: "주정한", house: "슬리데린")
var kim = Student(name: "김민주", house: "그리핀도르")
구조체와 클래스... 엇 둘이 무척 비슷해 보이죠?
사실 이 둘은 많은 공통점을 지니고 있습니다! 어떤 공통점이 있는지 알아볼까요?
- 공통점
- 구조체와 클래스 모두 내부에 변수(프로퍼티)를 가질 수 있고
.
연산자를 통해 접근합니다.
struct Work { var task: String var hoursToDo: Int } class Student { var name: String var house: String init(name: String, house: String) { //클래스 내부에서 self 라는 키워드는 본인 스스로를 의미합니다. //init의 매개변수로 받은 name 과 프로퍼티인 name 을 구별하기 위해서 //self라는 키워드를 사용해봤습니다. self.name = name self.house = house } }
- 구조체와 클래스 모두 내부에 함수(메소드)를 가질 수 있고
.
연산자를 통해 접근합니다.
struct Work { var task: String var hoursToDo: Int func alert() { // 문자열 안에 \(변수) 로 해당 변수 값을 쉽게 끼워넣을 수 있습니다 print("\(task)가 앞으로 \(self.hoursToDo) 시간 더 해야 합니다.") // 구조체(or 클래스) 내부의 함수에서는 **self** 라는 단어로 자신의 변수, 함수에 접근합니다. // 하지만 모호하지 않은 경우엔 **self** 를 생략해도 됩니다. } } var firstWork = Work(task: "강의자료 작성하기", hoursToDo: 3) firstWork.alert() // 강의자료 작성하기가 앞으로 3 시간 더 해야 합니다. class Student { var name: String var house: String init(name: String, house: String) { self.name = name self.house = house } func introduce() { print("\(house) 기숙사에 사는 \(name) 입니다") } } var joo = Student(name: "주정한", house: "슬리데린") joo.introduce() // 슬리데린 기숙사에 사는 주정한 입니다
- 구조체와 클래스 모두 내부에 변수(프로퍼티)를 가질 수 있고
- 구조체의 특징
struct Work {
var task: String
var hoursToDo: Int
}
var firstWork = Work(task: "강의자료 작성하기", hoursToDo: 3)
var secondWork = Work(task: "분리수거 하기", hoursToDo: 1)
- 클래스의 특징
class Student {
var name: String
var house: String
init(name: String, house: String) {
self.name = name
self.house = house
}
func introduce() {
print("\(house) 기숙사에 사는 \(name) 입니다")
}
}
// 1. 클래스는 init 함수를 꼭 만들어 주어야 합니다.
var joo = Student(name: "주정한", house: "슬리데린")
// 2. 클래스를 대입하면 복제인간을 만드는 게 아니라 그냥 별명을 하나 새로 붙인다 정도
var anotherJoo = joo
joo.introduce() // 슬리데린 기숙사에 사는 주정한 입니다
anotherJoo.introduce() // 슬리데린 기숙사에 사는 주정한 입니다
joo.house = "레번클로" // 전학(?)
joo.introduce() // 레번클로 기숙사에 사는 주정한 입니다
anotherJoo.introduce() // 레번클로 기숙사에 사는 주정한 입니다
반응형
'WEB & App. > Swift' 카테고리의 다른 글
[iOS/Swift] 라면 타이머 앱 만들기 (0) | 2021.06.18 |
---|---|
[iOS/Swift] 포커 카드 뒤집기 (0) | 2021.06.18 |
[iOS/Swift] Flash App 만들어보기 (0) | 2021.06.13 |