- 처음부터 다시 개념을 확실히 하도록 하는 차원에서 객체 지향의 개념에 대해 정리해보도록 하겠다.
1. 객체 지향의 역사
- 객체 지향 이전 : C언어와 같이 실행하고자 하는 순서대로 명령어를 입력해서 실행되는 "절차 지향 언어"가 주를 이룸
-> 점점 프로그램의 복잡도(ex. GUI의 발전)가 증가하면서 유지 보수, 개발 기간에서 비효율이 발생하였다
- 객체 지향 이후 : 객체 지향의 특성인 추상화, 상속, 은닉, 재사용, 인터페이스등 여러 곳에서 객체지향을 활용해 개발.
- 객체 지향의 특징
: 현실에 존재하는 사물을 있는 그대로 모델링하여, 이들의 행위와 속성을 정의하고, 객체가 중심이 되어 실제 사물이 동작하는 방식으로 설계하기 시작하였다.
사물 -> 객체 (Object), 사물이 하는 행위 -> Method, 사물이 갖는 속성 -> 변수 ( Variable)이라고 정의한다.
-> JAVA는 어떠한 운영체제에서도 JVM만 존재하면 독립적으로 실행될 수 있도록 설계가 되어있어, 여러 플랫폼에서 호환성 제공 : C++가 갖고 있는 시스템 레벨 접근, 메모리 직접 할당및 해제, 포인터와 같은 복잡한 개발 방식 사용 X
2. 객체는 어떻게 설계하는가 ?
- 객체의 세가지 요소
1) 상태 유지 ( 객체의 상태)
: 객체는 상태 정보를 저장하고, 유지되어져야 하며, 이러한 속성은 변수로 정의되어야 한다. 이러한 속성값이 바뀜으로 인하여 객체의 상태가 변경될 수 있어야 한다.
2) 기능 제공 (객체의 책임)
: 객체는 기능을 제공해야한다. -> 이 부분은 Method를 제공함으로써 이뤄진다.
-> 이 부분은 캡슐화와 연관이 있으며, 외부로부터 직접 속성에 접근하여 변경하는 게 아닌 객체가 제공하는 Method로 기능이 제공되어야 한다.
3) 고유 식별자 제공 ( 객체의 유일성 )
: 각각의 객체는 고유한 식별자를 가져야 한다.
-> 카드번호, 계좌번호, 자동차 번호와 같은 속성을 통해서 각각 고유한 값을 줄 수 있으며, 이후 이는 DB에서 Primary Key,혹은 Unique key로 작성이 가능하다,
3. 물리 객체와 개념 객체
1) 물리 객체 : 실제로 사물이 존재하며, 이를 클래스로 정의한 객체를 의미한다.
ex) 자동차 렌탈 시스템 : 자동차, 고객, 직원, 작업장, 정비소...
2) 개념 객체 : 웹 시스템에서 service에 해당하며, 비즈니스 로직을 처리하는 부분을 의미한다.
-> 비즈니스 로직에서는 여러 객체를 상호작용하도록 하며, 객체가 제공하는 method를 통해 객체의 상태를 변경한다.
EX) ATM 시스템 : 사용자의 action에 따라 계좌(객체) 의 잔고 속성을 변경하는 입/출금 처리
사용자 관리 시스템 : 사용자 객체의 마지막 접속일자를 이용하여 탈퇴/휴면 처리...
- 객체지향에서의 대부분의 코딩은 각 객체의 기능을 정의하고, 이를 비즈니스 로직을 처리하는 service에서 객체의 method를 활용하여 객체의 속성을 변경하는 작업이 주된 목적이다.
-> 이러한 작업을 위해서는 객체의 속성이나 method를 잘 정의해야 한다.
4. 객체지향의 4대 특성
1) 캡슐화 (Encapsulation)
: 캡슐화는 객체의 속성(변수)를 보호하기 위해 사용한다.
-> 컴퓨터의 전원을 켜기 위해 메인보드를 직접 건드리는게 아니라 전원 버튼을 눌러서 상태를 변경하는 것과 비슷하다고 볼 수 있겠다.
- 속성이 선언되었으나, 이의 상태를 변경하는 메소드가 없다면 잘못 선언된 속성이다.
(무조건 기능을 제공해야 한다.)
- 실물 객체가 가진 기능을 모두 제공해야 한다.
- 각각의 method는 서로 관련성이 있어야 한다. ( 차량 렌탈/반납 등 상대되는 기능을 제공해야 한다.)
- 객체 안의 method는 객체 자신의 속성만 처리해야 하며, 다른 객체에 정의된 속성을 직접 처리해선 안된다. -> method의 실행에 필요한 값들은 객체의 형태가 아닌 매개변수의 형태로 전달되어야 한다.
- 캡슐화의 장점?
1) 객체지향의 패러다임중 하나인 추상화를 제공한다.
-> 실제로 method가 어떻게 동작하는지는 외부에서 이해할 필요가 없고, 단순 호출만으로도 해당 기능을 실행할 수 있어 이를 통해서 객체 단위의 프로그램 설계가 가능하다.
- 재 사용성이 향상된다. ( method는 단일 객체의 상태에만 영향을 준다.)
- 유지보수의 효율성이 향상된다.
- 무결성 보장 가능. ( 주로 변수는 private, method는 public으로 선언함)
=> public method는 입력된 매개변수를 유효성을 검증한 후에 실행하는 것을 기본으로 한다.
2) 객체지향에서의 상속은, 하위 개념으로 내려갈수록 내용이 구체화되는 것이다.
- 상속의 장점
-프로그램 구조에 대한 이해도 향상
: 최상위 클래스의 구조를 보고, 하위 클래스의 동작을 이해할 수 있다.
- 재사용성 향상 : 클래스에 필요한 속성/메소드를 새로 정의하지 않고, 상속받아서 사용
- 확장성 향상 : 일관된 형태의 클래스 객체를 추가할 수 있어 간단한 프로그램 확장이 가능하다.
- 유지보수성 향상 : 각 객체마다, 자신의 메소드를 정의하고 있다면 코드 수정에서 많은 작업이 필요하지만, 상속을 사용한 경우 일관된 형태로 작성이 가능하다.
3) 다형성
: 다형성이란 하나의 개체가 여러 형태로 변화하는 것을 의미한다. 이는 오버라이딩을 통해서 가능하다.
4) 추상화
-> 객체지향에서 말하는 추상화는 모델링이다.
: 구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 재조합 하는 부분을 추상화라고 한다.
(다형성과 상속 모두 추상화에 속한다.)
'Web > Java (Spring+JSP)' 카테고리의 다른 글
Spring 핵심 원리 #3- 새로운 할인 정책/AppConfig 적용 (0) | 2021.11.12 |
---|---|
Spring 핵심 원리 #2- 주문/할인 도메인 개발 (0) | 2021.11.10 |
Spring 핵심 원리 #1- 회원 도메인 설계/개발/테스트 (0) | 2021.10.31 |
객체지향 설계의 5원칙 (0) | 2021.06.16 |
Scope이란? (0) | 2021.03.31 |