안녕하세요 모각코 2일차입니다.
02. 이상한 나라의 객체
어린 아기들도 뚜렷한 경계를 가지고 함께 행동하는 물체를 하나의 개념으로 인지한다. 아기들 또한 뚜렷한 경계를 가진 객체들의 집합으로 세상을 바라보는 것이다.
객체지향과 인지 능력
많은 사람들이 객체지향을 직관적이고 이해하기 쉬운 패러다임이라고 말하는 이유는 객체지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 기본적인 인지 능력에 기반을 두고 있기 때문이다.
인간의 인지 능력은 물리적인 한계를 넘어 개념적으로 겅계 지을 수 있는 추상적인 사물까지도 객체로 인식할 수 있게 한다. 예를 들면, 오늘의 주문 내역과 내일의 주문 내역, 계좌 이체 등은 비록 물리적인 실체는 존재하지 않더라도 인간이 쉽게 구분하고 하나의 단위로 인지할 수 있는 개념적인 객체의 일종이다.
세상을 더 작은 객체로 분해하는 것은 본질적으로 세상의 복잡성을 극복하기 위한 인간의 작은 몸부림이다.
객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다.
하지만 유사성은 여기까지일 뿐이다. 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. 따라서 소프트웨어 세계에서 살아가는 객체는 현실 세계에 존재하는 객체와는 전혀 다른 모습을 보이는 것이 일반적이다.
객체, 그리고 이상한 나라
이상한 나라의 앨리스에서는 앨리스가 40cm가량의 문을 통과하기 위해 마셔라라고 써진 음료를 먹고, 케이크를 먹고, 버섯을 먹으며 키를 조절하며 우여곡절 끝에 문을 통과하게 된다.
앨리스의 키를 변화시키는 것은 앨리스의 행동이다. 앨리스가 하는 행동에 따라 앨리스의 상태가 변하게 된다.
앨리스의 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태다. 이 말의 뜻은 어떤 행동의 성공 여부는 이전에 어떤 행동들이 발생했는지에 영향을 받는다는 말이다.
앨리스의 특징은 다음과 같다.
1. 앨리스는 상태를 가지며 상태는 변경이 가능하다.
2. 앨리스의 상태를 변화시키는 것은 앨리스의 행동이다.
- 행동의 셜과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
3. 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체, 그리고 소프트웨어 나라
객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다. 그리고 소프트웨어 안에 창조되는 객체 역시 상태, 행동, 식별자를 지닌다.
왜 상태가 필요한가
객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다. 자판기에 충분한 돈을 넣지 않으념 원하는 음료를 살수 없는 것 처럼, 텔레비전 전원을 키지 않으면 채널 변경을 할 수 없는 것처럼 어떤 행동의 결과는 과거에 어떤 행동들이 일어났느냐에 의존한다.
상태를 이용하면 과거의 모든 행동의 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다. 앨리스가 과거에 어떤 행동을 했는지 모르더라도 앨리스의 키를 알면 40cm의 문을 통과할 수 있는 지 없는 지 알 수 있다.
하지만 세상 모든 것들이 객체는 아니다. 분명하게 인식할 수 있음에도 객체의 영역에 포함시킬 수 없는 것들도 존재한다. 예를 들어, 앨리스의 키와 위치는 객체가 아니다. 음료와 케이크의 양은 객체가 아니다. 이런 단순한 값들은 객체가 아니다. 단순한 값은 독립적인 의미를 갖기보다는 객체의 특성을 표현하는 데 사용된다.
앨리스가 음료를 들고 있는 상태를 그림으로 표현했다.
앨리스의 키와 위치, 음료의 양은 객체가 아닌 값이며 이때 객체의 상태를 구성하는 모든 특징을 프로퍼티라고 한다.
일반적으로 프로퍼티는 변경되지 않고 고정되므로 정적이다. 반면, 프로퍼티 값은 시간이 흐름에 따라 변화하므로 동적이다.
앨리스는 음료를 마신 뒤 키가 작아지고 문을 통해 정원으로 이동했다. 그리고 나서 음료를 버렸다. 그래서 위 그림과는 달리 아래 그림은 선으로 연결되어 있지 않다. 객체와 객체 사이의 연결을 링크라고 한다. 링크가 존재해야만 요청을 보내고 받을 수 있다.
링크와 달리 객체를 구성하는 단순한 값은 속성이라고 한다. 앨리스의 키와 위치는 단순한 값으로 표현되기 때문에 속성이다. 객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가지 종류의 조합으로 표현될 수 있다.
객체의 상태 변경은 객체의 자발적 행동에 의해 일어난다. 앨리스가 음료를 마신 뒤, 키가 작아진 것과 같이 말이다.
객체가 취하는 행동은 객체 자신의 상태를 변경시킨다. 객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수 효과를 초래한다는 것을 의미한다. 앨리스가 음료를 마시면 앨리스의 키가 작아지고, 케이크의 양이 줄어든 부수 효과를 초래했다.
상태와 행동 사이의 관계
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
객체와 다른 객체는 서로 적극적으로 상호작용하며 협력하는 객체들의 공동체에 참여하기 위해 노력한다. 협력하는 방법은 유일하게 메시지를 통해 요청을 보내는 방법이 있다. 협력 과정에서 자기 자신의 상태뿐만 아니라 다른 객체의 상태 변경을 유발할 수 있다.
객체의 행동으로 인해 발생하는 결과
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
앨리스에게 전달되는 메시지는 drinkBeverage(), 앨리스가 음료에게 전달하는 메시지는 drunken(quantity)이다. 이 메시지를 보고 앨리스의 키가 줄어든다는 것을 예상할 수 없다. 이것이 캡슐화가 의미하는 것이며 상태를 캡슐 안에 감쳐둔 채 외부로 노출하지 않는다. 자율적인 객체는 스스로 판단하고 스스로 결정하기 때문에 객체의 자율성이 높아질수록 객체의 지능도 높아진다. 그러면 협력 또한 유연하고 간결해진다.
값은 숫자, 문자열, 날짜 등과 같이 변하지 않는 양을 모델링한다. 흔히 값의 상태는 변하지 않기 때문에 불변 상태를 가진다고 말한다. 값의 상태가 같으면 두 인스턴스는 동일한 것으로 판단하고 이를 동등성이라고 한다.
객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다. 따라서 객체는 가변 상태를 가진다고 말한다. 이는 식별자를 통해 동일한 지 확인하며 판단할 수 있는 성질을 동일성이라고 한다.
객체의 특징은 다음과 같다.
1. 객체는 상태를 가지며 상태는 변경이 가능하다.
2. 객체의 상태를 변화시키는 것은 앨리스의 행동이다.
- 행동의 셜과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
3. 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
기계로서의 객체
이런 기계가 두 개 있을 때, 이 두 개가 잠시 같은 키의 값을 같고 있거나, 같은 위치를 나타내고 있다고 같은 기계라고 인식하지 않는다. 이 두 개의 기계는 행동의 순서에 따라 결과가 달라질 수 있으며 식별자로서 분별되기 때문이다.
행동이 상태를 결정한다
우리는 떄로 상태를 중심으로 객체를 바라본다.
이는 첫째, 캡슐화가 저해된다. 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되어버린다.
둘째, 객체를 협력자가 아닌 고립된 섬으로 만든다.
셋째, 객체의 재사용성이 저하된다.
따라서 객체지향의 핵심은 행동에 초점을 맞추는 것이다. 협력 안에서 객체의 행동은 결국 객체가 협력에 참여하면서 완수해야하는 책임을 의미한다. 따라서 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야한다. [책임-주도 설계(RDD)]
행동이 상태를 결정한다.
은유와 객체
추상화란 실제의 사물에서 자신이 원하는 특성만 취하고 필요 없는 부분을 추려 핵심만 표현하는 행위를 말한다.
객체지향 세계는 현실 세계의 단순한 모방이 아니다. 실제 세계의 상품과는 전혀 다른 양상을 띤다. 현실 세계와 객체 세계의 가장 큰 차이점은 현실 속 수동적인 존재가 소프트웨어 객체 속에서 구현될 때는 능동적으로 변한다는 것이다.
객체지향 속 객체는 현실에서 할 수 없는 일을 하기에 의인화라고 부르기도 한다.
이를 더 정확하게 설명할 수 있는 단어는 은유인데 은유는 실제로는 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 한 형태다.
우리의 목적은 현실 세계를 모방하는 것이 아니니 현실에 구속되지 말고 우리만의 새로운 세계를 창조하자.
짧은 느낀점
객체지향 프로그래밍이 뭔가요? 라고 물으면 뭐라고 대답하지 라고 많이 고민했었는데 객체지향이란 실생활을 모델링하려는 패러다임이며 그 안에서 중요한 것은 자신의 역할에 책임을 다하는 객체의 협력 관계를 프로그래밍하는 것이라고 답변하면 되겠다고 생각했다.
저번에 느낀점을 이렇게 작성했는데 조금 수정할 게 생겼다. 객체지향이란 현실세계를 기반으로 새로운 세계를 창조하는 패러다임이다.
이번 챕터를 읽으면서 객체의 상태를 감추는 캡슐화에 대해 좀 더 심도있게 알 수 있었던 것 같다. 그리고 객체지향 프로그래밍이라는 것이 굉장히 흥미로운 세계를 만들어가는 과정이라는 생각이 들었다.
'2023 여름 모각코 - 절개와지조' 카테고리의 다른 글
[모각코 / 230822] spring security OAuth 로그인 구현하기 (0) | 2023.08.19 |
---|---|
[모각코 / 230720] spring security 를 이용해 로그인 구현하기 (@EnableGlobalMethodSecurity) (0) | 2023.08.17 |
[모각코 / 230716] spring security를 이용해 회원가입 구현하기 (0) | 2023.08.17 |
[모각코 / 230713] spring security 기본적인 환경 설정 (0) | 2023.08.13 |
[모각코 / 230706] 객체지향의 사실과 오해 - 협력하는 객체들의 공동체 (0) | 2023.07.11 |