OOP / SOLID

미니·2023년 3월 5일
0

객체 지향

목록 보기
1/2

객체 지향 프로그래밍이란

객체 지향 프로그래밍은 프로그램을 어떻게 설계할지에 대한 일종의 개념이자 방법론이다. 이는 우리가 실생활에서 사용되는 모든 것들을 객체라고 하며, 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 구성하는 것을 말한다.

절차 지향 프로그래밍 VS 객체 지향 프로그래밍

  • 절차 지향
    • 정수기를 생각하면 조금 더 쉽게 다가오는 개념일 것이다. 정수기는 어떤 필터를 사용하여서 불순물을 걸러낼지에 대해서 많은 고민을 하게 된다.
    • 정수기 처럼 절차 지향 프로그래밍은 어떤 절차로 프로그래밍을 실행시킬 것인가에 대해서 고민하고, 프로그래밍의 중점적인 과제로 바라보는 것이라고 생각이 들었다.
  • 객체 지향
    • 우리가 일상생활에서 대화를 하기 위해서 사용되는 언어의 관점에서 바라보는 것이 조금 더 쉽게 다가 왔던 것 같다. 객체들은 개개인이 되게 되고, 각자 사람들은 대화를 하기 위해서 언어를 사용하게 된다. 이 일련의 과정을 프로그래밍에 빗대게 되면, 객체 지향이 된다고 생각하였다.
    • 즉, 각각의 사람은 하나의 객체가 되며, 어떻게 이들이 의사소통 할 수 있도록 할 것인가에 대해서 고민하는 것을 프로그래밍의 중점적인 과제로 바라보는 것이라고 생각히 들었다.

객체 지향의 특징

  1. 추상화
    • 객체들의 공통적인 특징을 도출하는 것
    • 객체 지향적 관점에서 클래스를 정의하는 것을 추상화라고 할 수 있다.
  2. 캡슐화
    • 실제고 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉화하는 것이다.
    • 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어서 관리하는 것
  3. 상속성
    • 하나의 클래스가 가진 특징을 다른 클래스가 그대로 물려받는 것
    • 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
  4. 다형성
    • 부모 클래스의 메서드와 같은 이름을 사용하여 매개변수도 같지만, 내부 소스를 재정의하는 것
    • 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라서 호출하는 것

SOLID

협력 : 객체들 간의 상호작용

책임 : 객체가 할 수 있는 행동이다. 즉, 알고 있는 것과 할 수 있는 것으로 구분될 것이다.

  • 아는 것
    • 정보를 아는 것
    • 관련된 객체에 대해서 아는 것
    • 자신이 계산 가능한 것에 대해서 아는 것
  • 하는 것
    • 객체를 생성하거나 계산을 수행하는 등 스스로 수행
    • 다른 객체의 행동을 시작
    • 다른 객체의 활동을 제어

SRP (Single Responsibility Principle)

하나의 클래스는 하나의 책임만 가져야 한다. 우리는 하나의 클래스가 어떤 일을 수행할 것인지에 대해서 결정을 하고, 이에 맞는 일을 수행하고, 이와 관련된 정보만 가지고 있을 수 있도록 해야 한다는 것이다.

OCP (Open Closed Principle)

확장에는 열려있으나 변경에는 닫혀 있어야 한다. 우리는 클래스 내의 많은 메서드를 가지고 있을 것이다. 이 메서드 내부에서 어떠한 변경이 있을 때, 사용된 모든 곳에서 변경을 해야 한다면, OCP를 잘 지키 못한 것이다.

LSP (Liskov Substitution Principle)

서브 타입은 기본 타입으로 대체 가능해야 한다. 즉, 자식 클래스는 부모 클래스로 대체 될 수 있어야 한다는 것이다. 서브 클래스는 부모 클래스를 상속하고 역할을 모두 수행하면서 추가적인 기능을 수행을 하게 될 텐데, 부모 클래스를 대신 사용하여도 프로그래밍의 잘못된 동작이 없어야 한다.

ISP (Interface Segregation Principle)

클래스 내에서 사용하지 않는 인터페이스는 구현하지 말아야 한다. 클라이언트 객체는 사용하지 않는 메서드에 의존해서는 안된다. 즉, 클래스가 가지는 역할보다 큰 Interface를 구현하지 말자는 의미이다. 즉, 사용되지 않는 메서드를 가지고 있는 인터페이스를 사용하는 것은 자신이 가지고 있는 역할보다 큰 책임을 가지게 되기 때문이다.

DIP (Dependency Inversion Principle)

상위 모듈은 하위 모듈에 의존해서는 안된다. 두 모듈은 추상화된 인터페이스에 의존해야 한다. 우리는 기본적으로 클래스를 생성하고, 이 클래스를 직접적으로 타입으로 선언을 하게 되는 데, 이는 상위 모듈이 하위 모듈을 직접적으로 의존하게 되는 부분이 될 수도 있다. 그렇기 때문에 추상화된 인터페이스를 통해서 서로가 인터페이스를 의존할 수 있도록 구현하여야 한다.

참고한 자료
https://medium.com/@jgj455/오늘의-swift-상식-객체와-solid-원칙-270415c64b64
http://www.incodom.kr/객체_지향
https://brownbears.tistory.com/407
https://inuplace.tistory.com/946

0개의 댓글