분류 전체보기
디자인 패턴. 싱글턴 패턴(Singleton pattern)
디자인 패턴. 싱글턴 패턴(Singleton pattern)
2022.05.08정의 싱글턴(singleton)은 오직 하나의 객체만을 생성할 수 있는 클래스를 말합니다. 따라서 싱글턴 패턴을 사용하면 쉽게 객체의 유일성을 보장할 수 있습니다. 또한 일반적으로 싱글턴 객체에 대한 참조를 public static 필드나 public static 메서드로 노출하므로 어디에서나 싱글턴 객체에 접근할 수 있습니다. 구현 public static final 필드 객체가 오직 하나만을 보장하려면 어떻게 해야 할까요? 바로 정적(static) 필드를 사용하는 것입니다. 정적 필드를 사용하면 모든 객체가 공유하는 필드를 만들 수 있으며, 한 번만 생성되고 별도의 메모리 공간에 저장된다는 특징이 있습니다. public class Singleton { public static Singleton INS..
37편. 열거형(Enum Types)
37편. 열거형(Enum Types)
2022.05.05열거형(Enum Type) 열거형(enum)은 여러 상수로 이루어진 고정 집합을 나타내는 특수 데이터 타입이라고 할 수 있습니다. 더 정확하게 말하면 자바 클래스의 특별한 한 종류라고 말할 수 있습니다. 보통 열거형은 아래와 같이 선언합니다. class, interface가 들어갔던 자리에 enum이 들어온 것을 눈여겨봐 주세요. enum 이름 { 상수1, 상수2, ..., 상수N } 열거형을 사용하면 서로 관련 있는 상수를 논리적으로 그룹화할 수 있습니다. 예를 들어서 방위(동, 서, 남, 북)를 나타내려면 열거형을 아래와 같이 쓸 수 있습니다. enum CardinalDirection { EAST, WEST, SOUTH, NORTH } 열거형 필드 작명 관습 열거형 작명 규칙은 클래스와 동일하고(즉,..
33편. 파일 입출력(File input and output)
33편. 파일 입출력(File input and output)
2022.05.04스트림(Stream) 파일 입출력을 알아보기 전에 스트림이 무엇인지 이해해야 합니다. 여기서 말하는 스트림은 읽거나 쓸 수 있는 1차원적인 데이터의 흐름을 말합니다. 마치 강이 상류에서 하류로 흐르는 것처럼, 데이터도 어느 한 출발지(source)에서 목적지(destination)로 흐르는 것처럼 말이죠. 여기서 출발지와 목적지는 파일, 키보드나 모니터, 원격 네트워크, 데이터베이스 시스템, 다른 프로그램 등과 같이 다양한 자원들이 될 수 있습니다. 프로그램을 기준으로 잡고 외부 자원(파일, 키보드 등)으로부터 데이터를 읽고 싶다고 해봅시다. 그러면 자연스럽게 외부 자원은 데이터의 출발지 혹은 데이터의 원천이 될 것입니다. 이렇게 출발지에서 생성된 데이터는 목적지인 프로그램으로 흐릅니다. 이때 이 흐름을..
27편. 컬렉션(Collections)
27편. 컬렉션(Collections)
2022.04.26컬렉션 인터페이스나 클래스 내의 각 메서드에 붙은 주석들은 자바독에서 설명하는 내용들을 추려서 그대로 옮겨왔습니다. 그리고 이 게시글에서는 내용이 너무 길어지기도 하고 자바의 범위를 벗어나므로, 여기서 등장하는 자료구조나 알고리즘에 대해서는 따로 설명하지는 않습니다. 자료구조에 대한 기본적인 배경지식이 없다면 이해가 힘들 수 있습니다. 예제를 실행해보고 결과를 이해하기 힘들다면 인터넷에서 자료구조에 대한 게시글을 간단하게 보고 오시는 것을 추천해 드립니다. 컬렉션은 한번에 이해하려고 하기 보다는 리스트(List), 셋(Set), 큐(Queue), 맵(Map)의 특징을 간략하게 파악하고 예제를 살펴보면서 대략적인 감을 잡는 것으로 시작하는게 좋습니다. 인터페이스에서 소개하는 메서드를 다 보는게 아니라 ad..
35편. 스트림(Streams) (1)
35편. 스트림(Streams) (1)
2022.04.04들어가기 앞서 자바로 작성된 수많은 프로그램들의 내부에서는 갖가지의 컬렉션(collection)을 만들고 이를 이용해 데이터를 처리합니다. 예를 들어서, 우리는 매장 내 물품의 재고량이나 가격, 제조일자, 브랜드 등을 나타내는 물품의 컬렉션을 만들 수 있습니다. 그리고 이 컬렉션을 이용하여 재고가 없는 물품을 검색하거나 가격이 낮은 순으로 정렬시키는 등 다양한 작업을 수행할 수 있습니다. public static void main(String[] args) { List products = productService.getProducts(); products.add(new Product(1, "External Hard Drive",59990, 15)); products.add(new Product(2, "..
Github Copilot: 개발자를 위한 AI 기반의 강력한 자동 완성 도구
Github Copilot: 개발자를 위한 AI 기반의 강력한 자동 완성 도구
2022.03.30소개 전세계의 개발자들은 오늘도 비슷한 구조의 코드를 작성하는데 많은 시간을 보내고 있습니다. 코드 편집기에서는 이를 보조하기 위해서 편의성 단축키와 스니펫, 자동 완성 등과 같이 다양한 기능들을 지원합니다. 물론 이런 기능들이 많은 도움이 되기는 하지만, 여전히 반복되는 구조의 코드를 작성하는데 많은 시간이 들어가는 것이 사실입니다. 하지만 코드의 맥락을 읽고 그 뒤에 이어질 수 있는 여러 코드들을 제안할 수 있다면 얼마나 좋을까요? 바로 Github Copilot(이하 코파일럿)이 그런 기능을 제공합니다. 또한 코파일럿은 수십억 줄에 달하는 공용 저장소의 코드를 훈련 데이터로 사용해서 코드의 맥락을 읽고 적절한 코드를 제시함으로써 개발자의 시간을 절약하고 집중력을 유지할 수 있도록 도와줍니다. 그리고..
32편. 람다식(Lambda expression)
32편. 람다식(Lambda expression)
2022.02.22함수형 인터페이스(Functional Interface) 람다식을 이해하기 전에 함수형 인터페이스에 대한 이해가 필요합니다. 함수형 인터페이스(Funcational Interface)란 하나의 추상 메서드를 갖는 인터페이스를 말합니다. 자바 8 이후에 추가되었으며, 이를 SAM 인터페이스(Single Abstract Method interface)라고도 부릅니다. 함수형 인터페이스의 대표적인 예로는 스레드에서 살펴봤던 Runnable 인터페이스를 꼽을 수 있습니다. @FunctionalInterface public interface Runnable { public abstract void run(); } @FunctionalInterface 자바 8 이후부터는 함수형 인터페이스를 나타내는 @Functio..
34편. 애노테이션(Annotation)
34편. 애노테이션(Annotation)
2022.02.18애노테이션(Annotation) 애노테이션은 소스 코드에 대한 메타데이터(metadata), 즉 다른 데이터를 설명해 주는 데이터를 제공합니다. 주석(comments)과 마찬가지로 코드를 실행하는데 있어서 직접적인 영향을 미치지는 않습니다. 클래스, 메서드, 변수, 매개변수 등에 애노테이션을 달 수 있으며, 애노테이션은 아래와 같이 문자 @로 시작합니다. @Override public void foo() { // ... } 보통은 리플렉션과 같이 활용되며, 문서, 컴파일러 혹은 IDE, 테스트 프레임워크(JUnit, JCStress 등)나 ORM(Hibernate, JPA 등) 등과 같이 다양한 곳에서 상당히 유용하게 사용됩니다. 애노테이션의 위치 애노테이션이 들어갈 수 있는 위치는 상당히 다양합니다. ..
26편. 제네릭(Generic)
26편. 제네릭(Generic)
2022.02.06여기서 컬렉션을 몰라도 크게 지장은 없으나 예제에서 사용된 List가 무엇인지 궁금하시다면 컬렉션 편이랑 같이 병행해서 보시기 바랍니다. 제네릭(Generic) 타입 안정성(type safety) 제네릭의 주 목적은 바로 타입 안정성을 제공하고 타입 캐스팅 문제를 해결하는 것입니다. 예를 들면, 아래의 코드를 생각해봅시다. 리스트에 값을 추가할 때는 문제가 없어보이지만, 리스트에서 값을 꺼낼 때는 컴파일러가 꺼낸 값이 무슨 타입인지 모르기 때문에 명시적으로 캐스팅을 해야 한다는 번거로움이 있습니다. 여기서 캐스팅을 잘못하면 캐스팅을 할 수 없다는 런타임 예외가 발생하므로 주의해야 합니다. List list = new ArrayList(); list.add(123); list.add("가나다"); // 타..
25편. 중첩 클래스(Nested Class)
25편. 중첩 클래스(Nested Class)
2022.02.06중첩 클래스(Nested classes) 중첩 클래스는 말 그대로 클래스 내에 정의된 클래스를 말합니다. 어떤 클래스가 한 곳에서만 쓰인다면 아래와 같이 해당 클래스를 중첩시키고 두 클래스를 한꺼번에 관리하는 것이 적절합니다. class OuterClass { // 외부 클래스 // ... class NestedClass { // 중첩 클래스 // ... } } 중첩 클래스는 다시 static으로 선언되지 않은 중첩 클래스인 내부 클래스(inner class)와 static으로 선언된 중첩 클래스인 정적 클래스(static class)로 나뉩니다. 여기서는 두 용어를 구분하도록 하겠습니다. class OuterClass { // 외부 클래스 // ... class InnerClass { // 내부 클래스..
29편. 스레드(Thread) (2)
29편. 스레드(Thread) (2)
2022.01.27경쟁 상태(race condition) wait() & notify() wait() 메서드를 호출한 스레드는 획득한 락을 포기하고 대기 상태에 들어가며 다른 스레드가 동일한 객체의 락을 얻은 뒤 notify()나 notifyAll() 메서드를 호출할 때까지 깨어나지 않습니다. 주의하실 점은 락을 얻지 않은 상태에서 wait(), notify(), notifyAll() 메서드를 호출하면 IllegalMonitorStateException 예외가 발생합니다. 다른 스레드보다 락을 빠르게 얻기 위해서 경쟁 중인 스레드는 EntryList에 있습니다. 그 중 한 스레드가 객체의 락을 얻어서 실행 상태로 들어갔다가 wait() 메서드를 만나면 락을 포기하고 대기 상태로 들어가 WaitSet으로 이동합니다. 그리고..
정리. 프로세스(Process)
정리. 프로세스(Process)
2022.01.24이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.