전체 글

전체 글

    익명 클래스보다는 람다를 사용하라 - [7장. 람다와 스트림(아이템42)]

    📙 1. 익명 클래스와 람다식 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했다. 이런 인터페이스의 인스턴스를 함수 객체(function object)라고 하며, 특정 함수나 동작을 나타내는 데 사용하였다. JDK 1.1이 등장하면서 함수 객체를 만드는 주요 수단은 익명 클래스가 되었다. Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); 하지만, 위의 코드와 같이 익명 클래스 방식은 코드가 너무 길기 때문에 자바는 함수형 프로그래밍에 적합하지 않았다. 그래서 자바 8에 와서..

    소켓을 작성한다. - [Ch 02. TCP/IP의 데이터를 전기 신호로 만들어 보낸다.]

    이전 장(Ch 01. 웹 브라우저가 메시지를 만든다.)에서는 아래의 내용을 살펴보았다. URL을 해독하고, HTTP 리퀘스트 메시지를 만들고, 메시지를 송신하도록 OS에 의뢰한다. 이번 장(Ch 02. TCP/IP의 데이터를 전기 신호로 만들어 보낸다.)에서는 OS에 내장된 프로토콜 스택에 어떻게 송신을 의뢰하는지에 대해서 알아보자. 이전 장에서 알아본 메시지 송신 과정을 프로토콜 스택 내부의 움직임을 통해 살펴볼 것이다. 데이터 송·수신 동작은 아래의 4단계가 있다. 소켓 작성 단계 접속 단계 송·수신 단계 연결 끊기 단계 이번 글에서는 1단계인 '소켓 작성 단계'에 대해서 자세히 알아보자. 📙 1. 프로토콜 스택의 내부 구성 프로토콜 스택의 내부는 그림과 같이 역할이 서로 다른 몇 부분으로 나누어져 ..

    정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 - [6장. 열거 타입과 애너테이션(아이템41)]

    // 마커 인터페이스 public interface MarkerInterfaceEx { } 마커 인터페이스(Marker Interface)란 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해 주는 인터페이스를 말한다. 예시로 Serializable 인터페이스가 있다. Serializable을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸(write) 수 있다고, 즉 직렬화(Serialization)할 수 있다고 알려준다. // 마커 애너테이션 public @interface MarkerAnnotationEx { } 마커 애너테이션이 등장하면서 마커 인터페이스를 사용할 필요가 없다고 생각할 수 있다. 하지만 사실이 아니다. 이번 글을 통해 마..

    @Override 애너테이션을 일관되게 사용하라 - [6장. 열거 타입과 애너테이션(아이템40)]

    @Override 애너테이션은 메서드 선언에만 달 수 있으며, 이 애너테이션이 달렸다는 것은 상위 타입의 메서드를 재정의했음을 뜻한다. @Override 애너테이션을 일관되게 사용하면 여러 가지 악명 높은 버그들을 예방해 준다. 이번 글을 통해 @Override 애너테이션을 사용하지 않았을 때의 문제점과 @Override 애너테이션을 사용했을 때의 장점 및 사용에 대해서 알아보도록 하자. 📙 1. @Override 애너테이션을 사용하지 않았을 때의 문제점 public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this...

    프로토콜 스택에 메시지 송신을 의뢰한다. - [Ch 01. 웹 브라우저가 메시지를 만든다]

    이전 과정을 통해 IP 주소를 얻었다. 이번 글에서는 데이터의 송신과 수신이 어떻게 동작하는지 알아보고자 한다. 📙 1. 데이터 송·수신 동작의 개요 IP 주소를 이용하여 액세스 대상 웹 서버에 메시지를 송신하기 위해 OS의 내부에 있는 프로토콜 스택에 의뢰한다. 데이터 송·수신 동작도 DNS 서버에 IP 주소를 조회할 때처럼 Socket 라이브러리에 들어있는 프로그램 부품을 이용하는데, IP 주소를 조회할 때처럼 프로그램 부품을 하나씩 호출하고 끝나는 게 아니라 복수의 부품을 결정된 순번대로 호출한다. Socket 라이브러리를 이용한 데이터 송·수신 동작은 위와 같다. 데이터를 송·수신하는 컴퓨터 사이에 데이터의 통로(파이프) 같은 것이 있고 파이프의 양 끝에 데이터의 출입구인 소켓이 있다. 그리고 아..

    전 세계의 DNS 서버가 연대한다. - [Ch 01. 웹 브라우저가 메시지를 만든다]

    이전까지 리졸버와 DNS 서버의 통신 과정을 살펴보았다. 이번에는 DNS 서버의 동작을 살펴보도록 하자. 📙 1. DNS 서버의 기본 동작 DNS 서버의 기본 동작은 '클라이언트에서 조회 메시지를 받고 조회의 내용에 응답하는 형태로 정보를 회답하는 일'이다. 조회 메시지에는 다음의 3가지 정보가 포함되어 있다. 이름 서버나 메일 배송 목적지(메일 주소에서 @ 뒷부분의 이름)와 같은 이름 클래스 인터넷 네트워크를 나타내는 'IN'이라는 클래스 DNS의 구조를 고안했을 때 인터넷 이외에도 네트워크에서의 이용까지 검토하여 이것을 식별하기 위해 클래스라는 정보를 준비했다. 하지만 지금은 인터넷 이외의 네트워크는 소멸되어서 항상 IN이라는 값을 가진다. 타입 이름에 어떤 타입(종류)의 정보가 지원되는지를 나타낸다..

    웹 서버의 IP주소를 DNS 서버에 조회한다. - [Ch 01. 웹 브라우저가 메시지를 만든다]

    HTTP의 메시지를 만들면 이것을 OS에 의뢰하여 액세스 대상의 웹 서버에게 송신한다. 브라우저는 URL을 해독하거나 HTTP 메시지를 만들지만, 메시지를 네트워크에 송출하는 기능이 없기 때문에 OS에 의뢰하여 송신하는 것이다. OS에 송신을 의뢰할 때는 도메인명이 아니라 IP 주소로 메시지를 받을 상대를 지정해야 한다. 그래서 URL 안에 쓰여있는 서버의 도메인명으로 IP 주소를 조사해야 한다. 그래서 이번 글에서는 도메인명에서 IP 주소를 조사하는 방법을 알아보고자 한다. 📙 1. IP 주소의 기본 🚩 1. 기본 동작 우선, TCP/IP 개념과 함께 IP 주소에 대해서 알아보자. TCP/IP는 서브넷이라는 작은 네트워크를 라우터로 접속하여 전체 네트워크가 만들어진다고 생각할 수 있다. 서브넷이란 허브..

    HTTP 리퀘스트 메시지를 작성한다. - [Ch 01. 웹 브라우저가 메시지를 만든다]

    📙 1. 탐험 여행은 URL 입력부터 시작한다. 네트워크의 출발점은 URL부터 시작한다. 브라우저는 웹 서버에 액세스 하는 클라이언트로 사용하는 경우가 많지만, 파일을 다운로드/업로드하는 FTP의 클라이언트 기능이나 메일의 클라인언트 기능도 가지고 있다. 그래서 웹 서버에 액세스 할 때는 http:, FTP 서버라면 ftp:라는 식으로 여러 종류의 URL이 있다. 즉, 브라우저는 몇 개의 클라이언트 기능을 겸비한 복합적인 클라이언트 소프트웨어라고 할 수 있다. 웹 서버나 FTP 서버에 액세스 하는 경우에는 서버의 도메인명이나 액세스 하는 파일의 경로 등을 URL에 포함시킨다. HTTP 프로토콜로 웹 서버에 액세스 하는 경우 http://{사용자명(생략가능)}:{패스워드(생략가능)}@{웹 서버의 도메인명}..

    명명 패턴보다 애너테이션을 사용하라 - [6장. 열거 타입과 애너테이션(아이템39)]

    📙 명명 패턴의 문제점 전통적으로 도구나 프레임워크가 특별히 다뤄야 할 프로그램 요소에는 딱 구분되는 명명 패턴을 적용해 왔다. 예를 들어, 테스트 프레임워크인 JUnit은 버전 3까지 테스트 메서드 이름을 test로 시작하게끔 했다. 효과적인 방법이지만 아래와 같은 3가지 큰 단점이 있다. 오타가 나면 안 된다. 실수로 이름을 tsetSafetyOverride로 지으면 이 메서드는 무시된다. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다. 클래스 이름을 TestSafetyMechanisms로 지어 이 클래스에 정의된 테스트 메서드들을 수행하길 바라지만 JUnit은 클래스 이름에는 관심이 없다. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다. 특정 예외를 던져야만 성공하는 테스트가 있다..

    확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 - [6장. 열거 타입과 애너테이션(아이템38)]

    📙 1. 열거 타입의 확장 타입 안전 열거 패턴과 달리 열거 타입은 확장할 수 없다. (이 점을 제외하고는 거의 모든 상황에서 열거 타입이 타입 안전 열거 패턴(typesafe enum pattern) 보다 우수하다.) 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있는 반면, 열거 타입은 그렇게 할 수 없다. 설계가 잘 못 된 것은 아니다. 하지만 다음과 같은 이유로 대부분 상황에서 열거 타입을 확장하는 건 좋지 않은 생각이기 때문이다 열거 타입을 확장할 수 없도록 설계한 것이다. 확장한 타입의 원소는 기반 타입의 원소로 취급하지만, 기반 타입의 원소를 확장한 타입의 원소로 취급할 수 없는 건 이상하기 때문이다. 기반 타입과 확장된 타입들의 원소 모두를..

    2023년 상반기 회고

    나의 첫 회고를 적어보고자 한다. 회고를 작성해 본 적이 없기 때문에 어느 정도의 기간을 두고 회고를 작성해야 하는지 잘 모르겠다. 그래서 이번에 회고를 한번 작성해 보고 계속해서 반기를 기준으로 적거나, 아니면 분기 단위로 나눌 생각이다. 이번 글의 형식은 큰 주제들 기준으로 내용을 전개해 나가는 것으로 하겠다. ✅ 1. 부트캠프 2023년 1월 4일부터 SSAFY(삼성 청년 SW 아카데미, Samsung Software Academy For Youth, 이하 부트캠프)에서 교육을 듣고 있다. 교육을 들으면서 좋은 점 중 하나는 '동기들 덕분에 공부를 하는데 많은 도움을 받는다는 것'이다. 취업 정보 공유는 물론이고 스터디 또는 프로젝트가 순탄하게 진행되도록 동기들이 많은 도움을 주고 있다. 특히, 스..

    B-Tree 인덱스 - (1)

    이번 글과 다음 글을 통해서 B-Tree 인덱스에 대해서 자세히 알아보자. 📙 1. 인덱스 개념 🧰 1. 책과 인덱스 인덱스란 책의 맨 끝에 있는 찾아보기(= 색인)에 비유할 수 있다. '찾아보기'를 인덱스라고 한다면, '책의 내용'은 데이터 파일에 해당하고, '페이지 번호'는 데이터 파일에 저장된 레코드의 주소라고 할 수 있다. DBMS에서 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래 걸린다. 그래서 칼럼(또는 칼럼들)의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍(key-value)으로 삼아 인덱스를 만들어 두는 것이다. 책의 '찾아보기'와 DBMS의 인덱스의 중요한 공통점은 '정렬'이다. '찾아보기'는 'ㄱ, ㄴ, ㄷ, ㄹ,...'과 같은 순서로 정렬되어 있..