자율적인 책임 자율적 객체 -> 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체 객체가 책임을 자율적으로 수행하기 위해선 -> 객체에게 할당되는 책임이 자율적이어야 한다 상세한 수준의 책임은 협력의 최종 목표는 만족시킬지 몰라도 객체가 가져야 하는 선택의 자유를 크게 훼손한다 이런 경우, 자신의 판단이 아닌 외부의 명령에 의존하게 된다 책임은 자율성을 보장할 수 있도록 포괄적이고 추상적이면서도 할 일을 명확하게 명시하는 것이어야 한다 '어떻게'가 아닌, '무엇'을 책임으로 사용하라 너무 추상적인 책임 단, 협력의 의도를 명확하게 표현하지 못할 정도로 추상적인 책임 역시 문제다 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다 책임의 적합성은 협력이 무엇인지..
문제 문제 링크 풀이 이 문제는 하나의 노드에서 다른 모든 노드까지의 최소 경로를 구하는 문제로 다익스트라 알고리즘을 이용해 풀이할 수 있다. 다익스트라 알고리즘 다익스트라 알고리즘은 아래와 같은 방식으로 동작한다. 출발 노드 설정 최단 거리 테이블 초기화 방문하지 않은 && 최단 거리가 가장 짧은 노드를 선택 3에서 선택한 노드를 거쳐 다른 노드로 가는 비용을 계산해 최단 거리 테이블을 갱신 끝날 때 까지 3, 4번 과정을 반복 문제의 테스트 케이스에 적용 1번 노드부터 나머지 노드로의 최단 경로를 구하는 문제이므로 출발 노드는 1번으로 설정 간선에 가중치가 없으므로 출발노드와 이웃하는 노드까지의 거리를 1로 설정 방문하지 않은 노드 중 최단 경로가 최소인 2(또는 3)번 노드를 선택 이웃한 노드의 최..
객체지향에 갓 입문한 사람들의 가장 흔한 실수는 협력이라는 문맥을 고려하지 않은 채 객체가 가져야 할 행동부터 고민하기 시작한다는 것이다. 중요한 것은 개별 객체(의 행동이나 상태)가 아니라 객체들 사이에 이뤄지는 협력이다. 협력이 자리를 잡으면 저절로 객체의 행동이 드러나고 뒤이어 적절한 객체의 상태가 결정된다. (p.109) 협력 요청과 응답 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작됨 요청을 받은 사람은 지식 또는 서비스를 제공함으로서 요청에 응답 요청에 응답하는 과정에서 다시 다른 사람에게 요청을 보내야될 수도 있음 즉, 협력은 다수의 연쇄적인 요청 & 응답의 흐름으로 구성 어떤 사람이 특정한 요청을 받아들일 수 있는 이유는, 그 요청에 대해 적절한 방식으로 응답하는 데 필요한 지식과..
문제 이해 문제 링크 문제에 int[][]computers 배열로 컴퓨터의 연결에 대한 정보가 주어진다. 서로 연결된 컴퓨터들은 하나의 네트워크를 이룬다고 할 때 총 네트워크의 개수를 구하는 문제이다. 예를 들어 연결이 아래와 같다면 네트워크는 2개이고 아래와 같다면 네트워크는 1개가 된다. 풀이 이 문제는 전형적인 그래프 탐색 문제로, visited 배열에 방문한 노드들을 저장하면서 노드를 탐색해나가는데, 새로운 네트워크가 발견될 때마다 해당 네트워크에 연결된 모든 노드를 탐색 상태로 만들어둔다. 이렇게 하면 아직 탐색되지 않은 노드가 발견된다는 의미가 새로운 네트워크를 발견한다는 의미와 같아지므로 그때마다 count를 증가시켜서 총 네트워크의 개수를 확인할 수 있다. public int solutio..
비선형 자료구조 선형으로 표현할 수 없는 데이터를 표현할 때 사용되는 자료구조 예를 들어 지하철 노선도와 같이 하나의 선으로 표현할 수 없는 데이터를 표현하고자 할 때 사용된다 대표적으로 graph가 비선형 구조이다 graph 데이터를 갖는 Node와 Node들을 이어주는 Edge로 구성 Edge는 단방향 / 양방향의 방향성을 가질 수 있다 Edge는 가중치를 가질 수 있다 데이터의 탐색 선형 자료구조와 달리 비선형 구조는 시작과 끝이 모호하다 따라서 먼저 하나의 Node를 탐색하고 해당 Node와 Edge로 연결된 Node들을 탐색한다 연결된 Node들은 Queue / Stack 등에 넣어 탐색을 예약해둔다 원하는 Node를 찾을 때 까지 이 과정을 반복한다 탐색에 사용하는 자료구조에 따른 탐색 순서 ..
초기의 지하철 노선도는 실제와 유사한 물리적인 지형 위에 구불구불한 운행 노선과 불규칙적인 역 간의 거리를 사실적으로 묘사하고 있었다. 문제는 이렇게 사실적인 정보가 오히려 지하철을 이용하는 승객들로 하여금 노선도를 이해하기 어렵게 만들었다는 점이다. (p.73) 해리 벡은 승객이 꼭 알아야 하는 사실만을 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조해 낼 수 있었다. (p.75) 추상화를 통한 복잡성 극복 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정 불필요한 부분을 무시해 현실에 존재하는 복잡성을 극복하는게 추상화의 목적 훌륭한 추상화는 목적에 부합하는 것이어야 한다 추상..
세상을 더 작은 객체로 분해하는 것은 본질적으로 세상이 포함하고 있는 복잡성을 극복하기 위한 인간의 작은 몸부림이다. 인간은 좀 더 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력한다. (p.41) 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. (중략) 현실 세계에서는 사람이 직접 주문 금액을 계산하지만 소프트웨어 세계에서는 주문 객체가 자신의 금액을 계산한다. (p.42) 객체의 정의 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다. (p.47) 객체란 식별 가능한 개체 또는 사물이다 객체는 자동차처럼 만질 수 있는 구체적 사물일 수도..
문제 문제 링크 풀이 문제 이해 아래와 같은 m x n 크기의 격자가 있을 때, 가장 왼쪽 위 (1, 1) 에서 가장 우측 아래쪽 (m, n) 으로 가는 방법의 개수를 구하는 문제이다. (1,000,000,007로 나눈 나머지 반환) 단, 이때 위 그림에서처럼 웅덩이가 있는 곳은 지나가지 못한다. 입력으로는 격자의 크기 m, n과 웅덩이의 좌표가 [[2, 2]]와 같은 형태로 puddles 이름으로 제공된다. 풀이 방법 문제에서 우측 및 아래로 움직이는 경로만 가능하다고 했으므로 (1, 1)에서 시작하여 (m, n)까지 우측 및 아래로 한 칸씩 이동하며 경로의 개수를 계산한다. 이때, 예를 들어 (3, 3)까지의 경로 경우의 수는 아래와 같이 (2, 3) 까지의 경로 경우의 수와 (3, 2) 까지의 경로..
서론 객체지향으로 향하는 4가지 걸음 클래스가 아니라 객체를 바라보는 것 개체를 독립적인 존재가 아니라 기능을 구현하기위해 협력하는 공동체의 존재로 바라보는 것 협력에 참여하는 객체들에게 적절한 역할과 책임을 부여하는 것 위 개념들을 사용하는 프로그래밍 언어라는 틀에 잘 담아내는 기술을 익히는 것 1장 실세계의 모방이라는 개념은 객체지향의 기반을 이루는 철학적인 개념을 설명하는 데는 적합하지만 유연하고 실용적인 관점에서 객체지향 분석, 설계를 설명하기에는 적합하지 않다. (중략) 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것..
스프링 시큐리티 ignoring() 아래와 같이 index 페이지에 css를 적용하고 다시 요청을 해보자. Hello #hello { font-size: 100px; } css로 폰트 크기를 변경했음에도 실제로는 반영이 되지 않은 것을 확인할 수 있다. 개발자 콘솔로 요청과 응답 상태를 확인해보면, css 파일을 요청하는데 302(리다이렉션) 코드가 뜨고 login 페이지를 추가로 요청한 것을 확인할 수 있다. 이는 WebSecurityConfigurerAdapter를 통해 시큐리티를 설정할 때 지정한 경로 외의 모든 요청은 인증을 받도록 했기 때문에 정적 리소스를 요청하는 경로 또한 인증을 필요로 하게 되었기 때문에 발생하는 문제이다. 이를 해결하기 위해서는 시큐리티 필터가 적용되지 않도록 ignori..