[Swift] 객체지향 프로그래밍(OOP, Object-Oriented Programming) in Swift

728x90

객체지향 프로그래밍(OOP, Object-Oriented Programming) in Swift에 대해 알아 보겠습니다.

객체지향 프로그래밍(OOP, Object-Oriented Programming) 개념


개요

객체지향 프로그래밍(Object-Oriented Programming), 줄여서 OOP, 프로그램을 어떻게 설계해야 하는지에 대한 일종의 개념이자 방법론.

  • 절차적 프로그래밍 (Procedural)
    초기 프로그래밍 방식은 절차적 프로그래밍 방식이었다. 입력을 받아 명시된 순서대로 처리한 다음, 그 결과를 내는 것뿐이라는 생각이 지배적이었다. 즉, 프로그램 자체가 가지는 기능에 대해서만 신경을 썼지, 이 프로그램이 대체 어떤 데이터를 취급하는 것인가에는 그다지 관심이 없었던 것입니다.
  • 절차적 프로그래밍의 문제점
    조금만 복잡해져도 순서도로 나타내는 것이 거의 불가능할 정도로 꼬여서 유지보수가 어려울뿐만 아니라 다른사람이 들이 보고 이해하는 것이 불가능.

이 문제를 해결하기 위해 구조적 프로그래밍을 제안하였다.
프로그램을 함수단위로 나누고 함수끼리 호출하는 구조적인 방식을 제안 하면서 이러한 위기를 벗어나게 된다. 즉, 큰 문제가 있다고 가정하면 작은 문제들로 나누워서 해결하는 하향식(Top-Down) 방식이라고도 한다.

 

하지만 이러한 구조적 프로그래밍에도 문제가 있었다.
함수는 데이터의 처리 방법을 구조화 했을뿐, 데이터 자체는 구조화 하지 못했다.

 

이를 극복하기 위해 객체 지향 프로그래밍이 등장 하였다.

 

객체 지향프로그래밍 등장
큰 문제를 작은것으로 나누는 것이 아니라, 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 객체들을 조합하여 큰 문제를 해결하는 상향식(Bottom-Up) 해결법을 도입한 것.

객체

객체를 지향한다는 프로그래밍이라는 뜻에 객체란 무엇일까?
쉽게, 말 그대로 대상을 나타내는 단어라고 생각하자.

그림과 같이 메뉴판, 손님, 바리스타, 커피들처럼 존재하거나 생각할 수 있는 것들을 객체라고 본다.
이 객체들을 통하여 각 객체와그 객체들간의 관계를 설계하는 것이 객체 지향 프로그래밍이다.

 

그런데 객체들 안에는 데이터(상태)와 메서드(행위)라는 것이 들어가있다.
예를 들어 손님이고 생각해볼때 커피를 마시고 싶은 상태이면, 커피를 주문한다라는 행위가 들어가있다.

클래스

클래스는 틀이라고 생각하세요.
객체는 클래스를 실체화 한 것이라고도 표현할 수 있다.
이제 그럼 객체를 프로그래밍으로 들여다 보겠습니다.
코드로 살펴보면 상태를 나타내는 데이터, 행위를 나타내는 메서드가 들어있다.

좀 더 자세히 생각 해볼까요?

왼쪽은 강아지의 틀이고, 속성에는 강아지의 색, 눈의 색, 몸무게, 키 등이 있고 행동에는 앉기, 흔들기, 흔들기 등의 틀을 만들어봤습니다.

class Dog {
  var color: String!
  var eyeColor: String!
  var height: Double!
  var weight: Double!

  func sit() {}
  func layDown() {}
  func shake() {}
}

강아지라는 클래스를 만들어 봤습니다.
속성에는 강아지의 색, 눈의 색, 몸무게, 키 등이 있고 행동에는 앉기, 눕기, 흔들기가 있습니다.
이것을 실체화(객체화)를 시키는 코드는 이렇습니다.

let boddy: Dog = Dog()
boddy.color = "White"
boddy.sit()

let tori = Dog()
tori.color = "brown"
tori.layDown()

boddy라는 강아지를 객체화시켜서 color는 white강아지이며 앉기를 할 수있는 강아지를 객체화 시킨것이라고 생각하면 되고, tori라는 강아지는 브라운색의 눕기를 할줄 아는 강아지입니다.


OOP의 특징

추상화, 캡슐화, 상속성, 다형성이라는 4가지의 개념이 있습니다.

  1. 추상화(Abstraction)
  2. 캡슐화(Encapsulation) : 은닉화(Information Hiding)
  3. 상속성(Inheritance)
  4. 다형성(Polymorphism)

추상화(Abstraction)

대상의 불필요한 부분을 무시하며 복잡성을 줄이고 목적에 집중할 수 있도록 단순화 시키는 것입니다. 즉, 사물들 간의 공통점만 취하고 차이점을 버리는 일반화를 통한 단순화라고 볼 수 있습니다.

-> 관심 영역 = 도메인 = 컨텍스트
-> 추상화 = 모델링 = 설계

 

캡슐화(Encapsulation)

객체 상태를 나타내는 속성 정보를 private하게 관리 하는 것.
직접적으로 속성 정보를 변경하는것 대신에, 메세지를 같은 요청을 보내어 그 응답에 의해 객체의 상태를 변경하게 된다.

class Person {
  private var location = "서울"

  private func doSomething1() {
    print("잠시 휴게소에 들려서 딴짓")
  }
  private func doSomething2() {
    print("한숨 자다 가기")
  }

  func currentLocation() {
    print("====")
    print("현재 위치 :", location)
    print("====")
  }

  func goToBusan() {
    print("서울을 출발합니다.")
    doSomething1()
    doSomething2()
    print("부산에 도착했습니다.")
    location = "부산"
  }
}

// location 속성
// goToBusan()을 메세지 보냈을때 내부적으로 어던 추가 작업을 실행
// location 서울에서 부산으로 변경
// currentLocation과 goToBusan 메서드 외에는 외부로 노출되면 안됨.
// 즉, 요청자는 무엇을 할지만 알면 되고 어떻게 될지는 몰라도 됨

let A = Person()
A.currentLocation()
A.goToBusan()
A.currentLocation()

 

상속성(Inheritance)

하나의 클래스의 특징(부모 클래스)을 다른 클래스가 물려받아 그 속성과 기능을 동일하게 사용하는 것
재사용과 확장에 의미가 있다 (상속은 수직확장, Extension은 수평 확장)

다형성(Polymorphism)

다형성이란 쉽게, 다양한 형태로 나타날 수 있는 형태라고 볼수 있습니다.
동일한 요청에 대해 각각 다른 방식으로 응답할 수 있도록 만드는 것
이와 같은 다형성의 방식으로 오버라이딩(Overriding), 오버로딩(Overloading)을 지원합니다.

 

오버라이딩(Overriding)

  • 상위 클래스에서 상속 받은 메서드를 하위 클래스에서 필요에 다라 재정의 하는 것
  • 동일 요청이 객체에 따라 다르게 응답
class Dog {
  func bark() { print("멍멍") }
}
class Poodle: Dog {
  overide func bark() { print("왈왈") }
}
class Husky: Dog {
  override func bark() { print("으르르") }
}
class Bulldog: Dog {
  override func bark() {
    super.bar()
    print("bowwow")
  }
}

var dog: Dog = Dog()
dog.bark() // 멍멍

dog = Poodle()
dog.bark() // 왈왈

dog = Husky()
dog.bark() // 으르르

dog = Bulldog()
dog.bark() // 멍멍, bowwow

 

오버로딩(Overloading)

  • 동일한 이름의 메서드가 매개 변수의 이름, 타입, 개수 등의 차이에 따라 다르게 동작하는 것
  • 동일 요청이 매개 변수에 따라 다르게 응답
func printParameter() {
  print("No param")
}

//func printParameter() -> String {   // Error
//  print("No param")
//    return ""
//}

func printParameter(param: Int) {
  print("Input :", param)
}

func printParameter(_ param: Int) {
  print("Input :", param)
}

print("=====")
printParameter()
printParameter(param: 1)
printParameter(1)

'Swift' 카테고리의 다른 글

[Swift] 접근제어(Access Control)  (0) 2019.07.20
[Swift] 프로퍼티(Property)  (0) 2019.07.19
[Swift] 구조체와 클래스  (0) 2019.07.12
[Swift] Collection Types  (0) 2019.07.12
[Swift] 열거형(Enumeration)  (0) 2019.07.12