* 주관적인 생각이 포함된 글입니다.
코드스테이츠에서 배우는 내용은 개인적으로 노션으로 따로 정리하고 있었지만, 티스토리 블로그에는 섹션별 회고식으로 글을 올릴 생각이었기 때문에 굳이 올리지 않았다.
그러나 지금 이 글을 올리는 이유는??
OOP의 개념은 자바와 스프링을 하는데 있어 중요하다 생각하여 리마인드도 할겸 코드스테이츠에서 배운 내용 + 내가 알고 있는 지식까지 도합하여 다시 정리하려 한다.
아마 이후에 배우는 내용 중 또 내가 중요하다 생각하는 콘텐츠가 있다면 회고 작성할 때 말고도 이 카테고리를 계속 방문할 것 같다...
그래서 객체란?
"모든 실재하는 어떤 대상"
이때 크게 오해할 점은 모든 실재하는 어떤 대상이라하여 우리가 보고 느낄 수 있는 우산, 컴퓨터, 핸드폰과 같은 대상으로 생각할 수 있는데, 추상적인 개념, 관념, 철학같은 무형적인 것도 객체로 볼 수 있다.
따라서 객체지향은 뭐든 창조해낼 수 있는 전지전능한 신 과도 같다. 우리는 필요에 따라 두발로 움직이는 우산을 만들 수도 있을 것이다.
이러한 객체들은 자신의 역할과 책임을 다하기 위해 속성과 행위를 이용하여 다른 객체와 협력한다. 이 협력과 상호작용 속에서는 어떠한 목표를 향해 달려나가는 것이다.
객체 지향 프로그래밍
객체 지향 프로그래밍은 프로그램을 설계하는 개념이자, 방법론이다.
프로그래밍에서 필요한 데이터를 한 데 모아 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 협력과 유기적인 상호작용을 통해 특정 기능을 구성
엑셀 프로그램을 실행해야 한다는 목표를 가지고 객체 지향 관점으로 살펴보자,
사용자라는 객체는 엑셀 아이콘을 누르는 행위를 통해 컴퓨터(객체)에게 엑셀을 실행해달라는 메시지를 요청한다. 컴퓨터는 그 요청을 받고 엑셀(객체)에게 실행이 가능한 상태인지 요청을 보낸다. 엑셀은 자신의 상태를 확인하여 실행 가능한 상태인지, 실행할 수 없는 상태인지를 체크하고 그 응답을 컴퓨터에게 보낸다. 컴퓨터는 그 응답을 토대로 엑셀을 실행시키거나, 실행시킬 수 없다는 메시지를 사용자에게 전달할 것이다.
예제와 같이 객체끼리 메시지를 주고받으며 협력 하는 과정 속에 목표에 도달해 나가는 것이 객체 지향인 것이다.
그런데 왜 이렇게 복잡하게 처리를 해야할까?
각 객체는 독립적인 기능을 가지고 있기 때문에 그 자체로 유용하고 손 쉽게 재활용을 할 수 있다. 비용과 시간을 줄일 수 있기 때문이다!
위의 예제로 다시 생각을 해보자
사용자는 엑셀 말고도 다른 프로그램을 실행할 수도 있다. 이때 엑셀이라는 단어를 프로그램이라 바꿔보자.
사용자라는 객체는 프로그램 아이콘을 누르는 행위를 통해 컴퓨터(객체)에게 프로그램을 실행해달라는 메시지를 요청한다. 컴퓨터는 그 요청을 받고 프로그램(객체)에게 실행이 가능한 상태인지 요청을 보낸다. 프로그램은 자신의 상태를 확인하여 실행 가능한 상태인지, 실행할 수 없는 상태인지를 체크하고 그 응답을 컴퓨터에게 보낸다. 컴퓨터는 그 응답을 토대로 프로그램을 실행시키거나, 실행시킬 수 없다는 메시지를 사용자에게 전달할 것이다.
우리가 만약에 엑셀이 아닌 프로그램으로 설계를 해놨다면 이와 같은 흐름 속에 엑셀 말고도 여러 프로그램을 실행 시킬 수 있다. 무슨 프로그램을 실행시키든 그것이 어떤 프로그램인지만 알려주면되기 때문에 큰 수정이 필요하지 않고, 기존 객체를 재사용할 수 있으므로 시간과 비용을 절약할 수 있다.
뭐, 이런 식으로만 수정하면 되니까
Program program = new Excel();
// = new Powerpoint();
// = new LOL();
시스템을 상호작용하는 자율적인 객체들의 공동체로 보자! 수많은 객체들이 합해진 것이 시스템이다. 이것이 객체지향이 말하고 하자는 것이다. 그렇다면 객체지향의 본질을 이렇게 정의할 수 있겠다.
객체지향의 본질은 흔히 알고 있는 클래스가 아닌 객체이다.
적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것.
클래스는 단지 객체를 위한 구현 매커니즘일 뿐이다.
객체의 메모리 영역
클래스 영역(static): 정적 메모리, main()이 실행될 때, 모든 클래스, static 키워드가 붙은 클래스 변수, 클래스 메소드가 할당되는 공간으로 프로그램 종료시 소멸된다. 그렇기 때문에 프로그램이 실행중일 때는 메모리에 적재되어 있어 언제든지 접근이 가능한 것이다.
스택 영역(stack): 지역변수와, 실행되는 메서드가 생기는 공간이다. sound()라는 메서드가 실행되면 스택 영역에 스택 프레임이 하나 생기고 그 프레임 안에서는 sound()메서드에서 사용하고있는 지역변수가 담긴다. 닫는 스코프를 만나면 메서드가 종료되기 때문에 스택프레임은 사라진다. 그래서 지역변수가 스코프 내에서만 사용이 가능한 것.
힙 영역(Heap): 객체와 배열, 참조형 변수가 담긴다. 이 힙영역에 적재된 것들은 아무것도 참조하지 않고 있다면, 가비지 컬렉터에 의해서 사라지게 된다.
절차 지향 프로그래밍 vs 객체 지향 프로그래밍
이 둘은 어떻게 보면 비슷하기도 하다. 하지만 관점을 두고 살펴보면, 차이점은 명확해진다.
1. 절차 지향 프로그래밍은 위에서 아래로 내려가듯 순차적으로 흘러가는 플로우를 관점으로 보고 있다. 그렇기 때문에 유기적으로 연결되어 있다.
엑셀을 아이콘을 누르고~ 엑셀이 실행가능 한지 체크하고 ~ 실행가능하면 실행~ 아니면 안된다고 메시지 띄우기~
2. 객체 지향 프로그래밍은 시스템을 이루는 객체들이 서로에게 메시지를 주고 받는 그 관계에 관점을 두고 있다.
사용자(객체) <-> 컴퓨터(객체) <-> 프로그램(객체)
예전엔 컴퓨터 속도가 무척이나 느렸다. 때문에 오래전엔 속도가 빠른 절차 지향 프로그래밍을 했다면, 요즘엔 컴퓨터 사양이 좋아져서 속도가 느린 객체 지향 프로그래밍도 가능하다.
속도가 빠르고 느리다는 서로의 장단점을 확인할 수 있다. 이 두 방법론의 장단점을 정리해보자.
절차 지향 프로그래밍의 장단점
장점:
- 속도가 빠르다
단점:
- 유지 보수가 어렵다.
- 실행 순서가 정해져 있으므로 코드의 순서를 바꾸면 실행 결과를 보장할 수 없다.
객체 지향 프로그래밍의 장단점
장점:
- 유지보수에 용이하다.
- 코드를 재사용할 수 있다.
- 신뢰성을 높일 수 있다. (데이터를 보호할 수 있다)
단점:
- 속도가 느리다.
- 설계하는 데에 있어 시간이 많이 소요된다.
- 프로그램 용량이 크다.
나는 여태 절차 지향적인 관점으로 개발을 해왔다. 그래서 느낀건데, 유지보수가 진짜 힘들긴 했다.... 기능 하나 추가하는데도 기존 소스를 많이 건드려야 했다.. 덤으로 테스트 시간도 길어지고, 운영환경으로 배포할 때 오류가 생길까봐 조마조마했다.
정리 및 여담
각각의 객체가 독립적이기 때문에 결합도가 낮고 응집도를 높일 수 있다. 이와 같은 특징으로 확장에는 열려있고 수정에는 닫혀있는 프로그래밍이 가능하다. 이러한 객체 지향 프로그래밍의 특징이 가장 큰 장점이 아닐까 생각한다.
객체 지향 프로그래밍의 기본 요소인 캡슐화, 추상화, 상속, 다형성도 정리해야할까 고민했지만 코드 스테이츠에서 오늘 소개한 개념이 아니기 때문에 패스하기로 했다. 어떻게 해야 객체지향 프로그래밍을 유연하게 설계해야 하는지에 대한 내용도 다른 곳에 자세히 정리해뒀으니 패스하겠다~
이 4가지 개념말고도 SOLID 원칙, 디자인 패턴 등등 객체 지향 프로그래밍에서 파생된 개념들이 수두룩하다. 공부할 게 많이 남았다는 뜻이지...
오늘 콘텐츠로 이 유닛이 나온 계기로 내가 정리해뒀던 객체지향 개념에 대해서 한번 더 리마인드 할 수 있었다. 시간이 오래 걸리긴 했지만, 뿌듯한 시간이었다.
'CodeStates' 카테고리의 다른 글
[SEB BE 44] Section 3 회고록 (0) | 2023.05.09 |
---|---|
[SEB BE 44] Section 2 회고록 (6) | 2023.04.10 |
[반딧불반] GitHub TIL 시작하기 (0) | 2023.03.29 |
[SEB BE 44] Section 1 후기 (0) | 2023.03.13 |
코드스테이츠 백엔드과정 합격 후기[44기] (2) | 2023.02.02 |