요리를 잘 하기 위해서는 물론 요리를 많이 하는 것이 가장 중요하지만!
그전에 요리 방법을 공부하는 것이 더 높은 수준의 요리를 만드는 방법이라고 생각한다.
그런 의미에서 OOP(객체지향 프로그래밍)를 더 잘하기 위해 이론을 한번 정리하고 가려한다.
(패스트캠퍼스 백엔드 강의 내용을 복습 겸 정리하는 글입니다.)
객체지향 프로그래밍은 1970년대에 처음 등장한 개념으로
간단하게 CLI로 사용 가능했던 절차지향적으로 개발된 프로그램들에서
시스템 복잡도와 컴퓨터 성능의 발전, GUI 프로그램들이 활성화되면서
좀 더 효율적인 프로그래밍 방식이 필요하여 대두되었다.
OOP는 실제 사물을 프로그래밍으로 옮겨와 모델링하는 것으로
사물(Object) = 속성(Variable) + 행위(Method) 로 구성된다.
C++과 Java 모두 객체지향적인 언어에 해당하나
C++이 시스템 레벨 접근, 메모리 직접 할당 및 해제, 포인터 등을
개발자가 직접 관리해줘야 함에 반해
Java는 JVM이 GC(Garbage Collection) 등의 기능을 통해 이를 자동화하여
개발자가 신경써야 할 영역을 줄였고
JVM만 맞춰 설치해주면 플랫폼에 자유로웠기에
Java가 좀 더 대중적으로 사용되었다고 한다.
(위 책의 내용은 아닙니다.)
객체에는 3요소가 존재하는데 이를 만족시키면 완전한 객체 아니면 불완전한 객체라 한다.
그 3요소는 다음과 같다.
- 상태 유지(객체의 상태)
객체는 상태 정보를 저장하고 유지해야 하며 이러한 속성은 변수로 정의되어진다.
- 기능 제공(객체의 책임 - 캡슐화)
객체는 기능을 제공해야 하며 이 부분은 메소드로 이루어진다.
상태(속성)의 변경은 속성에 직접 접근하는 것이 아니라 변경 메소드로 이루어져야 한다.
- 고유 식별자 제공(객체의 유일성)
각각의 객체는 고유한 식별자를 가져야한다.
DB의 Unique나 Primary 키 같은 식별자가 필요.
객체는 크게 물리 객체와 개념 객체로 나뉘어진다.
물리 객체 - 실제 사물로 존재(자동차, 직원, PC)
개념 객체 - Service(비즈니스 로직) : 마지막 접속일자에 따른 계정만료, 비밀번호 초기화, 재등록
객체지향의 4대 특징들을 하나하나 정리해보자면
1. 캡슐화
객체의 속성을 보호하기 위해 사용
(ex : 메인보드를 작동시키기 위해 외부 케이스의 전원 버튼 사용)
캡슐화를 위한 메소드 설계
1) 속성이 선언되었으나 이를 변경하는 Method가 없다면 잘못된 속성
2) 실물 객체가 가진 모든 기능을 제공해야 함(실무에서는 필요한 것만 구현하는 경향)
3) 각각의 Method는 서로 관련성이 있어야 함(On/Off, 등록/해지, 저장/삭제)
4) 객체의 변경은 객체 안에 있는 Method로 처리해야 하며
다른 객체를 전달받아 다른 객체에 정의된 속성을 직접 처리하면 안된다.(private)
(get 메소드 등을 통해 매개변수의 형태로 받아 사용해야 한다.)
장점
1) 추상화를 제공할 수 있다.
실제 Method가 어떻게 동작하는지를 외부에 알리지 않고 기능을 실행 할 수 있으며
이를 통해 단순 호출만으로 기능이 실행되는 객체 단위 프로그램 설계가 가능해짐
2) 재사용성 향상
캡슐화를 추구함으로써 객체의 모듈성과 응집도가 높아지고 이를 통해 재사용성이 높아짐
(전역변수의 필요성이 줄어듬으로 전역변수로 인한 에러나 고려사항이 줄어듬)유지보수의 효율성이 높아짐(일부를 변경해도 전체에 대한 영향력이 줄어듬)
무결성
getter/setter를 제외하고 이외의 public 메소드는 Validation 체크를 한 후 실행이 기본
2. 상속
상속의 효과
1. 상위 클래스의 구조를 보고 하위 클래스의 동작을 이해
2. 재사용성 향상(필요한 속성 및 메소드를 상속 받아 사용)
3. 확장성이 향상(일관된 형태의 클래스 객체 추가가 가능하여 간단하게 확장이 가능)
4. 유지보수성 향상(상위 클래스의 변경 한번으로 복수 하위 클래스들의 변경이 가능)
3. 다형성
하나의 객체가 여러 형태로 변화하는 것이 가능
같은 Method라도 수행을 다르게 하여 객체 마다의 동작(move())이 다름
이렇게 선언하지 않으면 파라미터만 다른 메소드를 오버로딩으로 계속 만들어야함
(만약 유닛이 100가지가 넘는다면... ㄷㄷ)
4. 추상화
객체지향의 추상화는 모델링
추상화 - 구체적으로 공통 부분(상위)와 특정 부분(하위)을 분리해서 재조합하는 것
OOP 이론을 공부하게 된 것은 다른 유명한 OOP 동영상을 봐도 잘 이해가 되지 않아
'더 기초적인 내용을 정리해야 하나?' 싶은 것도 있었다.
다음은 내가 찾은 OOP 관련 강의와 책들이다.
백명석님의 클린 코더스
https://www.youtube.com/playlist?list=PLagTY0ogyVkIl2kTr08w-4MLGYWJz7lNK
우아한테크세미나(우아한객체지향) - 우아한형제들 개발실장 조영호님
https://www.youtube.com/watch?v=dJ5C4qRqAgA
오브젝트 - 저자 조영호님
https://book.naver.com/bookdb/book_detail.nhn?bid=15007773
객체지향의 사실과 오해 - 저자 조영호님
https://book.naver.com/bookdb/book_detail.nhn?bid=9145968
시간 나는대로 하나씩 공부하면서 정리 해봐야겠다.
많이 도움됐어요! 감사합니다 :-) 스타유닛 예제가 확 와닿네요 ㅋㅋ