객체지향에 갓 입문한 사람들의 가장 흔한 실수는 협력이라는 문맥을 고려하지 않은 채 객체가 가져야 할 행동부터 고민하기 시작한다는 것이다. 중요한 것은 개별 객체(의 행동이나 상태)가 아니라 객체들 사이에 이뤄지는 협력이다. 협력이 자리를 잡으면 저절로 객체의 행동이 드러나고 뒤이어 적절한 객체의 상태가 결정된다. (p.109) 협력 요청과 응답 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작됨 요청을 받은 사람은 지식 또는 서비스를 제공함으로서 요청에 응답 요청에 응답하는 과정에서 다시 다른 사람에게 요청을 보내야될 수도 있음 즉, 협력은 다수의 연쇄적인 요청 & 응답의 흐름으로 구성 어떤 사람이 특정한 요청을 받아들일 수 있는 이유는, 그 요청에 대해 적절한 방식으로 응답하는 데 필요한 지식과..
초기의 지하철 노선도는 실제와 유사한 물리적인 지형 위에 구불구불한 운행 노선과 불규칙적인 역 간의 거리를 사실적으로 묘사하고 있었다. 문제는 이렇게 사실적인 정보가 오히려 지하철을 이용하는 승객들로 하여금 노선도를 이해하기 어렵게 만들었다는 점이다. (p.73) 해리 벡은 승객이 꼭 알아야 하는 사실만을 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조해 낼 수 있었다. (p.75) 추상화를 통한 복잡성 극복 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정 불필요한 부분을 무시해 현실에 존재하는 복잡성을 극복하는게 추상화의 목적 훌륭한 추상화는 목적에 부합하는 것이어야 한다 추상..
세상을 더 작은 객체로 분해하는 것은 본질적으로 세상이 포함하고 있는 복잡성을 극복하기 위한 인간의 작은 몸부림이다. 인간은 좀 더 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력한다. (p.41) 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. (중략) 현실 세계에서는 사람이 직접 주문 금액을 계산하지만 소프트웨어 세계에서는 주문 객체가 자신의 금액을 계산한다. (p.42) 객체의 정의 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다. (p.47) 객체란 식별 가능한 개체 또는 사물이다 객체는 자동차처럼 만질 수 있는 구체적 사물일 수도..
서론 객체지향으로 향하는 4가지 걸음 클래스가 아니라 객체를 바라보는 것 개체를 독립적인 존재가 아니라 기능을 구현하기위해 협력하는 공동체의 존재로 바라보는 것 협력에 참여하는 객체들에게 적절한 역할과 책임을 부여하는 것 위 개념들을 사용하는 프로그래밍 언어라는 틀에 잘 담아내는 기술을 익히는 것 1장 실세계의 모방이라는 개념은 객체지향의 기반을 이루는 철학적인 개념을 설명하는 데는 적합하지만 유연하고 실용적인 관점에서 객체지향 분석, 설계를 설명하기에는 적합하지 않다. (중략) 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것..
람다식이란 람다식은 자바 8에서 추가된 문법으로 자바에서 함수형 프로그래밍을 지원하기 위해 도입되었다. 람다식 람다식은 메서드를 하나의 식 (Expression) 으로 표현한 것으로, 아래와 같이 작성된다. // 기존 메서드 int sum(int a, int b) { return a + b; } // 람다식 (a, b) -> a + b 위 코드에서 볼 수 있듯 람다식으로 메서드를 작성하면 이름이 사라지기 때문에 익명 함수 라고 부른다. 람다식을 사용하면 기존에 메서드를 작성하기 위해 클래스를 만들고, 메서드 시그니처를 작성하는 등의 과정 없이 단순히 식 (Expression) 하나만으로 메서드를 만들고 사용할 수 있다. 함수형 프로그래밍 함수형 프로그래밍에는 아래와 같은 큰 특징들이 있다. 1. 순수 함..
제네릭이란 JDK 1.5에서 처음 도입된 기능으로 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기술을 말한다. 자바에서 리스트를 사용할 때 로 타입을 지정했던 것이 바로 제네릭이다. public interface List extends Collection { ... } --- List list = new ArrayList(); // 사용 예시 제네릭의 필요성 (사용 이유) 1. 컴파일 타임의 타입 안전성 제네릭으로 타입을 지정하면 자바 컴파일러가 컴파일 타임에 강력하게 타입을 체크해서 이상이 있을 경우 오류를 발생시켜준다. 컴파일 오류는 런타임에 발생하는 오류보다 훨씬 안전하다. 2. 불필요한 형 변환 삭제 제네릭이 없는 List를 사용하는 아래와 같은 코드가 있다고 해보자. List ..
스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O 스트림 자바에서는 어느 한 쪽에서 다른 쪽으로 데이터를 전달하기 위해서는 두 대상을 연결할 무언가가 필요한데, 이를 스트림이라 한다. 즉, 스트림은 데이터를 전송하는데 사용되는 연결 통로 의 역할을 하고 이를 통해 I/O가 이루어진다. 스트림은 단방향으로만 데이터를 전송할 수 있다. 따라서 입력과 출력을 동시에 처리하기 위해서는 아래와 같이 입력 스트림과 출력 스트림, 총 두 개의 스트림이 필요하다. 스트림은 먼저 보낸 데이터를 먼저 받게 되고, 중간에 건너뜀 없이 데이터를 전송한다. 즉, 큐와 같은 FIFO 구조로 이루어져있다. NIO (New I/O) 자바 1.4버전부터 추가된 API로 기존 스트림을 사용하는 I..
어노테이션이란? 어노테이션은 사전적으로는 '주석' 이라는 의미이다. 자바에서 어노테이션은 클래스, 인터페이스, 메소드, 필드 등에 붙어서 컴파일러와 JVM에게 추가적인 정보(metadata)를 제공하는 역할을 한다. 어노테이션이 만들어진 이유 어노테이션 등장 이전에는 XML을 사용해 소스 코드의 메타 데이터를 작성하고 유지했다. 시스템과 분리되어 있으므로 어떤 면에서는 유지보수성이 좋다고 할 수 있으나, 프로그램이 방대해짐에 따라 오히려 유지보수가 어려워지는 문제가 발생했다. 어노테이션은 소스 코드에 바로 메타데이터를 작성할 수 있으므로 보다 직관적으로 메타 데이터를 작성할 수 있다. 추가로, 어노테이션은 어노테이션 프로세스를 통해 컴파일 타임에 코드나 기타 파일의 생성 등 작업이 가능하다. 어노테이션이..
enum 이란? enum 타입은 특수한 데이터 타입으로, 미리 지정된 상수만 대입할 수 있다. 미리 정의한 enum 클래스 내의 상수만 enum 타입에 대입될 수 있다. 예를 들어 방위(NORTH, SOUTH, EAST, WEST)나 요일(MONDAY, …) 등의 상수를 미리 정의하는 용도로 사용 가능하다. Enum 클래스는 가장 간단하게는 아래와 같이 정의할 수 있다. public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } Enum에 정의된 상수들은 각각 해당 enum 클래스의 객체이다. 이렇게 미리 정의된 상수만 객체로 사용할 수 있게 하여 enum 타입에 미리 정의된 값만 대입될 수 있게 하는 것이다. (e..
Process와 Thread [출처 - https://gyoogle.dev/blog/computer-science/operating-system/Process%20vs%20Thread.html] Process 메모리에서 실행되는 프로그램 메인 쓰레드 포함 최소 1개의 쓰레드를 갖는다 프로세스는 각각 별도의 주소 공간에 할당된다 (독립적) Thread 프로세스 안에서 실행되는 여러 흐름 단위 하나의 프로세스 안에 여러 쓰레드를 구성해 각 쓰레드가 각각의 작업을 맡아서 처리 쓰레드가 있어 다수의 작업을 동시에 처리할 수 있다 쓰레드는 Stack 만 별도로 할당 받고 나머지 영역은 프로세스의 것을 서로 공유한다 Context Switching에 들어가는 오버헤드가 적어 각각을 별도의 프로세스로 구성하는 것보다..