훌륭한 객체지향 설계란 겉모습은 아름답지만 협력자들을 무시하는 오만한 객체를 창조하는 것이 아니라 조화를 이루며 적극적으로 상호작용하는 협력적인 객체를 창조하는 것이다. 비록 그 객체를 따로 뗴어놓고 봤을 때는 겉모습이 다소 기묘하고 비합리적이더라도 말이다. 객체의 모양을 빚는 것은 객체가 참여하는 협력이다. 협력 누가 파이를 훔쳤지? 앨리스가 재판장에 도착했을 때 하트 왕과 하트 여왕은 옥좌에 앉아 있었다. 그리고 주위에는 온갖 종류의 새와 짐승과 한 벌의 카드가 모여 있었으며 그들 앞에 파이를 훔쳤다는 혐의를 받고 있는 하트 잭이 사슬에 묶인 채 병사들의 감시를 받으며 서 있었다. 하트 잭의 옆에는 하얀 토끼가 한 손에는 트럼펫을, 다른 한 손에는 양피지 두루마리를 들고 서 있었다. 법정의 한 가운..
추상화를 통한 복잡성 극복 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다. Root-Bernstein 추상화는 복잡한 현실을 단순화하기 위해 사용하는 인간의 가장 기본적인 인지 수단 추상화란? 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법 복잡도를 다루기 위한 추상화의 두 가지 차원 첫 번째 차원: 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것 두 번째 차원: 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것 모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운..
오전에는 운동, 오후에는 집안일과 각종 잡무들을 처리하느라 많은 공부를 하지 못하였다. 백준에서 문제를 풀다가 코드가 너무 복잡해지고, 속도 또한 느리게 나오는 문제를 발견했다. 그래서 어떻게 해야할지를 고민하다가 평소에 많은 배움을 얻고 있는 Stranger-Lab님의 블로그에서 카운팅 정렬을 학습했다. 링크는 페이지 하단 참고자료란에 첨부하겠다. 카운팅 정렬(Counting Sort) 카운팅 정렬 사용 이유 시간복잡도가 O(n)으로서 엄청난 성능. 대표적인 정렬 알고리즘(퀵 정렬, 힙 정렬, 합병 정렬 등)의 평균 시간복잡도는 O(nlogn)이다. 정렬 방법 카운팅 정렬은 데이터의 값이 몇 번 나왔는지를 세는 메커니즘 array 배열 counting 배열 array를 순회하면서 해당 값을 index..
9월 30일은 세미나를 보고 정리한 내용만 올리고 오랜만에 한국으로 돌아온 친구, 타지에서 일하는 친구들이 모두 부산에 모여서 친구들을 만났고, 10월 1일은 부모님과 함께 보냈다. 번아웃으로 조금 힘든 날들을 보내고 있었는데 오랜만에 공부를 잠깐 쉬어가면서 사람들을 만나니 다시 에너지를 얻은 기분이다. 역시 공부와 휴식이 조화를 이룰 때 공부도, 휴식도 잘할 수 있는 게 맞다. 오늘은 본가에 다녀와서 짧게나마 알고리즘 문제풀이와 객체지향의 사실과 오해를 읽고 정리했다. TIL-37 시작하겠다. 백준 4949 자바(Java) 균형잡힌 세상 https://www.acmicpc.net/problem/4949 4949번: 균형잡힌 세상 각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"..
객체지향의 예시 - 이상한 나라의 앨리스 컴컴한 굴 속의 천장이 낮은 긴 통로 위에 떨어진 앨리스. 커튼 뒤에 숨겨져 있던 작은 문을 발견했는데, 그 곳엔 아름다운 정원이 있다. 하지만 문의 높이가 40cm가 채 되지 않았기 때문에 앨리스는 문을 지나 아름다운 정원에 들어갈 수 없다. 주위를 둘러보며 방법을 찾았다. '마셔라' 병의 액체를 마시고 앨리스의 키가 24cm 정도로 작아졌다. 케이크를 베어 물자 머리가 천장에 닿을 만큼 앨리스의 키가 커졌다. 토끼가 떨어뜨린 부채를 이용해 부채질을 하자 몸이 서서히 작아지더니 60cm 정도로 줄어들었다. 쐐기벌레가 남긴 버섯의 한쪽을 먹으면 몸이 커지고 다른 한쪽을 먹으면 몸이 작아진다. 앨리스는 버섯의 양쪽을 번갈아 먹으며 몸의 크기를 조절하여 원래 상태로 ..
[Part - 1] 아키텍처(Architecture) 프로젝트에 참여하는 개발자들이 설계에 대해 공유하는 이해를 반영하는 주관적인 개념 아키텍처는 주관적 → 같은 아키텍처라고 한다고 해도 서로 다른 팀에서 말하는 것이 세부적으로 다를 수 있음 아키텍처를 변경하는 것은 매우 많은 비용이 든다. → 변경하기 어렵다. 이유: 모든 개발자들이 현재 아키텍처를 공유하고 있기 때문 아키텍처는 가급적 일찍 올바르게 결정해야 한다. 아키텍처는 관심사의 분리이다. 관심사의 분리는 서로 다르고 관련이 없는 책임들을 분리하는 것 레이어 아키텍처(Layered Architecture) 서로 다른 관심사를 분리한 아키텍처 유사한 것들을 한 레이어에 모아놓음으로써 그 레이어만 교체를 하면 전체 시스템을 다른 환경에서도 사용 가능..