객체 지향 프로그래밍(Object Oriented Programming, OOP)이란?
개념
객체 지향
컴퓨터 프로그램을 독립된 단위인 객체의 모임으로 파악
각 객체는 메시지, 데이터 처리 등의 활동이 가능하다
프로그램은 객체로 이루어져 있으며, 각 객체는 데이터와 메서드(행위)를 가진다
OOP는 객체들의 유기적 관계를 통해 프로세스가 진행된다(각각의 처리활동을 통해)
객체: 객체 또는 인스턴스. 변수와 메서드로 구성
클래스: 객체를 만드는 설계도
인스턴스: 클래스를 통해 생성된 객체
데이터: 객체의 상태를 나타내며, 객체의 속성이나 변수를 포함한다. 객체의 메서드에 의해 조작
메서드: 객체의 작업 또는 동작. 객체의 행동을 정의하고 객체 간의 상호작용을 담당하며, 데이터를 조작하고 특정 기능을 수행
절차 지향(Procedural Programming)
프로시저 호출 개념을 바탕으로 하는 프로그래밍 패러다임
프로시저?
루틴, 하위 프로그램, 서브루틴, 메서드, 함수(함수형 프로그래밍) -> 수행되어야 할 연속적인 계산 과정
절차적 프로그래밍은 소규모에 적합하며, 프로젝트 크기가 커질수록 유지보수가 어려워진다
또한 순서가 보장되어야 한다(순서가 바뀌면 결과값이 달라질 수 있다)
C언어, 포트란, Visual Basic, Pascal 등이 대표적이다
Top-Down 방식으로 설계된다
실행 속도가 빠른 장점이 있다(컴퓨터 처리 구조와 유사)
객체지향 프로그래밍(Object-Oriented Programming)
객체: 실 생활에서 사용되는 모든 것(개념과 같은 무형적인 것과, 사물과 같은 유형적인 것 모두)
객체 모델링: 현실의 객체를 SW적으로 설계하는 것
4가지 특징이 존재한다
- Abstraction(추상화): 중요 정보만 추출
- Polymorphsim(다형성): 클래스 또는 메서드가 다양한 방식으로 동작 가능(오버라이딩, 오버로딩)
- Inheritance(상속): 어떤 클래스가 가진 기능, 데이터를 다른 클래스에서 물려받는 것. 재사용성과 확장성
- Encapsulation(캡슐화): 개체의 속성(데이터)과 행위(메서드)를 묶고, 실재 구현 내용의 일부는 은닉
재사용성이 높고, 모듈화로 인해 유지 보수가 용이하다
절차지향 보다 처리 속도가 느리고, 설계 시간이 많이 소요된다
C++, C#, JAVA, Python 등이 대표적이다
Bottom-Up 방식으로 설계된다
객체지향 설계 원칙(SOLID)
단일 책임 원칙(Single responsibility principle, SRP): 한 클래스는 하나의 책임만 가져야 한다
개방-폐쇄 원칙(Open/closed principle, OCP): 소프트웨어 요소는 확장에는 열려있고, 변경에는 닫혀있어야 한다
리스코프 치환 원칙(Liskov substitution principle, LSP): 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입 인스턴스로 바꿀 수 있어야 한다
인터페이스 분리 원칙(Interface segregation principle, ISP): 클라이언트는 자신이 의존하지 않는 메서드에 의존하지 않아야 한다
의존성 역전 원칙(Dependency inversion principle, DIP): 객체는 저수준 모듈(구현된 객체)보다 고수준 모듈(인터페이스, 추상화된 객체)에 의존해야 한다