전체 글 77

[객체지향의 사실과 오해] 5. 책임과 메시지

좋은 객체지향 시스템을 만들기 위해선 객체들이 어떻게 커뮤니케이션을 하냐에 달렸다. 이 커뮤니케이션을 하는 방법을 메시지라하며 메시지는 객체의 책임을 유발한다. 메시지가 얼마나 중요한지 알아보자. 자율적인 책임 자율적이란 스스로 의지를 가지고 있어 스스로 판단할수 있다는 의미이다. 객체는 메시지를 수신받아야만 책임을 수행한다. 이 책임은 수신받은 객체 즉, 수신자가 자신의 의지와 판단에 맞게 책임을 수행해야한다. 이렇게 객체가 얼마나 자율적인 책임을 가지고 있느냐가 객체지향 어플 전체의 품질을 결정한다. 그렇다면 자율적인 책임이 뭔지 보다더 자세히 알아보자. 자율적인 책임 예시 선생님이 학생에게 공부를 시켜야하는 상황을 가정해보자. 선생님 학생에게 '공부해'라는 메시지를 송신해야 학생은 메..

study with book 2021.08.28

백준 2206(JAVA)

문제 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다. 한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다. 맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오. 풀이 일단 가중치없는 그래프에서 최단 경로이므로 BFS로 풀어야하는 것은 눈치를 챘다. 그런데,,, 쉽게 풀줄..

algorithm 2021.08.28

백준 16197(JAVA)

문제 N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고, 두 동전의 위치는 다르다. 버튼은 "왼쪽", "오른쪽", "위", "아래"와 같이 4가지가 있다. 버튼을 누르면 두 동전이 버튼에 쓰여 있는 방향으로 동시에 이동하게 된다. 동전이 이동하려는 칸이 벽이면, 동전은 이동하지 않는다. 동전이 이동하려는 방향에 칸이 없으면 동전은 보드 바깥으로 떨어진다. 그 외의 경우에는 이동하려는 방향으로 한 칸 이동한다.이동하려는 칸에 동전이 있는 경우에도 한 칸 이동한다. 두 동전 중 하나만 보드에서 떨어뜨리기 위해 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시..

algorithm 2021.08.25

[객체지향의 사실과 오해] 4. 역할, 책임, 협력

객체의 모양을 빚는 것은 객체가 참여하는 협력이다. 개별적인 객체의 상태나 행동이 아니라 객체들간의 협력에 집중하라!!! 협력 한 객체가 자신의 책임으로 해결할수 없을 때 다른 객체에게 도움을 받기 위해 요청을 한다. 이 객체는 또 자신의 책임으로는 해결할수 없을 때 다른 객체에게 요청을하고, 또 그 객체는 요청한다. 그리고 요청받은 객체는 응답한다. 이런 요청과 응답의 연쇄적인 흐름이 바로 협력이다. 협력은 연쇄적인 요청과 응답의 흐름으로 구성된다. 책임 객체가 어떠한 요청에 대해 대답할수 있거나 적절한 행동을 할 의무가 있는 경우 해당 객체는 책임이 있다고 한다. A객체가 B객체에게 요청을 전송할 경우에만 B객체는 책임을 수행한다. 즉, 다른 객체가 책임을 수행하도록 요청을 보내는 것을 메시지 전송이..

study with book 2021.08.20

[OS] 운영체제 Deadlock

교착상태인 Deadlock에 대해서 알아보자. 교착상태 그림과 같이 차가 도로에서 너무 막혀서 가고 싶은 곳으로 갈수가 없다. (어떠한 차도) 프로세스 관점에서 본다면 차가 프로세스이고 가고싶은 도로가 자원이면 프로세스들이 자원을 할당받지못해 작업을 수행하지 못하는 상태를 의미한다. 이것이 교착상태, deadlock이다. 교착상태 개념 프로세스 상태전이도에서 blocked/asleep상태의 프로세스는 프로세서를 할당받아 작업을 수행중 어떠한 자원이 또필요하여, (혹은 이벤트가 필요하여) 프로세서를 반납하고 자원을 대기하는(이벤트를 대기하는) 상태의 프로세스인데 이 때 영영, 영원히 자원을 받을 가능성이 없는 프로세스를 교착상태에 빠졌다 한다. 교착상태에 빠진 프로세스가 있는 시스템을 시스템이 deadlo..

computer science 2021.08.20

백준 1987(JAVA)

문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다. 풀이 무지성으로 bfs로 했다. 문제를 자세히 살피지못하고.. 이문제는 무조건 깊이우선탐색 dfs로 풀어야한다.!!! 왜 그런지 알아보자. 같은 알파벳을 두번 지날수가없다. 즉, 한번 ..

algorithm 2021.08.10

백준 2589(JAVA)

문제 보드위에는 육지와 바다가있는데 육지에서 육지로만 갈수있고 현재위치에서 상하좌우 밖에움직이지 못한다. 이 보드위에 보물이 두군데 묻혀있는데 보물은 최단거리중 가장 긴 시간이 걸리는 곳에 묻혀있다. 보물 지도가 주어질 때, 보물이 묻혀 있는 두 곳 간의 최단 거리로 이동하는 시간을 구하는 프로그램을 작성하시오. 풀이 최단거리리라는 것이 무엇인지 문제에 주어져있다. 이 문제를 보고 bfs로 바로 풀어야겠다는 생각이 난들었다. (가중치없는 최단거리이동은 bfs이다.) bfs가 어떤식으로 그래프를 탐색하는지 생각하면 어렵지않게 생각할수있는 문제이다. 보드의 각 위치를 모두 탐색하면서 해당 위치에서 가장 긴시간이 걸리는 육지칸을 찾은 다음, 이 시간과 static 변수인 max중 큰 값을 비교하며 최신화하며 ..

algorithm 2021.08.05

백준 1092(JAVA)

문제 지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은 동시에 움직인다. 각 크레인은 무게 제한이 있다. 이 무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다. 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오. 풀이 어려운 문제이다. 이 문제의 중요한점은 박스의 무게에 집착하면 안되고 크레인이 들수 있는 박스의 개수에 집중해야한다. 6 8 9 크레인 2 2 4 5 7 박스 (둘다 오름차순 정렬한 상태임) 첫번째 6 크레인은 박스 4개를 들수있다.(2 2 4 5) 두번째 8 크레인은 박스 5개를 들수있다.(2 2 4 5 7) 세번째 9 ..

algorithm 2021.08.03

thymeleaf에서 th:field와 th:selected 중복사용

타임리프에서 th:field와 th:selected를 중복으로 사용하면 둘중 하나가 적용이 되질않는다. 상황 th:field로 th:object에서 감싼 필드를 사용하고있었는데, th:selected가 계속 되질 않는 것이다.. 찾아보니 th:field와 th:selected는 동시에 적용이 되지 않는다는것을 알게되었다. 카테고리 기타 category name 해결 th:field는 name, id 속성과 필드가 매핑되어 값이 적절하게 들어간다. 그냥 직접 풀어서 사용하여 th:field를 사용하지않고 th:selected만 사용하여 해결 카테고리 기타 category name 뭐가문젠지 모르겠어서 해결하는데 꽤 걸렸다.. https://stackoverflow.com/questions/32206849/..

개발 2021.08.03

spring security를 살짝 적용해보자!

프로젝트를 진행하는데, 인증과 인가필요해서 찾아보다 spring security를 적용하면 접근하는 사용자가 누구인지에 대한 인증과 어떠한 자원에대한 접근이 가능한지에 대한 인가를 쉽게 적용할수 있다는 사실을 깨닫고 스프링 부트에서 spring security를 적용해려 했다. 그런데 너무 어려웠다. 설정도 복잡하고, spring security만의 기능을 이해하는데 힘들었다. 그래서 내가 스프링 시큐리티를 적용할 때 기억이 나지않을 경우 복기할 용도와, spring security를 처음 적용하는 사람에게 도움이 될까하고 포스팅을 하게되었다. 매우 간단하게 프로젝트를 진행할것이다! 초점은 스프링 시큐리티의 사용법이다. (본인도 스프링 시큐리티의 제대로된 매커니즘을 알지못한다.) 가자! 구현할 기능 어플..

개발 2021.07.30