Language

    [Java] EOF(End Of File) 처리하기

    EOF(End Of File) EOF(End Of File)은 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 의미한다. Scanner와 BufferedReader 두 클래스의 EOF 처리를 알아보자. Scanner 보다 BufferedReader 가 성능면에서 우월하다. Scanner Scanner sc = new Scanner(System.in); while(sc.hasNextLine()) { sc.nextLine(); } while(sc.hasNext()) { sc.next(); } BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = ""; // 1 whil..

    객체지향 프로그래밍(OOP)의 특징(4)과 설계 원칙(5)

    객체지향 프로그래밍(OOP) 객체지향 프로그래밍(Object-Oriented Programming)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위(객체)들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체지향 프로그래밍은 다음과 같은 장점을 가진다. 코드의 재사용성 증가 유지보수의 용이 간결한 코드 OOP의 5가지 특성 관점에 따라 4가지 (추상화, 캡슐화, 다형성, 상속) 로 보기도 한다. 추상화, Abstraction 추상화는 인터페이스로 클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현한다. 인터페이스와 구현을 분리함으로써, 객체가 가진 특성 중 필수 속성만으로 객체를 묘사하고 유사성만을 표현하며 세부적인..

    [Java] 정규 표현식(Regular Expression)

    정규 표현식(Regular Expression) 위키피디아에서는 정규표현식을 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어라고 정의하고 있다. 자바에서는 다음과 같은 곳에서 정규표현식 regex을 사용한다. 자바의 정규표현식 정규표현식에는 여러 종류가 있지만 가장 대표적으로 두 개의 정규표현식이 있다. UNIX 계열의 표준 정규표현식인 POSIX 정규표현식 POSIX 정규표현식에서 확장된 Perl 방식의 정규표현식 자바에서는 Perl 방식과 유사한 방식을 선택하고 있지만, Perl 방식과 완전히 똑같은 것은 아니다. 그 차이점은 oracle docs에 수록되어 있다. 내장 메소드의 파라미터 자바의 String 클래스의 내장 메소드를 살펴보면 인자로 String regex 같은 것을 볼..

    [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 ) 기호를 사용하여 람다식을 작성한다. 문법은 다음과 같다. (매개변..

    [Java] HashMap 메소드 및 사용법

    HashMap HashMap을 정의한다면, '키에 대한 해시 값을 사용하여 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증가하는 associate array'라고 할 수 있으며, 이 associate array(연관 배열)은 Map, Dictionary, Symbol Table 이라고도 불리운다. 간단하게 말하자면 Key-Value의 형태를 가진, Key와 Value가 1:1 매핑이 되어 하나의 쌍(Pair)으로 하여 중복된 Key를 허용하지 않는 기본적으로 순서가 없는 자료구조이다. 기본적으로 equals()를 사용하여 중복을 판단하기에 primitive data type은 걸러지지만, 객체(Object)는 객체의 값이 같더라도 equals()에서 서로 다르다고 판단하기 때문에 걸..