OOP에 대한 이해

HEYDAY7·2022년 12월 8일
0

서버 관련 Background

목록 보기
9/10

절차지향 프로그래밍

간단하게 말하자면 말 그대로 순차적인 처리를 생각하는 프로그래밍이다. 컴퓨터의 작업방식과 유사하기에 처리 속도가 상당히 빠르다는 장점이 있으며, 데이터를 중심으로 함수를 구현한다.
대표적으로 C언어가 있다.

OOP, 객체지향 프로그래밍

Object Oriented Programming의 약자인 OOP는 객체지향 프로그래밍을 뜻한다. 객체 지향의 경우 기능을 중심으로 메소드를 구현한다. 이는 절차 지향과 완전히 반대되는 개념이 아니다. 다만 무엇을 중점적으로 보고 개발하느냐의 차이이다.

SOLID

OOP의 5원칙이라고 소개되고는 하는 SOLID 이다. 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원리다~ 정도로 생각해두면 좋을 것 같다.

SRP(Single Responsibility Principle) 단일 책임 원칙

각 모듈(클래스)은 하나의 책임만을 가져야 한다는 원칙이다. 이는 해당 모듈이 변경되는 이유가 하나여야 함을 뜻한다. 책임 영역을 확실히 하는 것으로 특정 코드를 변경해야 하는 시점을 정확하게 분리해 낼 수 있고, 코드를 유지보수하기 매우 용이해진다.

-> 수정이 일어날 때 특정 클래스의 비즈니스 로직 상 변경이 아니라, 외부 클래스의 구현 변경 등으로 변경되어서는 안된다.

OCP(Open Close Principle) 개방폐쇄원칙

확장에는 열려있고, 변경에는 닫혀있어야 한다는 원칙이다. 요구사항이 변경되거나 추가되었을 때 기존 코드는 수정이 최대한 일어나지 말아야 하고, 기존 코드를 확장해서 재사용이 가능해야 한다는 의미이다. 이를 달성하기 위해서 우선 코드의 핵심적인 부분을 정리하고, 바뀌는 부분과 바뀌지 않는 부분을 확실히 분리한다. 변하지 않는 부분을 기준으로 인터페이스를 만들고, 이 인터페이스를 중점으로 추가 코드를 구현하면 됩니다.

LSP(The Liskov Substitution Principle) 리스코프 치환 원칙

하위 타입이 상위 타입을 대체할 수 있어야 한다는 뜻으로, 상위 타입을 사용하던 client가 상위 타입이 하위 타입으로 바뀌어도, 상위 타입의 인터페이스에 정의된 여러 method들을 그대로 사용하는 등 문제가 없어야 함을 의미한다.

ISP(Interface Segregation Principle) 인터페이스 분리 원칙

한 클래스가 자신이 사용하지 않는 인터페이스의 경우에는 구현하지 말아야 한다는 원리이다. 즉 애매하게 공통되는 클래스들을 하나의 인터페이스로 묶지 말고, 각각의 역할에 맞게 분리된 여러 개의 인터페이스를 사용하라는 의미이다. 복잡한 인터페이스를 여러 목적에 맞게 분리하는 것으로 이뤄낼 수 있을 것이다.

DIP(Dependency Inversion Principle) 의존 역전 원칙

고수준 모듈: 변경이 없는 추상화된 클래스(or interface)
저수준 모듈: 변하기 쉬운 구현체 클래스

저수준 모듈의 변경이 고수준 모듈의 변경을 일으키는 위계관계를 끊어버리는 역전을 의미한다. 실제로 사용 관계는 바뀌진 않지만, 추상화를 통해 이를 이뤄낼 수 있다. 일반적으로 알고있는 DI라고 생각해도 될 것 같아 길게 설명을 적지는 않으려 한다. 의존성이 역전 되는 것은 컴파일 시점, 즉 소스 코드 단계. 런타임에서는 구현체에 의존하게 된다.

OOP의 특징

Encapsulation

캡슐화라고 하며, 결합도(다른 클래스와의 연결)를 낮추는데 도움을 준다. 실제 구현이 외부로 드러나지 않게 하는 것이며, 특정 변수나 함수만을 외부로 노출시킨다.

Inheritance

부모 클래스가 자식 클래스에게 자신의 특성(속성)을 그대로 물려주는 것을 의미한다. 코드의 재사용이라는 측면에서 좋으며, 서로 관계있는 클래스들이 정의됨.

Abstraction

핵심 목적에 해당 하는 코드(변수, 메소드)를 인터페이스로 분리하여 따로 표현하는 것.

Polymorphism

overriding과 overloading을 통해서 같은 형태이지만 상황에 알맞게 다른 기능을 하게 한다.

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글