2022. 4. 3. 21:02ㆍJava/Java
등장
C 언어 처럼 실행하고자 하는 순서대로 명령어 실행 -> 절차 지향 -> 절차 지향 언어라고 불림
대체적으로 간단한 로직을 순차적으로 처리하여 결과를 얻는데 -> 컴퓨터가 발전함에 따라 복잡도가 증가하고 유지 보수나 개발 기간 등 여러 방면에서 비 효율적이라 판단되었다.
이를 대체 하기 위해 효과적인 방식으로 개발을 하기 위해 객체 지향 개발 방법이 설계되었다.
특징
- 추상화
- 상속
- 은닉
- 재사용
- 인터페이스
여러 곳에서 객체 지향으로 개발을 시작한다.
현실에 존재하는 사물을 그대로 모델링해 행위와 속성을 정의하고, 실제 사물이 동작하는 방식으로 설계
- 사물 == Object
- 사물이 하는 행동 == Method
- 사물이 지닌 속성 == Variable
객체의 3가지 요소
3 가지를 유지해야 하고, 이를 유지 못 하면 불안정한 상태라고 불림
- 상태 유지 : 상태 정보를 저장하고, 유지 되어야 하며 이러한 속성은 변수로 정의
- 기능 제공 : 객체는 기능을 제공, Method의 제공으로 이뤄짐 -> 캡슐화와 연관이 있고 외부로 부터 직접 속성에 접근해 변경 하는 것이 아닌 객체가 제공하는 Method로 기능 제공
- 유일성 : 고유한 키를 가진다. DB의 Primary Key와 동일
물리 객체
실제로 사물이 존재하고, 이를 클래스로 정의한 객체를 의미
개념 객체
실제로 존재하는 것이 아닌 객체, Spring Framework에서는 Service에 해당한다. 즉, 로직을 처리하는 부분이다.
여러가지 객체와 상호작용 하도록 하고 객체가 주는 오퍼레이션 Method를 통해 객체의 속성을 변경시킨다.
객체 지향의 4대 특성
캡슐화
객체의 속성을 보호하기 위해 만들어진 것
Method 설계
- 속성이 선언 되었으나, 상태를 변경하는 method가 없다면 잘못 선언된 것 -> 자기 자신을 변경하는 기능이 필요
- 물리 객체가 가진 기능 모두 제공
- 각 Method는 서로 관련이 있어야 한다.
- 객체 안의 Method는 객체 안의 속성을 처리해야 하며, 다른 객체를 전달 받아 해당 다른 객체에 정의 된 속성을 직접 처리하면 안 된다.
Method의 실행에 필요한 값은 매개변수 형태로 전달 되어야 한다.
종류 예시
- Getter / Setter Method
- CRUD Method
- Business Logic Method
- Lifetime Method
- private Method
1개만 속할 필요 없이 여러가지로 가능하다.
장점
- 추상화를 제공한다. -> 이해 X, 단순 호출만으로 기능 실행
- 재 사용성 향상
- 유지 보수의 효율성이 향상
- 무결성 보장 -> 변수는 private, Method는 public 선언
상속
객체지향의 상속은, 속성의 상속이 아닌, 하위로 내려갈 수록 구체화 되는 것이다.
효과
- 이해도 향상 -> 최상위 구조를 통해 하위 이해 가능
- 재 사용성 향상
- 확장성 향상
- 유지 보수성 향상
다형성
하나의 개체가 여러 개의 형태로 변화하는 것, 다형성을 하기 위해서 Overriding 해야한다.
추상화
모델링과 같다.
공통적인 부분, 또는 특정 특성을 분리해서 재조합 하는 부분이 추상화이다.
다형성, 상속 모두 추상화에 속한다.
객체 지향 설계 5원칙
응집도 & 결합도
좋은 SW는 낮은 결합도와 높은 응집도를 보여준다.
- 결합도 : 클래스 간의 상호 의존 정도를 나타내는 지표, 결합도가 낮으면 클래스 간의 의존성이 줄어 재사용 및 유지보수 유리
- 응집도 : 하나의 클래스에 존재하는 구성 요소들의 기능적 관련성, 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져, 재사용 및 유지보수 유리
SRP (Single Responsibility Principle) 단일 책임 원칙
어떠한 클래스를 변경해야 하는 이유는 한가지의 이유일 때이다.
OCP (Open Closed Principle) 개방 폐쇄 원칙
자신의 확장에는 열리고, 주변의 변화에는 닫혀야 한다.
상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신의 변화는 폐쇄적이지만, 인터페이스는 외부의 변화에 대해 개방적이어야 한다.
JDBC, Mybatis, Hibernate 또는 자바의 Stream 함수에서 볼 수 있다.
LSP (Liskov Substitution Principle) 리스코프 치환 원칙
서브 타입은 언제나 자신의 상위 타입으로 교체 할 수 있어야 한다.
ISP (Interface Segregation Principle) 인터페이스 분리 원칙
클라이언트는 자신이 사용하지 않는 Method에 의존 관계를 맺으면 안된다.
만약, 프로젝트 요구 사황과 설계에 따라 SRP나 ISP를 선택해야 한다.
DIP (Dependency Inversion Principle) 의존 역전 원칙
자기 보다 변하기 쉬운 클래스에 의존 하면 안된다.
'Java > Java' 카테고리의 다른 글
자바 자료 구조 : 큐 - Queue (0) | 2022.06.27 |
---|---|
자바 자료 구조 : 배열 - Arrays & ArrayList (0) | 2022.06.27 |
[Java] BufferedWriter와 System.out.print (0) | 2022.02.09 |
[Java] 입출력 - BufferedReader와 Scanner (0) | 2022.02.07 |