분류 전체보기

    [Java] 백준 1005 (ACM Craft) Gold 3

    Problem : https://www.acmicpc.net/problem/1005 1005번: ACM Craft 첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N 과 건물간의 건설순서규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부 www.acmicpc.net Approach 위상정렬(Topological Sort)의 연습문제이다. 위상정렬 자체에 대해서는 간단히 설명하겠다. 알고리즘에서 꽤나 자주 나오는 개념이므로 숙지해두면 좋을 것이다. DAG(Directed Acyclic Graph: 방향성이 있고 싸이클이 없는 그래프)에 순서가 곁들여져 있는 경우, 위상정렬을 사용해 볼 수 있다. 위상정렬에서는 중요한 개념 하나가 있다. ..

    Head First: Design Patterns - 커맨드 패턴(Command Pattern)

    디자인 패턴: 커맨드 패턴(Command Pattern) 이 포스팅은 Head First: Design Patterns 책을 보고, 개인적으로 정리한 포스팅입니다. Command Pattern 이란? 커맨드 패턴(Command Pattern)을 이용하면 요구 사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구사항을 집어넣을 수도 있다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할 수 도 있고, 작업취소 기능도 지원 가능하다. 작업을 요청한 쪽과 그 작업을 처리하는 쪽을 분리시킬 수 있다는게 핵심이다. 커맨드 패턴에서는 커맨드 객체라는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구사항을 캡슐화한다. 이렇게 하기 위해서 행동과 리시버를 한 객체에 집어넣고, execute()라는..

    Head First: Design Patterns - 싱글턴 패턴(Singleton Pattern)

    디자인 패턴: 싱글턴 패턴(Singleton Pattern) 이 포스팅은 Head First: Design Patterns 책을 보고, 개인적으로 정리한 포스팅입니다. Singleton Pattern 이란? 싱글턴 패턴(Singleton Pattern)은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다. 중요한 것은 정적 변수와 정적 메소드이다. 천천히 살펴보겠다. 고전적인 싱글턴 패턴 싱글턴 패턴을 구현하기 위해서는 일반적으로 private 생성자를 가진 public 클래스를 이용한다. 앞서 말한 클래스의 경우에는 인스턴스를 절대 생성할 수 없으므로, 외부에서 생성하는 것이 아닌 인스턴스를 요청하도록 설계하여야 한다. 이 때 사용되는 getIn..

    [Java] 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy)

    Java 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy) 배열의 복사에는 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)가 있다. 두 복사의 큰 차이는 다음과 같다. 복사되는 배열 a와 a를 복사한 배열 b가 있을 때, 얕은 복사는 하나의 배열의 주소를 a와 b가 모두 가리키고 있다. 같은 배열을 가리키고 있기에, 한쪽 배열에서 수정이 일어나면 나머지 다른쪽 배열에서도 수정이 반영된다. 깊은 복사는 a와 b 모두 각각 다른 배열을 가리키고 있다. 따라서, 한쪽 배열에서 수정이 일어난다 하여도, 다른쪽 배열에 아무런 영향을 끼치지 못한다. 얕은 복사(Shallow Copy) 대입 연산자 =는 얕은 복사를 수행한다. 1차원 배열이든 다차원 배열이든 똑같다. 다음 예제를..

    [Java] Optional<T> Class 옵셔널

    java.util.Optional Class Optional 클래스는 'T'타입의 객체를 포장해주는 래퍼클래스(Wrapper Class)이다. Optional 클래스는 null이 올 수 있는 값을 감싸는 클래스로, 만약 null이 저장되어 있더라도 NullPointerException이 발생하지 않는다. public final class Optional { // If non-null, the value; if null, indicates no value is present private final T value; ... } value에 값을 저장하기 때문에 값이 null이라도 바로 참조 시에 NPE가 발생하지 않고, 또한 클래스이기 때문에 각종 메소드를 제공해준다. 자바에서는 기본 타입 스트림을 위한 별..

    [Java] Stream API - 3. 스트림 최종연산

    스트림(Stream) API Java SE 8부터 추가된 스트림(Stream) API는 데이터를 추상화하여 다루므로, 다양한 바식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다. 따라서 스트림 API를 이용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있다. 스트림(Stream) API의 특징 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리, 내부 반복(internal iteration)을 통해 작업을 수행한다. 스트림은 재사용이 가능한 컬렉션과는 달리, 단 한 번만 사용할 수 있다. 스트림은 원본 데이터를 변경하지 않는다. 스트림의 연산은 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능을 최적화한다. 스트림은..

    [Java] Stream API - 2. 스트림 중개연산

    스트림(Stream) API Java SE 8부터 추가된 스트림(Stream) API는 데이터를 추상화하여 다루므로, 다양한 바식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다. 따라서 스트림 API를 이용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있다. 스트림(Stream) API의 특징 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리, 내부 반복(internal iteration)을 통해 작업을 수행한다. 스트림은 재사용이 가능한 컬렉션과는 달리, 단 한 번만 사용할 수 있다. 스트림은 원본 데이터를 변경하지 않는다. 스트림의 연산은 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능을 최적화한다. 스트림은..

    [Java] Stream API - 1. 스트림 생성

    스트림(Stream) API Java SE 8부터 추가된 스트림(Stream) API는 데이터를 추상화하여 다루므로, 다양한 바식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다. 따라서 스트림 API를 이용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있다. 스트림(Stream) API의 특징 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리, 내부 반복(internal iteration)을 통해 작업을 수행한다. 스트림은 재사용이 가능한 컬렉션과는 달리, 단 한 번만 사용할 수 있다. 스트림은 원본 데이터를 변경하지 않는다. 스트림의 연산은 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능을 최적화한다. 스트림은..

    [Java] Lambda Expression (람다 표현식)

    Lambda Expression(람다 표현식) 람다표현식은 간단히 말해 메소드를 하나의 식으로 표현한 것이다. 다음 메소드와 람다표현식은 같은 기능을 한다. // 메소드 int min(int x, int y){ return x x ) 기호를 사용하여 람다식을 작성한다. 문법은 다음과 같다. (매개변..

    Head First: Design Patterns - 추상 팩토리 패턴(Abstract Factory Pattern)

    디자인 패턴: 추상 팩토리 패턴(Abstract Factory Pattern) 이 포스팅은 Head First: Design Patterns 책을 보고, 개인적으로 정리한 포스팅입니다. 이전 포스팅 간단한 팩토리, 팩토리 메소드 패턴과 연결되는 내용입니다. Abstract Factory Pattern 이란? 추상 팩토리 패턴(Abstract Factory Pattern)에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다. 추상 팩토리 패턴을 사용하면 클라이언트에서 추상 인터페이스를 통해서 일련의 제품들을 공급받을 수 있다. 이 때, 실제로 어떤 제품이 생산되는지는 전혀 알 필요도 없다. 따라서 클라이언트와 팩토리에서 생산되는 제품을 분리할 수 있..