728x90
1. 객체 ( Object )
- 사전적으로 물건
- 각 객체마다 자기의 임무가 있다.
예) 어느 한 카페
- 카페로 들어와 주문을 하는 손님
- 손님의 주문을 받는 직원
- 커피를 만드는 직원
→ 커피를 중심으로 3명이 각자의 역할에 맞춰서 맡은 일을 한다. 손님이 없다면 주문을 받지못할 것이고, 손님이 왔는데 주문을 직원이 못받으면 커피는 만들어지지 못하고 손님은 무한히 기다리게 된다.
이렇게 객체는 상태와 역할을 가진다. 위에서와 같이 커피라는 임무가 들어왔을 때 자신의 역할을 마치고 다음 객체가 할 수 있는 상태를 만들어준다.
- 객체 지향은 데이터를 추상화시켜서 상태와 임무를 가진 객체를 통해 그 객체들 간의 상호작용을 통해 로직을 구성
2. 캡슐화 ( Encapsulation )
- 관련있는 속성과 행위들을 묶은 것
- 접근 제한자를 이용
- public, private, protected
3. 상속 ( Inheritance )
- 캡슐화된 객체들의 특징을 다른 클래스가 물려받는것
- 주문을 받는 직원이 커피 제작까지 가능(?)
4. 다형성 ( Polymorphism)
- 하나의 변수나 함수가 메세지에 따라 다른 의미로 응답하는 것
예)
→ 키보드에는 같은 네모난 버튼들이 있지만 버튼들을 눌린다고 다 같은 임무를 수행하는 것이 아니다. 버튼을 눌린다는 개념을 같지만 esc, enter, space를 누를 때 행해지는 동작은 같지 않다.
5. 추상화 ( Abstraction )
- 특정한 대상에서 핵심적으로 특징적인 공통점을 얻어내는 과정
예)
→ 손님 : 주문
→ 직원1 : 주문 받기
→ 직원2 : 커피 제작
- 추상화의 방법
- 구체적인 사물들 간의 공통점을 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것
- 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것
- 공통점을 기반으로 객체들을 묶는 것을 개념
- 심볼 : 개념을 가르키는 간략한 이름이나 명칭
- 내연 : 개념의 완전한 정의, 내연의 의미를 이용해 객체가 개념에 속하는 여부를 확인
- 외연 : 개념에 속하는 모든 객체의 집함
- 그 개념을 기반으로 객체를 분류
// 응집도(Cohension)와 결합도(Coupling)
- 모듈은 독립성이 높을수록 좋다.
- 이상적인 모듈화 : 결합도는 낮고, 응집도는 높고 → 유지보수성이 높다
- 결합도가 높은 클래스의 문제점
- 연관된 다른 클래스가 변경되면 더불어 변경이 요구된다.
- 수정하려는 클래스를 이해하기 위해 연관된 클래스를 함께 이해해야한다.
- 다른 프로그램에서의 클래스를 재사용이 어렵다.
- 응집도가 낮은 클래스의 문제점
- 이해하기가 어렵다.
- 재사용하기가 힘들다.
- 유지보수가 어렵다.
- 다른 클래스의 변화에 민감하다.
6. 스프링의 객체지향
- 경랑 컨테이너 & 자바 객체 직접 관리
- 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리
- 스프링으로부터 필요한 객체를 얻을 수 있다.
- POJO 방식의 프레임워크
- 일반적인 J2EE 프레임워크에 비해 구현을 위한 특정 인터페이스 구현 및 상속 필요 X
- 기존의 라이브러리 등 지원 용이 & 객체가 가벼움
- 제어 반전 ( IoC )
- 각각의 계층이나 서비스들 간 의존성이 존재할 경우 프레임워크가 서로 연결시켜줌
- 관점 지향 프로그래밍 ( AOP )
- 여러 모듈에서 공통적으로 사용하는 기능
- 해당 기능을 분리하여 관리 가능
- 영속성 관련 서비스 지원
- 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결 가능한 인터페이스 제공
- 높은 확장성
- 수많은 라이브러리 지원 및 라이브러리 별도 분리 용이
- OCP, DIP가 가능하면서 다형성이 되도록 지원
- DI(Dependency Injection): 의존관계, 의존성 주입
- DI 컨테이너 제공
-Reference
https://gracefulprograming.tistory.com/130
https://mangkyu.tistory.com/195
https://velog.io/@yu-jin-song/Spring-객체-지향-설계와-스프링
객체지향의 사실과 오해
'자바 스터디' 카테고리의 다른 글
Generic, Raw Type, Generic Type Eraser (0) | 2021.11.24 |
---|---|
리플렉션(Reflection) ? (0) | 2021.11.17 |
GC ( Garbage Collection ) ? (0) | 2021.11.10 |
자바의 컴파일 과정과 JVM에서 HEAP의 변화 (0) | 2021.11.03 |
JVM( Java Virtual Machine ) 이란 (0) | 2021.10.27 |