[TIL] OOP(Object Oriented Programming)

Updated:

What is OOP?

프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체드 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법. 절차 지향언어가 말 그대로 실행 순서, 절차를 중점적으로 한다면 객체지향은 객체들의 종류와 속성 등을 중점으로 한다.


장점

• 코드 재사용이 용이
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음.


• 유지보수가 쉬움
절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 됨.


• 대형 프로젝트에 적합
클래스 단위로 모듈화 시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담이 쉽다.


단점

• 처리속도가 상대적으로 느림


• 객체가 많으면 용량이 커질 수 있음


• 설계 시 많은 시간과 노력이 필요


Characteristics of OOP

1) 클래스, 인스턴스(객체)

클래스 : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단의 속성, 행위를 변수와 메서드로 정의한 것.

인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터.


2) 추상화

image

불필요한 정보는 숨시고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것, 현실 세계에서 특정한 대상을 관찰하여 핵심적이고 특징적인 공통점들을 뽑아내는 과정이다.

물고기, 사자, 토끼, 뱀이 있을 때 우리는 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다. 이 때 동물 또는 생물이라고 묶는 것을 추상화라고 한다.

관련있는 것들을 하나로 묶는 개념적(추상적)인 주체가 바로 클래스이다.


3) 캡슐화

image

데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것, 변수와 함수를 하나로 묶는 것을 말한다. 속성과 행위들을 관련있는 것끼리 묶는다. 이 때 중요한 것은 외부에서 접근이 필요한 부분을 제외하고는 내부로 숨기는 것이다. 외부로부터 세부적인 내용을 숨기는 것을 정보 은닉이라고 한다.


4) 상속

image

상위 개념의 특징을 하위 개념이 물려받는 것이다. 기름을 먹거나 달리는 기능을 하는 자동차라는 부모 클래스가 있다. 만약 지붕이 열리는 특수한 기능을 추가하고 싶다면 부모 클래스인 자동차 클래스를 상속받고 기능을 추가하여 스포츠카를 생성한다.

코드를 재활용 할 수 있기 때문에 생산성이 높고 유지보수에 큰 도움을 준다.


5) 다형성

image

부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 재 정의하여 사용하는 것. 실제 동작은 다르더라도 개념적으로 동일한 작업을 하는 메서드에 같은 이름을 부여하여 코드의 중복을 줄일 수 있다. 오버라이딩과 오버로딩이 다형성의 대표적인 예이다.



Principles of OOP

1) 단일 책임 원칙

클래스를 설계할 때 하나의 기능만을 수행하도록 해야 하며 그 기능에 집중해야 한다는 원칙이다. 단일 책임 원책을 통해 개발하면 기능이 하나이기 때문에 책임영역이 확실하며 변경이 필요한 경우도 하나의 이유이기 때문에 코드의 가독성 및 유지보수에 유리하다.


2) 개방폐쇄의 원칙

소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 열려 있어야 하고 수정에는 닫혀 있어야 한다는 원칙이다. 확장의 비용을 극대화 시키고 수정의 비용은 최소화한다는 의미로 요구사항의 변경이나 추가 요청사항이 발생했을 시 구성요소의 수정은 없어야 하며 기존요소를 확장하여 재사용할 수 있는 설계를 하는 것을 의미한다.


3) 리스코프 치환의 원칙

부모 클래스와 자식 클래스 사이의 기능이 일관성이 있어야 한다는 원칙이다. 부모 클래스로 동작하던 프로그램이 속성 변경 없이 자식클래스로 치환되었을 때 정상적으로 동작해야 한다는 것이다. 그러므로 상위 클래스는 공통속성이나 추상화된 기능만을 가지고 있어야 한다.


4) 인터페이스 분리 원칙

클래스가 사용하지 않는 인터페이스는 구현하지 않아야 하며 의존하지 않아야 한다는 원칙이다. 클래스가 다른 클래스에 종속적일 때에는 가능한 최소한의 인터페이스만을 사용해야 한다. 큰 단위의 인터페이스는 구체적이면서 작은 단위의 역할 인터페이스로 분리해서 필요한 메서드만을 사용할 수 있어야 한다. 인터페이스를 분리하므로써 시스템의 내부 의존성을 낮춰 리팩토링 및 수정, 재배포 등을 쉽게 할 수 있다.


5) 의존성 역전의 원칙

상위 모듈이란 다른 클래스를 사용하는 주된 클래스, 하위 모듈은 사용되는 클래스를 나타낸다. 상위 모듈이 하위 모듈을 사용 할 때 직접 인스턴스를 가져다가 쓰지 말라는 원칙이다. 인스턴스를 바로 가져다가 쓸 경우 하위 모듈에 변화가 있을 때마다 상위 모듈의 코드를 자주 바꿔줘야 한다. 따라서 상위, 하위 모듈 모두 추상화된 내용에 의존해야한다. 모듈 간의 직접적인 의존을 끊고 상위 레벨 모듈에서 정의한 추상을 하위레벨 모듈이 구현하게 하는 원칙이다.