[Java] 객체지향
Updated: Categories: CS객체지향 프로그래밍 OOP에 대해 알아보자
객체지향
- Object Oriented Programming
- 데이터를 추상화시켜 객체를 만들고, 객체에게 책임을 위임한다. 그리고 객체가 메시지를 주고받으며 상호작용하는 방식
- 객체가 책임을 가지기 때문에 코드의 재사용성이 높고 유지보수가 용이함
4가지 특징
- 캡슐화
- 객체가 스스로 동작하는 환경을 가지며 외부에 의존하지 않는다.
- 외부의 간섭을 제한하며 정보를 은닉한다
- 추상화
- 현실 사물의 공통적인 특징을 파악하여 객체로 정의하는것
- 상위 객체로 갈수록 더 추상적임
- 상속
- 상위 개념의 특징을 하위 개념이 물려받는 것
- 다형성
- 하나의 객체가 여러 형태를 가질 수 있는것
- Overriding
5원칙
- 단일책임 원칙
- SRP(Single responsibility principle)
- 객체는 하나의 책임을 가져야 한다.
- 객체가 수정되는 이유는 그 객체에게 있어야 한다
- 개방-폐쇄 원칙
- OCP(Open/closed principle)
- 처음부터 수정은 지양, 확장은 지향하도록 설계하자
- 변경이 일어나도 기존 객체를 수정하는 것이 아닌, 새로운 객체로 확장하는 방식이어야 함
- 리스코프 치환 원칙
- LSP(Liskov substitution principle)
- 항상 상위 타입을 하위 타입으로 변경 가능해야 한다
- 부모 객체를 자식 객체로 바꿔도 문제 없어야 함 -> 자식이 부모의 원칙을 따라야한다.
Overloading
시 원칙을 위반하게 된다
- 인터페이스 분리 원칙
- ISP(Interface segregation principle)
- 인터페이스는 자신을 사용하는 클라이언트 기준으로 분리해야 한다.
- 클라이언트는 하나의 메소드를 사용하기 때문에 전체 메소드를 포함하는 인터페이스를 분리해야한다
- ex)
클라이언트3명 - 필통
=>클라이언트 1명씩 - (연필, 지우개, 샤프)필통
- 의존 역전 원칙
- DIP(Dependency inversion principle)
- 상위 모듈이 하위 모듈의 구현에 의존해서는 안된다.
- 상위 객체가 하위 객체가 변경된다해서 코드를 고치면 안됨(OCP 위반)
- ex)
자동차 - 스노우타이어
=>자동차 - (스노우타이어, ...)타이어
- 결합도를 낮추고 응집도를 높히는 것이 원칙
프로그래밍 패러다임
명령형 vs 선언형
- 명령형
- 무엇(What) 할건지를 나타내기 보다 어떻게(How)을 할 건지 설명하는 방식
- 절차지향, 객체지향 프로그래밍
- 선언형
- 어떻게(How) 할건지를 나타내기 보다 무엇(What)을 할 건지 설명하는 방식
- 함수형 프로그래밍
절차지향
- 데이터 흐름에 기반하여 작업의 진행순서대로 프로그래밍하는 기법
- 순차적인 처리가 중요하고 프로그램 전체가 연결된다
- 순서를 먼저 정하고 상위로부터 하위로 설계하므로 Top-Down 방식이다
- 장점
- 컴퓨터 작업방식과 유사하여 좀 더 빠름
- 단점
- 코드의 결합도가 매우 높다
객체지향
- 추상화를 통해 작은 객체를 만들고 객체를 조합하여 설계하는 방식
- Bottom-Up 방식이다
- 장점
- 높은 재사용성, 유지보수성
- 단점
- 설계에 많은 시간 소요
- 처리속도가 상대적으로 느림
- 일급객체 : 파라미터나 반환값으로 사용될 수 있는 객체
함수형
- 문제를 작은 문제로 나누고, 작은 문제를 해결하는 순수함수를 사용하는 방식
- 순수함수는 상태값을 가지지 않고 외부 의존성을 가지지 않는다 (side effect가 없음)
- 프로그램 실행에 영향을 미치는 영역과 미치지 않는 영역을 분리할 수 있다.
- 함수를 변수처럼 일급객체로 사용할 수 있어야한다 (lambda)
- 장점
- 높은 재사용성, 가독성, 유지보수성
- 단점
- 상태를 건드릴수 없음