TIL 47. What is 'OOP'?

Drageon Lee·2022년 3월 15일
0

CS

목록 보기
9/9

Today's topic

Programming을 하거나 면접을 준비하면서 OOP에 대해서 들어봤던 적이 있을 것이다. OOP에 대해서 객체 지향 프로그래밍이라는 말은 하지만 그게 무엇인가? 막연하다. 이러한 막연함을 아는 내용으로 바꾸기 위해서 posting을 통해 정리해 보려한다.

👉 What is 'OOP'?

Object-Oriented Programming의 약자로 객체 지향 programming이라 한다.

풀어서 설명하면, programming에서 필요한 data를 추상화 시켜 상태와 행위를 가진 object(객체)로 만들어 그 object(객체)간 유기적인 상호작용을 통해 logic을 구성하는 것을 의미한다.

👉 What is feature of 'OOP'?

  • Pros
  1. 유지 보수에 용이하다.
    절차 지향 programming에서는 error 발생 시 수정이 필요한 부분을 위에서 부터 하나하나 전체적으로 찾아야 하는 번거로움이 있는데, 객체 지향 programming에서는 수정이 필요한 부분이 class 내에 변수나 method로 존재하기 때문에 그 부분만 수정하면 되기에 그 한 부분을 수정하면 전체적으로 반영된다는 이점이 있다.
  1. Project에 용이하다.
    객체 지향 programming에서는 class 단위로 module화 시켜서 개발이 가능하기에 다른 사람이 작성한 class를 가져와 상속을 하여 사용할 수 있기에 여러 개발자가 함께 작업하는 project에 용이하다.
  • Cons
  1. 처리 속도가 상대적으로 느리다.
    따로 따로 흩어져있는 class 및 객체들을 참고해야 하기에 위에서 부터 차례로 처리하는 절차 지향 programming에 비해 처리속도가 느리다.
  1. 객체가 커지면 용량이 커질 수 있다.
    객체로 이루어 지기에 객체가 커질 경우 memory의 용량을 많이 차지할 수 있다.

  2. 설계시 많은 시간과 노력이 필요하다.
    class에서 만들어진 객체들간의 상호작용이 있어야 되기에 서로 유기적으로 연결이 될 수 있도록 설계되어야 한다. 그렇기 때문에 시간과 노력이 필요하다.

  • 5 features
    객체 지향 programming을 나타내는 5가지 keyword가 있는데 하나씩 살펴 보자.
    1️⃣ Class & instance
    - Class : 필요한 data를 만들기 위해 추상화를 거쳐 속성(attribute)와 행위(behavior)을 가진 집단으로 묶어 변수와 method로 정의한 것. 길거리에 파는 붕어 빵을 예로 들면, 붕어 빵을 찍어내는 틀이라고 할 수 있다.
    - instance : class에 정의된 내용을 토대로 만들어져 programming에 사용되는 실제 메모리에 할당된 data를 의미한다.
    2️⃣ 추상화(Abstraction)
    만들어낸 객체들을 Class로 묶을 수 있는 공통의 특성을 취하고 차이점을 버려 일반화 시키는 것을 추상화라고 한다.
    즉, 공통의 속성이나 기능을 묶어서 명명하는 것을 의미한다.
    3️⃣ 캡슐화(Encapsulation)
    캡슐화란 객체의 속성과 행위를 하나로 묶고, 실제로 구현된 내용 일부를 외부로 부터 감추어 은닉하는 것을 의미한다.
    즉, 기능과 특성의 모음을 class 안에 넣어 캡슐화 하는 것이다.
    캡슐화에는 2가지 목적이 있다.
    - Code를 재수정 없이 재활용하는 것
    - 외부에 노출이 되어서는 안될 정보 또는 기능을 제어 권한이 있는 접근 제어자를 통해서만 제어하는 것
    4️⃣ 상속(Inheritance)
    상속은 객체들간의 관계를 구축하는 방법이다. 즉, 부모 class의 내용을 자식 class가 물려 받아 기존의 내용에 추가할 수 있는 방법이다.
    이로 인해, code를 재사용할 수 있다는 장점이 있다.
    5️⃣ 다형성(Polymorphism)
    다형성은 overriding이나 overloading을 통해 하나의 변수명이나, 함수 명이 상황에 따라 다른 의미로 해석될 수 있다는 의미이다.
    여기서 overriding은 부모class의 method와 같은 이름, 매개변수를 재정의 하는 것을 의미한다.
    Overloading은 같은 이름의 함수를 여러개 정의하고, 매개변수의 type과 개수를 다르게 하여, 매개 변수(parameter)에 따라 다르게 호출될 수 있게 하는 것을 의미한다.

👉 SOLID principle?

OOP에는 SOLID 5원칙이라는 것이 있다. 이 SOLID 5원칙은 객체 지향 programming을 하면서 지켜야하는 원칙이다. SRP, OCP, LSP, ISP, DIP의 initial을 따서 SOLID 원칙이라고 한다.
그럼 하나씩 어떤 것인지 살펴 보자.

  • SRP(Single Responsibility Principle : 단일 책임의 원칙)
    작성된 class는 하나의 기능을 가져야 한다. 하나의 기능을 가지기 때문에 변경을 할 때도 한가지 이유만 있어야 한다는 것이다.
    즉, class 설계 시 하나의 기능을 갖도록 설계해야 하며, 그 기능에 집중해야 한다는 것을 의미한다.
    만약 이 원칙이 지켜지지 않는다면, 한 책임의 변경에 의해 다른 책임과 관련된 code에 영향을 미칠 수 있다. 그러면 유지보수 시 매우 비효율적이게 된다.

  • OCP(Open Close Principle : 개방 폐쇄의 원칙)
    확장에는 열려있고 변경에는 닫혀 있어야 한다. 즉, 기존 code를 변경하지 않고, 기능을 수정하거나 추가할 수 있도록 설계해야 한다는 의미이다. 이 원칙을 지킴으로써 code 재사용 및 확장의 유연성을 높일 수 있다.

  • LSP(Liskov Substitution Principle : 리스코브 치환 원칙)
    자식 객체는 부모 객체에서 가능한 행위를 수행할 수 있어야 한다. 즉, 부모 객체와 자식 객체 사이의 기능이 일관성이 있어서 부모 객체를 자식 객체로 치환해도 정상적으로 동작해야 하는 것을 의미한다.
    이 원칙은 OCP(개방 폐쇄 원칙)과도 연관이 있다. 이 원칙을 지키지 않는다면, 기능 확장 시 여러 번의 code 수정이 필요할 것이다.

  • ISP(Interface Segregation Principle : 인터페이스 분리 원칙)
    Class는 자신이 사용하지 않을 interface를 만들지 않아야 하며 의존하지 않아야 한다. 또한 class가 다른 class에 종속적일 때는 최소한의 interface만 사용하여야 한다.
    그래서 큰 단위의 interface는 구체적이면서 작은 interface로 분리해서 class에서 필요한 method만 사용할 수 있도록 해야 한다.
    즉, 핵심은 client가 필요로 하는 interface들을 분리함으로써, client가 사용하지 않는 interface에 변경이 일어나도 영향을 받지 않는 것이다.

  • DIP(Dependency Inversion Principle : 의존 역전 원칙)
    관계를 맺을 때 변하기 쉬운 것(구체적인 것)에 의존하기 보다는 변하기 어려운 것(추상적인 것)에 의존을 해야한다. 즉, 구체화 된 class에 의존하기 보다는 추상적인 class에 의존해야 한다는 의미이다.
    따라서, 상위 level에서 정의한 추상적인 구현을 하위 level에서 구현하는 것을 말한다.

My opinion

이렇게 이번 posting에서는 OOP의 정의와 특징, 그리고 SOLID 5원칙에 대해서 정리해 보았다. 객체 지향 programming은 확장 및 독립성을 특징으로 가지는 것으로 보인다.
지금껏 Programming을 하면서 객체 지향 언어인 Python의 특성을 살려 programming을 하고 있는 지 스스로 한번 되돌아보았다. 앞으로는 이 특징 들을 잘 살려서 programming을 할 수 있도록 해야겠다.

profile
운동하는 개발자

0개의 댓글