ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OOP] 객체지향프로그래밍 기초
    객체지향프로그래밍 2023. 8. 13. 18:41

    OOP의 개념


    객체지향 프로그래밍 (Object Oriented Programming)은 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다. (출처 - 나무위키)

     

    class Person {
        private let id: String
        var name: String
        func eat(food: Food) { }
    }
    
    let hogumachu = Person(id: 1, name: "hogumachu")

    hogumachu 라는 객체를 만들었고 이는 Person 클래스의 인스턴스입니다.

    - id, name은 속성(property, 프로퍼티)

    - eat(food)는 메소드(method)

     

    OOP의 핵심


    OOP의 핵심 개념으로는 추상화, 캡슐화, 상속 그리고 다형성이 있습니다.

     

    추상화

    OOP는 현실세계에 있는 사물을 프로그래밍에 녹인 것입니다.

    현실 세계의 사람

    현실 세계의 사람을 프로그래밍에 1:1로 구현하는 것은 사실상 불가능합니다.

    너무 많은 요소가 필요하기 때문입니다.

    그래서 프로그래밍에서는 실제 객체를 '추상화'를 통해 필요한 속성메소드만 뽑아옵니다.

    프로그래밍에서의 사람

    사람의 고유값인 주민등록번호 그리고 이름이라는 속성을 가져왔고 먹기라는 메소드만 뽑아왔습니다.

    (상황에 따라 뽑아오는 속성과 메소드는 달라집니다)

     

     

    캡슐화

    캡슐화는 알약을 생각하면 편합니다.

    캡슐화

    알약을 먹을 때 알약을 열어서 먹지 않습니다. 그냥 캡슐 그대로 삼킵니다.

    알약은 내부에 있는 약(알약 성분)을 숨기고 겉에 있는 캡슐만 노출합니다.

    즉 캡슐화는 객체 내부에 있는 속성과 메소드를 숨기고 필요한 부분만 노출합니다.

     

     

    캡슐화 예제

    그림과 같은 상황을 보면 왼쪽은 명령을 내리는 사람이고 오른쪽은 개발자입니다.

    명령을 내리는 사람이 순서가 다르게 얘기했을 때는 오류가 생길 수 있습니다.

     

     

    캡슐화 예제

    실제로 명령을 내리는 사람은 개발자가 무슨 일을 어떻게 진행하는지 알 필요가 없습니다.

    단순히 개발을 하라는 명령만 내리면 개발자는 알아서 개발을 하면 됩니다.

     

    class Developer {
        func develop() {
            research()
            plan()
            code()
            debug()
        }
        private func research() { }
        private func plan() { }
        private func code() { }
        private func debug() { }
    }

    위 예시처럼 Developr는 develop()이라는 메소드만 노출되어 있습니다.

    개발자가 개발을 할 때 어떤 일을 하는지 알 필요 없이 develop()을 호출하면 됩니다.

     

     

    상속

    클래스의 특징 중 하나인 상속입니다.

    클래스는 상속을 통해 계층 구조로 구성될 수 있습니다.

     

    class Person {
        var name: String
        func eat(food: Food) { }
    }
    
    class Worker: Person {
        func work(task: Task) { }
    }
    
    class Developer: Worker { }
    
    class Designer: Worker { }

    상속 예시

    예시처럼 Person이라는 클래스를 Worker가 상속을 받습니다.

    Person은 Worker의 부모 클래스이고 Worker는 Person의 자식 클래스입니다.

    (Worker-Developer -> 부모-자식 클래스 / Worker-Designer -> 부모-자식 클래스)

    let developer = Developer()
    developer.eat(food: food) // Ok
    developer.work(task: task) // Ok

    developer는 Person의 eat(food)도 할 수 있고 Worker의 work(task)도 할 수 있습니다.

    자식 클래스가 부모 클래스의 특성이랑 기능을 그대로 물려받습니다.

    따로 코드를 작성하지 않아도 부모 클래스의 기능을 사용할 수 있습니다. (코드 재사용)

    만약 일부 변경을 하려면 override를 통해 변경할 수 있습니다.

     

     

    다형성

    다형성은 다양한 자료형(type)을 가능하도록 하는 것입니다.

    하나의 변수 또는 함수가 상황에 따라 다른 의미로 해석될 수 있습니다.

    let workers: [Worker] = [Developer(), Designer()]
    
    workers.forEach { $0.work(task: task) }

    위의 예시를 보면 workers 배열 안에는 Worker를 만족한 값들이 들어가 있습니다.

    다형성 예시

    일을 시키는 사람은 해당 값이 어떤 것인지 상관없습니다. 그저 일(work)을 할 수 있으면 됩니다.

     

    Swift에서는 Protocol (다른 언어에서는 interface)을 통해 위와 다형성을 가능하게 합니다.

    protocol Runner {
        func run()
    }
    
    class Person: Runner {
        func run() { }
    }
    
    class Cat: Runner {
        func run() { }
    }
    
    let runners: [Runner] = [Person(), Cat()]
    runners.forEach { $0.run() }

    다형성+Protocol 예시

    Person도 Cat도 Runner 프로토콜을 준수함으로 runners 배열에 할당할 수 있습니다.

     

    정리


    OOP - 객체로 묶고 이들이 서로 상호작용

    추상화 - 현실 세계의 객체를 프로그래밍으로 가져올 때 필요한 것만 가져옴

    캡슐화 - 외부에 노출할 것만 노출하고 나머지는 숨김 (정보 은닉)

    상속 - 클래스를 상속받아 부모 클래스의 속성 및 기능을 물려받음 (코드 재사용)

    다형성 -  다양한 자료형을 가능하도록 함 (특정 조건만 만족하면 OK)

     

     

    마무리


    프로그래밍 설계에서 중요한 OOP의 기초에 대해 알아봤습니다.

     

    읽어주셔서 감사합니다.

     

    참고


    https://namu.wiki/w/객체%20지향%20프로그래밍

    '객체지향프로그래밍' 카테고리의 다른 글

    [OOP] SOLID 원칙 for iOS  (0) 2024.03.02
Designed by Tistory.