Stream거의 모든 자바 애플리케이션은 컬렉션을 만들고 활용한다. 하지만 컬렉션으로 모든 문제가 해결되는 것은 아니다. 예를 들어 리스트에서 고가의 트랜잭션(거래)만 필터링한 다음에 통화로 결과를 그룹화해야 한다고 가정하자. 다음 코드처럼 많은 기본 코드를 구현해야한다.Map transactionsByCurrencies = new HashMap(); for(Transaction transaction : transactions){ if(transaction.getPrice() > 1000) { Currency currency = transaction.getCurrency(); List transactionsForCurrency = transactionsByCurrencies.get(currency); i..
자바는 1996년 자바 개발 키트(JDK 1.0)가 발표된 이후로 많은 사람들이 적극적으로 활용했다. 그래서 java7(2011)까지 많은 변화가 생겼고 가장 큰 변혁이 있었다는 java8(2014)이 탄생하였다. java9 에서도 중요한 변화가 있었지만 java8 만큼 획기적이거나 생산성이 바뀌는 것은 아니었다. java10 에서는 형 추론과 관련해 약간의 변화만 일어났다. 이런 크고 작은 변화 덕분에 프로그램을 더 쉽게 구현할 수 있게 되었다. 예를들어 다음은 사과 목록을 무게순으로 정렬하는 고전적 코드다. Collections.sort(inventory, new Comparator() { public int compare(Apple a1, Apple a2) { return a1.getWeight()..
붕어빵과 붕어빵틀 처음 Java를 접하게 될 경우 객체와 클래스에 관해 설명을 위와같이 들어본 사람이 아마 대다수 일 것이다. 하지만 이것은 쉽게 설명하려고 하다보니 생긴 오류다. 개발을 할 때 이러한 부분을 정확하게 선 긋고 확실한 개념으로 일하고 싶기에 이 부분의 오해를 풀어보려한다. 클래스 객체명 = new 클래스(); 일반적으로 위와 같이 클래스로 객체를 생성하는 방식이다. 이를 붕어빵과 붕어빵틀로 바꿔 비유해보겠다. 붕어빵틀 붕어빵 = new 붕어빵틀(); 이 부분이 아직 잘 이해가 안간다면 붕어빵틀을 생산하는 금형기계가 있다고 해보자. 그럼 붕어빵틀이 붕어빵을 찍어내서 클래스라고 한다면 같은 논리로 금형 기계는 붕어빵틀을 찍어내는 클래스가 된다. 이를 코드로 나타내면 다음과 같다. 금형기계 붕..
표준입출력 - System.in, System.out, System.err 표준입출력은 콘솔을 통한 데이터 입력과 콘솔로의 데이터 출력을 의미한다. 자바에서는 표준 입출력을 위해 3가지 입출력 스트림 System.in, System.out, System.err을 제공하는데, 이 들은 자바 어플리케이션의 실행과 동시에 사용할 수 있게 자동적으로 생성되기 때문에 개발자가 별도로 스트림을 생성하는 코드를 작성하지 않고도 사용이 가능하다. 자바를 처음 시작할 때부터 지금까지 줄 곧 사용해온 System.out을 스트림의 생성없이 사용할 수 있었던 것이 바로 이러한 이유다. File 파일은 기본적이면서도 가장 많이 사용되는 입출력 대상이기 때문에 중요하다. 자바에서는 File클래스를 통해서 파일과 디렉토리를 다룰..
입출력이란? I/O란 input과 output의 약자로 입력과 출력, 간단히 줄여서 입출력 또는 아이오라고 한다. 즉, 컴퓨터 내부 또는 외부와의 장치와 프로그램간의 데이터를 주고 받는 것을 말한다. 스트림(stream) 자바에서 입출력을 수행하려면, 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림이라고 정의했다. 입출력에서의 스트림은 '람다와 스트림'에서 같은 용어를 쓰지만 다른 개념이다. 스트림이란 데이터를 운반하는데 사용되는 연결통로이다. 스트림이란 연속적인 데이터의 흐름을 물에 비유해서 붙여진 이름인데, 여러 가지로 유사한 점이 많다. 물이 한쪽 방향으로만 흐르는 것과 같이 스트림은 단방향통신만 가능하기 때문에 하나의 스..
스트림이란? 우리는 많은 수의 데이터를 다를 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과는 얻기 위해 for문과 Iterator를 이용해서 코드를 작성해왔다. 그러나 이러한 방식으로 작성된 코드는 너무 길고 알아보기 어렵다. 그리고 재사용성도 떨어진다. 또 다른 문제로는 데이터 소스마다 다른방식으로 다뤄야한다는 것이다. 이러한 문제들을 해결하기 위해 나왔다. 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았다. 데이터 소스를 추상화하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과 재사용성이 높아지는 것. 그래서 스트림을 이용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰 수 있다. Stri..
람다식이란? 람다식은 간단히 말해서 메서드를 하나의 식(expression)으로 표현한 것이다. 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 '익명함수'라고도 한다. int[] arr = new int[5]; Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1); 위 문장에서 ( ) ->(int)(Math.random()*5)+1 이 바로 람다식이다. 이 람다식이 하는 일을 메서드로 표현하면.. int method() { return (int)(Math.random()*5 + 1; } 모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야하고, 객체도 생성해야..
쓰레드의 실행제어 쓰레드 프로그래밍이 어려운 이유는 동기화와 스케줄링 때문이다. 앞서 우선순위를 통해 쓰레드간의 스케줄링을 하는 방법을 배웠지만 이것만으로는 한참 부족하다. 효율적인 프로그램을 만들기 위해서는 보다 정교한 스케줄링을 통해 주어진 자원과 시간을 여러 쓰레드가 낭비없게 잘 사용하도록 해야한다. 메서드 설명 static void sleep(long millis) static void sleep(long millis, int nanos) 지정된 시간(천분의 일초 단위)동안 쓰레드를 일시정지시킨다. 지정한 시간이 지나고 나면, 자동적으로 다시 실행대기 상태가 된다. void join() void join(long millis) void join(long millis, int nanos) 지정된 시..