전체 글 (41) 썸네일형 리스트형 [알고리즘] 그리디 알고리즘 그리디 알고리즘 탐욕법은 가장 직관적인 알고리즘 설계 패러다임 원하는 답을 재귀호출과 똑같이 여러 개의 조각으로 쪼개고, 각 단계마다 답의 한 부분을 만들어 간다는 점에서 완전 탐색이나 동적 계획법 알고리즘과 다를 것이 없지만 모든 선택지 중 전체 답이 가장 좋은 것을 찾는 두 방법과는 다르다. 각 단계마다 지금 당장 가장 좋은 방법만을 선택한다. 예제 : 회의실 예약 → 길이와 상관없이 먼저 끝나느 회의부터 선택 목록 S에 남은 회의 중 가장 일찍 끝나는 회의 S(min) 을 선택한다. S(min) 과 겹치는 회의를 S 에서 모두 지운다. S 가 텅 빌 때까지 반복한다. → 집합의 크기가 n 일 때 부분 집합의 갯수는 n^2 → 그리디 알고리즘으로 풀면 시간복잡도 O(nlogn) [객체지향의 사실과 오해] 3장. 타입과 추상화 3장. 타입과 추상화 💡 일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 훌륭한 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해진다. 해리 벡이 창조한 지하철 노선도 → 정확성을 버리고 목적에 집중 → 꼭 알아야할 사실만 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조 → 지하철 노선의 추상화 추상화를 통한 복잡성 극복 추상화 : 이해하기 쉽고 예측 가능한 수준으로 현실을 분해하고 단순화하는 전략 *추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것* 추상화는 복잡한 현실을 단순화하기 위해 사용하는 .. [객체지향의 사실과 오해] 책임 주도 설계 RDD 책임 주도 설계 Responsibility Driven Design 데이터 중심 설계 -> 책임 중심의 설계로 전환하기 위해서는 다음의 두가지 원칙을 따라야한다. 1. 데이터보다 행동을 먼저 결정하라 객체에게 중요한 것은 데이터가 아니라 외부에 제공하는 행동이다. 객체는 협력에 참여하기 위해 존재하며 협력 안에서 수행하는 책임이 객체의 존재가치를 증명한다. 데이터 중심의 설계는 "이 객체가 포함해야하는 데이터가 무엇인가? 를 질문한다. 반면 책임 중심 설계에서는 "이 객체가 수행해야하는 책임은 무엇인가" 를 결정한 후에 "이 책임을 수행하는데 필요한 데이터는 무엇인가" 를 결정한다. 즉 책임을 먼저 결정한 후에 객체의 상태를 결정한다는 것이다. 2. 협력이라는 문맥 안에서 책임을 결정하라 책임은 객체의 .. [HTTP] IP 프로토콜 IP 프로토콜 IP 주소 부여 : 출발과 목적 IP 지정한 IP주소에 데이터를 전달 패킷이라는 통신 단위로 데이터 전달 IP 프로토콜의 한계 비연결성 패킷을 받을 대상이 없거나 서비스 불능 상태라면? 비신뢰성 중간에 패킷이 사라지면? 패킷이 순서대로 안오면? 프로그램구분 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 여러개라면? [객체지향의 사실과 오해] 2장. 이상한 나라의 객체 2장. 이상한 나라의 객체 💡 객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화 함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다 객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다. 객체지향과 인지능력 객체지향 패러다임은 인간이 인지할 수 있는 다양한 객체들이 모여 현실 세계를 이루는 것처럼 소프트웨어의 세계 역시 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음에서 출발한다. 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. 객체, 그리고 이상한 나라 앨리스는 상태를 가지며 상태는 변경 가능하다 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다 행동의 결과는 상태에 의존적이며.. [객체지향의 사실과 오해] 1장. 협력하는 객체들의 공동체 1장. 협력하는 객체들의 공동체 객체지향의 패러다임의 핵심은 자율적인 객체들의 협력이다 시너지를 생각하라. 전체는 부분의 합보다 크다. 객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 협력하는 사람들 객체는 각자의 역할이 있고 책임을 가지고 그 역할을 수행하며 객체들간에는 암묵적인 협력관계가 존재한다. 책임을 수행하는 방법은 자율적으로 선택할 수 있다. → 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 다형성 이라고 한다. 역할, 책임, 협력 기능을 구현하기 위해 협력하는 객체들 역할과 책임을 수행하며 협력하는 객체들 애플리케이션의 기능을 구현하기 위해 협력한다 애플리케이션의 기.. [클린코드] CHAP 14 점진적인 개선 CHAPTER 14 점진적인 개선 명령형 인수 구문 해석기 코드 초안 모든 로직이 하나의 클래스에 들어가 있다.코드 완성본 Args 클래스에서 코드 중복을 최소화하고 ArgsException 클래스를 분리했다. ArgumentMarshaller 클래스를 통해 여러 인수에 대한 추후 확장성을 만들어 놓는다. 코드만 분리해도 설계가 좋아진다. 관심사를 분리하면 코드를 이해하고 보수하기 쉬워진다. 점진적으로 개선하기 프로그램을 망치는 가장 좋은 방법 중 하나는 개선이라는 이름 아래, 구조를 크게 뒤집는 행위이다. 코드가 나빠짐을 느낄때 기능을 추가하지 않고 개선을 시작한다. 테스트 코드를 작성한다. 책임에 따라 클래스를 나누고 코드를 옮긴다. 테스트가 깨지지 않도록 확인하며 자잘한 변경을 조금씩 진행한다. I.. 이전 1 2 3 4 5 6 다음