티스토리 뷰

728x90
반응형

자격증(정보처리기사)공부를 하거나, 학부때 그냥 외우기만📚 했었던,
OOP(객체지향프로그래밍)을 위한 5가지 설계원칙에 대해 알아보고자 합니다!
"A = B 다" 같은 느낌 보다는,
왜 A가 B가 되는건지에 대한 이해를 목표로 잡았어요⚾️


 

Object-Oriented Programming

객체 지향 프로그래밍에 대해 정말 많고 다양한 해석들이 있어요.
(class와 instance를 붕어빵틀과 붕어빵에 비유하는 등)
저는 이것들에 대해 각각 실제의 사물과 대칭시켜 예시를 들지않고,
black box😎느낌으로 정리해 보겠습니다..!

 

 

캡슐화

하나의 프로그램을 실행시키면
그안에 무수히 많은 데이터가 있고,
그 무수히 많은 데이터를 연산하는 메서드가 있습니다.

 

이 많은 친구들을 한 공간에 넣어두면
이후, 유지보수를 할 때
코드를 짠 본인도 모르겠는, 너무 복잡한 스파게티코드가 되어버리겠죠?

 

그래서, 서로 관련있는 데이터와
그 데이터들을 연산하는 메소드끼리 묶어서 하나의 캡슐💊로 관리하는게 편할거에요!
(나중에 수정할 부분이 생기면, 그 부분과 관련있는 캡슐만 수정하면 되겠죠?😲)
이때 캡슐로 담아낸, 그 캡슐의 단위를 객체라고 표현하는 거고요!

 

가장 중요한건..!!
이 캡슐들 끼리 서로 소통(?)시키는 것입니다.
조금 유사한 캡슐들 끼리는, 공통부분을모아 상위에 추상적인 캡슐을 만들어 필요할 때 가져다 쓸(상속)수도 있고,
각 캡슐별로 하는일을 정해서 특정한 일을 분업할 수도 있고요!

 

이렇게 캡슐(객체)단위로 서로 소통시키는 프로그래밍객체 지향 프로그래밍 이라고 합니다.

 

 

⚠️주의
비유를 들다보니까, 완벽히 이거다! 라고 말할 수는 없어요😢
중요한건, 각자 특정한 일을 진행하게끔 만드는 프로그래밍이라는 거에요!!
(실제로, 캡슐화는 실제로 있는 용어이고, 제가 말한 것과 비슷하지만 조금 다르답니다😱)

 

 

객체 속성을 가져오지 말고, 객체가 일하도록 시켜라

만약, 계산을 하는 프로그램을 만들어야 하는데
각각의 객체 속성을 가져와서 만든다면..?

class String처리 {
    func number1() { ... }
    func number2() { ... }
    func operator() { ... }
}

class Operate처리 {
    func operate() { ... }
}

class main {
    let input = [사용자에게 받은 인풋]
    let number1 = String처리.number1()
    let number2 = String처리.number2()
    let operator = String처리.operator()

    let result = Operate처리.operate(number1, operator, number2)

    // result를 출력한다
    print(\(result))
}

대충 

이런 모양이 될겁니다..

 

let number1 = String처리.number1()
let number2 = String처리.number2()
let operator = String처리.operator()
let result = Operate처리.operate(number1, operator, number2)
이렇듯, 객체의 속성을 직접 가져와서 만들고 있어요!
(엉터리라 굉장히.. 민망하군요😅)

 

그리고, 각각의 역할을 나눠서 표현한다면

class String처리 {
    private func number1(input) { ... }
    private func number2(input) { ... }
    private func operator(input) { ... }
}

class Operate처리 {
    private let string = String처리(input)

    func operate() { ... }
}


class main {
    let input = [사용자에게 받은 인풋]
    let result = Operate처리(input)

    // result를 출력한다
    print(\(result))
}

정말 대충 

이런 모양이 될겁니다..

 

class main에서는 private접근제한자를가진 함수나 상수에 접근할 수 없게되는거죠!
이렇게 해주면 캡슐화의 은닉적 측면에도 좋고,
유지보수에도 시간이 오래걸리지 않겠죠?
예를들어, String처리클래스의 number1()함수명을 변경한다고 하는경우를 생각해보면 좋을거 같아요!
(근데.. 문법 표현이 너무 엉터리라 창피해요😭 참고로만 봐주세요..)




이렇게, SOLID원칙에 대한 이해를 위해 객체 지향 프로그래밍(OOP)에 대해 정리해봤어요!
다음 글에서는 단일 책임 원칙(SRP)에 대해 소개해보겠습니다!

 

이해가 안되는 부분이나, 틀린 부분이 있으면 코멘트를 남겨주세요!
피드백은 정말정말 환영입니다🎉🎉

 

Reference

Wikipedia
붱이의 멋진강의👍🏻

728x90
반응형

'Design Pattern' 카테고리의 다른 글

Delegation Pattern  (0) 2021.05.24
[SOLID] 가치와 원칙  (0) 2021.03.26
MVVM  (0) 2021.01.07
MVC  (0) 2021.01.07