분류 전체보기

ordinal 인덱싱 대신 EnumMap을 사용하라 - [6장. 열거 타입과 애너테이션(아이템37)]
배열의 인덱스를 얻기 위해 ordinal을 쓰는 거은 일반적으로 좋지 않으니, 대신 EnumMap을 사용하도록 하자. 아래의 2가지 상황(일차원 관계, 다차원 관계)을 통해 왜 EnumMap을 사용해야 하는지 알아보도록 하자. 1. 1차원 관계에서의 EnumMap 아래의 Plant 클래스를 통해 식물의 이름(name)과 생애주기(lifeCycle)를 간단히 나타낼 수 있다. public class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } // 한해살이, 여러해살이, 두해살이 final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { thi..

비트 필드 대신 EnumSet을 사용하라 - [6장. 열거 타입과 애너테이션(아이템36)]
📙 1. 비트 필드 열거한 값들이 주로 집합으로 사용될 경우, 예전에는 각 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용했었다. (비트마스킹을 이용했다고 할 수 있다.) public class Text { public static final int STYLE_BOLD = 1

ordinal 메서드 대신 인스턴스 필드를 사용하라 - [6장. 열거 타입과 애너테이션(아이템35)]
대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다. 그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메서드를 제공한다. 그래서 열거 타입 상수와 연결된 정숫값이 필요하다면 ordinal 메서드를 사용하면 되지 않을까라는 생각을 할 수 있다. 결론부터 말하자면 그렇게 사용하면 안 된다. '왜 그렇게 사용하면 안 되는지'와 '그러면 언제 ordinal을 사용해야 하는지'에 대해서 알아보자. 📙 1. 열거 타입 상수와 연결된 정숫값을 얻기 위해 ordinal 메서드를 사용하면 안 되는 이유 public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONE..

int 상수 대신 열거 타입을 사용하라 - [6장. 열거 타입과 애너테이션(아이템34)] - (2)
이전 글을 통해 '정수 열거 패턴의 단점, 열거 타입의 장점, 열거 타입의 기본 사용법'을 알아보았다. 이번 글에서는 열거 타입의 다양한 기능들에 대해서 알아보도록 하자. 📙 1. 상수별 메서드 구현 (constant-specific method implementation) 사칙연산 계산기와 같이 상수마다 동작이 달라져야 하는 경우가 있다. 가장 간단하게 생각해 볼 수 있는 것은 switch문을 통하여 분기하는 방법이다. public enum Operation { PLUS, MINUS, TIMES, DIVIDE; // 상수가 뜻하는 연산을 수행한다. public double apply(double x, double y) { switch(this) { case PLUS: return x + y; case ..

int 상수 대신 열거 타입을 사용하라 - [6장. 열거 타입과 애너테이션(아이템34)] - (1)
자바를 이용하여 코딩을 하다 보면 정수 열거 패턴(int enum pattern)과 열거 타입(enum type)을 사용해 본 적이 있을 것이다. 이번 글에서는 정수 열거 패턴의 단점들을 살펴보고, 왜 열거 타입을 사용해야 하는지 알아보고자 한다. 그리고 기본적인 열거 타입의 사용법도 알아볼 것이다. 📙 1. 정수 열거 패턴 (int enum pattern) public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ..

대칭키 vs 공개키(비대칭키)
대칭키 암호화 방식은 암복호화에 사용하는 키가 동일한 방식을 말한다. 공개키(=비대칭키) 암호화 방식은 암복호화에 사용하는 키가 서로 다른 암호화 방식을 말한다. 📙 1. 대칭키 암호화 방식 대칭키 암호화 방식은 암호화와 복호화 과정에서 사용하는 키가 동일한 암호화 방식을 말한다. 동일한 키(대칭키)를 주고받기 때문에 속도가 매우 빠르다는 장점이 있다. 하지만, 대칭키를 전달하는 과정에서 키가 탈취될 수 있다는 문제점이 있다. 📙 2. 공개키 암호화 방식 공개키(비대칭키) 암호화 방식은 암호화와 복호화 과정에서 사용하는 키가 서로 다른 암호화 방식을 말한다. 이는 키를 교환해야 하는 대칭키 암호화 방식의 문제를 해결하기 위해 등장하였다. '공개키' 암호화 방식이라는 이름에서 알 수 있듯이, 키가 공개되어..

계층화 아키텍처 (Layered Architecture)
📙 1. 개념 계층화 아키텍처(Layered Architecture)는 관심사의 분리(Separation of concerns)에 따라 시스템을 유사한 책임(관심)을 지닌 Layer로 분해하고, 각각의 Layer가 하위 Layer에만 의존하도록 구성하는 아키텍처 패턴이다. 📙 2. 사용 목적 Layered Architecture를 이용하여 각 레이어들이 특정 관심사와 관련된 개체만을 포함하도록 만든다. 이를 활용한 Layered Architecture을 통해 다음과 같은 목적을 이룰 수 있다. 전체적인 시스템의 결합도를 낮춘다. 하위 계층은 인터페이스를 통해 접근함으로써 해당 계층의 변경 사항을 최소화할 수 있다. 재사용성을 높인다. 각 레이어에 서로 다른 추상화 수준을 가진 상태와 행동을 위치시킴으로써..

CQS (Command Query Separation)
CQS(Command Query Separation)을 살펴보기 전에, 표를 이용하여 Command와 Query를 비교해 보고 CQS에 대해서 살펴보자. 📙 1. Command & Query Command Query 객체의 상태를 변경하는가? O X 값을 반환하는가? X O 예시 setter 메서드 getter 메서드 📙 2. CQS CQS(Command Query Separation)는 객체의 모든 메서드를 Command와 Query 두 가지로 구분한다. 그래서 하나의 메서드는 반드시 Command 또는 Query 중에서 하나에만 해당해야 한다. 즉, 하나의 메서드가 Command 이면서 동시에 Query 일수는 없다. CQS의 목적은 커맨드와 쿼리를 분리하는 것이다. CQS를 지키게 되면 query ..

자바의 컴파일 과정
자바는 JVM(Java Virtual Machine) 덕분에 OS에 독립적인 특징을 가지고 있다. JVM의 어떠한 기능 때문에 OS에 독립적으로 실행시킬 수 있는지 자바의 컴파일 과정을 통해 알아보자. 📙 1. 컴파일 과정 자바의 컴파일 과정은 다음과 같다. 개발자가 작성한 자바 소스파일(*. java)을 자바 컴파일러(Java Compiler)가 바이트파일(*.class)로 컴파일한다. (CPU가 이해할 수 있는 언어인 바이너리 코드가 아니라 JVM이 이해할 수 있는 바이트 코드를 가진 바이트 파일로 변환한다.) 클래스 로더(Class Loader)를 통해 바이트 파일(*.class)들을 JVM에 올린다. JVM에 있는 바이트 파일(*.class)들은 실행 엔진(Execution Engine)의 인터프..

MySQL의 전체 구조 & 쿼리 실행 구조
이번 글에서는 'MySQL의 전체 구조'와 '쿼리 실행 구조'를 살펴보고자 한다. InnoDB 스토리지 엔진과 MyISAM 스토리지 엔진의 구체적인 내용은 이후의 글들을 참고하는 것으로 하자. 📙 1. MySQL의 전체 구조 MySQL(=MySQL 서버)은 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있다. MySQL 엔진은 사람의 머리 역할을 담당하고, 스토리지 엔진은 손과 발의 역할을 담당한다고 할 수 있다. MySQL은 일반 상용 RDBMS와 같이 대부분의 프로그래밍 언어로부터 접근 방법을 모두 지원한다. MySQL 고유의 C API부터 시작해 JDBC, ODBC, .NET의 표준 드라이버를 제공하며, 이러한 드라이버를 이용해 다양한 언어로 MySQL 서버에서 쿼리를 사용할 수 있게 지원한다..

트랜잭션의 격리 수준 (Transaction Isolation Level)
📙 1. 격리 수준이란 트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것을 말한다. 격리 수준은 크게 'READ UNCOMMITTED', 'READ COMMITTED', 'REPEATABLE READ', 'SERIALIZABLE'의 4가지로 나뉜다. 뒤로 갈수록 각 트랜잭션 간의 데이터 격리(고립) 정도가 높아지며, 동시 처리 성능도 떨어지는 것이 일반적이다. 'DIRTY READ'라고도 하는 'READ UNCOMMITTED"는 일반적인 데이터베이스에서는 거의 사용하지 않고, 'SERIALIZABLE' 또한 동시성이 중요한 데이터베이스에서는 거의 사용되지 않는다...

객체지향 프로그래밍 vs 절차지향 프로그래밍
객체지향 프로그래밍과 절차지향 프로그래밍에 대해서 알아보도록 하자. 📙 1. 객체지향 프로그래밍 (Object Oriented Programming, OOP) 📌 1. 개념 객체지향 프로그래밍이란 객체들이 모여서 상호 협력하면서 데이터를 처리하는 방식의 프로그래밍 설계 방법을 말한다. 📌 2. 특징 객체지향언어의 특징으로는 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism), 추상화(Abstraction)가 있다. 🔎 1. 캡슐화(Encapsulation) 내부를 캡슐처럼 감싸서 그 내부를 보호하고 볼 수 없게 하는 것을 말한다. 데이터와 기능을 하나로 묶어서 관리하게 된다. 실제로 구현되는 부분을 외부로 드러나지 않도록 하여 정보를 은닉할 수 있다. 🔎 2..