개념.log/Java

객체 지향적 설계 원칙

_2J 2020. 11. 4. 23:19
OOP ( Object Oriented Programming )

 


OOP 이전의 프로그래밍 방식은?

 

- 절차적 프로그래밍 방식

입력을 받아 명시된 순서대로만 처리하고 결과를 내는 방식

 

- 구조적 프로그래밍 방식

절차적 프로그래밍 방식의 개선된 형태
프로그램을 함수단위로 나누고 함수끼리 호출하는 방식
큰 문제를 해결하기 위해 문제를 작은 단위들로 나누어 해결하는 방식
Top-Down 방식이라고도 한다.

 

- 객체 지향 프로그래밍 방식

구조적 프로그래밍 방식의 개선된 형태
큰 문제를 작게 쪼개는 것이 아니라, 작은 문제들을 해결하는 객체를 만든다.
객체들을 조합해 큰 문제를 해결하는 Bottom-Up 방식

 


 

 

OOP의 장점과 단점

 

장점

코드의 재사용성이 높아진다.
유지보수가 쉽다.
코드가 간결해진다.
단점

처리 시간이 비교적 오래 걸린다.
프로그램을 설계할 때 많은 고민과 시간을 투자해야한다.

 

 


 

OOP의 5원칙 (SOLID)

 

< Clean Code >의 저자, 로버트 마틴이 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 패더스가 SOLID라는 약어로 소개한 것!

 

S (SRP : Single Responsibility Principle)

한 클래스는 하나의 책임만 가져야 한다.

 

O (OCP : Open/Closed Principle)

확장에는 열려(Open) 있으나, 변경에는 닫혀(Closed)있어야 한다.

 

L (LSP : Liskov’s Substitution Principle)

프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.

 

I (ISP : Interface Segregation Principle)

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

 

D (DIP : Dependency Inversion Principle)

추상화에 의존한다. 구체화에 의존하면 안된다.

 

 


 

객체 ( Object )

구체적, 추상적 데이터의 단위

 

1. 객체 지향 프로그래밍 - Object oriented programming

 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드분석을 가능하게 하는 장점을 갖고 있다.

 

- 프로그램의 구현을 시간의 흐름순이 아닌 객체간의 관계와 협력을 기반으로 프로그램 하는 것

- Object oriented programming(OOP) // ( cf. 절차 지향 프로그래밍 proedural programming )

- 사용 하는 언어 : Java, C++, C#, Python, JavaScript, Ruby 등 다수

 

 

절차 지향과 객체 지향 


- 절차 지향 

 절차 지향 모델링은 프로그램을 기능중심으로 바라보는 방식으로 "무엇을 어떤 절차로 할 것인가?"가 핵심이 된다. 즉, 어떤 기능을 어떤 순서로 처리하는가에 초점을 맞춘다.

 

- 객체 지향

객체 지향 모델링은 기능이 아닌 객체가 중심이 되며 "누가 어떤 일을 할 것인가?"가 핵심이 된다. 즉, 객체를 도출하고 각각의 역할을 정의해 나가는 것에 초점을 맞춘다.


- 절차 지향 VS 객체 지향

   - 대형 프로그래밍의 경우 객체 지향이 적합 각 객체가 하는 역할이 많아도, 많은 역할을 객체로 묶을 수 있기 때문

   - 소형 프로그래밍의 경우 절차 지향이 적합 작은 기능을 객체별로 나눌 경우, 오히려 복잡해질 수 있기 때문

 


객체 지향 프로그래밍의 특징


1. 추상화(abstraction)


객체들의 공통적인 특징(기능, 속성)을 도출하는 것
객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.

(클래스가 없는 객체지향 언어도 존재 ex. JavaScript)

 

2. 캡슐화(encapsulation)


실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것,

코드가 묶여있어서 오류가 없어 편리하다.
데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신을 한다. 


3. 상속성(inheritance)

 

하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
기존 코드를 재활용해서 사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.


4. 다형성(polymorphism)


상속과 연관이 있는 개념으로 한 객체가 다른 여러형태(객체)로 재구성 되는 것

오버라이딩(Overriding) - 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
오버로딩(Overloading) - 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것


5. 동적바인딩(Dynamic Binding)


가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것.
파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 일어난다.
함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버라이딩 된 함수가 실행
프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장(다형 개념 실현)