객체지향 프로그래밍
-> 이렇게 개념을 정의해서는 무엇인지 상상하기 상당히 어렵습니다.
가정을 해봅시다. 하나의 iOS 앱을 만드는데, 로그인 / 회원가입 / 메인 홈화면 / 상품상세화면 등 다양한 화면들이 합쳐져서 하나의 프로그램을 구성하게됩니다. 이것들을 여러명에서 구현해야하는 상황이라면, 이것들을 어떤 기준으로 업무를 나누고 어떻게 업무를 합쳐야할까요?
그리고 아주 오랜 과거에는 어떤식으로 이것들을 처리해왔을까요?
이러한 문제에 대한 답으로 "객체지향 프로그래밍" 이라는 패러다임이 시작합니다.
객체지향 프로그래밍은 실제 세계에서 아이디어를 얻어 소프트웨어에 적용한 소프트웨어 구성방식입니다. 그러므로 제가 작성할 예시도 실생활 예시로 적용해보겠습니다. 여러분들이 별다방(스벅)에 갔습니다. 그러면 점원과 고객이 둘이 마주하겠죠. 둘인 이제 객체입니다. 왜냐하면, 고객은 고객의 동작을 자신이 알아서 할겁니다. 그리고 점원은 점원 동작을 알아서 할겁니다. 분명히 서로 목적과 기능이 다르죠. 그리고 가지고 있는 자원(데이터)도 다릅니다. 이제 이 둘을 소통시켜보겠습니다.
class 고객 {
var 내돈: Int = 10000
}
class 점원 {
var 계좌: Int = 0
}
먼저 점원이 물어봅니다.
class 점원 {
var 계좌: Int = 0
func 구매진행(고객이선택한상품: String) {
if 고객이선택한상품 = "아이스아메리카노" {
if 고객과의소통.구매진행() == 4100 {
계죄 += 4100
}
} else if ...(다른상품들에대한 if절)...{ }
}
}
고객과의소통
이라는 객체입니다.protocol 고객과의소통 {
func 구매진행() -> Int
}
그러면 어떻게 고객 객체에서 이를 구현할까요?
class 고객 {
var 내돈 = 10000
}
extension 고객: 고객과의소통 {
func 구매진행() -> Int {
내돈 -= 4100 // 혹은 친구돈 혹은 부모님용돈 대출 등등 알아서 돈을 마련한다.
return 4100
}
}
위 코드를 보면, 고객과의소통이라는 한정된 메시징을 수신하게되었을 때, 구현은 고객이 알아서 처리합니다.
이렇게되면, 고객들은 알아서 자신이 돈을 구해서 돈을 전달해줄 수 있게됩니다.
근데 아직 문제가 있습니다. 어떤점원에게 돈을 줘야할지 모릅니다. 점원도 어떤 고객에게 돈을 받아야할지 모르구요.
class 고객 {
var 내돈 = 10000
func 커피사서마실래() {
let 특정점원 = 점원()
점원.대상자 = self // <-- 점원과 고객을 1:1 로 이어주기위한 코드
}
}
extension 고객: 고객과의소통 {
func 구매진행() -> Int {
내돈 -= 4100 // 혹은 친구돈 혹은 부모님용돈 대출 등등 알아서 돈을 마련한다.
return 4100
}
}
고객측에서 내가 고객임을 알려주는 코드입니다. 커피사서마실래
메소드가 호출되면, 그곳에서 고객과의소통의 고객이 자신임을 알려줍니다.
그러면 점원측에서는 대상자에게 돈을달라고해야겠죠? 뜬금없이 이미 구매하신 분에게 돈을 달라고 하면 안되니까요.
class 점원 {
var 계좌: Int = 0
var 고객: 고객과의소통 // <-- 추가된 코드
func 구매진행(고객이선택한상품: String) {
if 고객이선택한상품 = "아이스아메리카노" {
/* 이전 코드 */
// if 고객과의소통.구매진행() == 4100 {
// 계죄 += 4100
// }
/* 변경된 코드 */
if 고객.구매진행() == 4100 {
계좌 += 4100
}
}
}
}
추가된코드를 보면, 대상자를 받고 있고, 대상자는 고객과의소통이라는 프로토콜로 엮여있습니다. 이렇게되면 고객과의소통을 메시징을 주고 받을 고객이 자신이라고 고객이 말해주면, 점원과 매칭이 되는겁니다.
이제 상품도 전달해보겠습니다.
protocol 고객과의소통 {
func 구매진행() -> Int
func 상품전달(상품: String)
}
class 고객 {
private var 소지품 = [String]()
...
}
extension 고객: 고객과의소통 {
func 구매진행() -> Int { ... }
func 상품전달(상품: String) {
소지품.append(상품)
}
}
private
라는 접근제한자가 키워드로 붙었습니다. 현실세계로 생각해보면 당연합니다. 왜냐하면 고객 소지품은 고객만 건들이지 점원이 건들이면 안되니까요.class 점원 {
var 계좌: Int = 0
var 고객: 고객과의소통 // <-- 추가된 코드
func 구매진행(고객이선택한상품: String) {
if 고객이선택한상품 = "아이스아메리카노" {
if 고객.구매진행() == 4100 {
계좌 += 4100
고객.상품전달(상품: "아이스아메리카노") // <-- 추가된 코드
}
}
}
}
정리하자면, 아래 순서와 같습니다.
cf)
글을 잘 쓰시네요 :) 적절한 비유 귯!!bb