스트림이란? 우리는 많은 수의 데이터를 다를 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과는 얻기 위해 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) 지정된 시..
프로세스란 간단히 말해서 실행 중인 프로그램이다. 프로그램을 실행하면 OS로부터 실행에 필요한 자원을 할당 받아 프로세스가 됨. 프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리등의 자원 그리고 쓰레드로 구성되어 있으며 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다. 그래서 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티 쓰레드 프로세스라고 한다. 하나의 프로세스가 가질 수 있는 쓰레드 개수는 제한되어 있지않지만 메모리 공간 때문에 적절한 갯수를 사용해야한다. 멀티태스킹과 멀티쓰레딩 윈도우나 유닉스같은 대부분의 OS는 멀티태스킹을 지원하기 때문에 여러 개의 프로세스가 동시에 실행될 수 있다. 이와 마찬가지로 멀티쓰레딩은 하나..
열거형이란? JDK1.5부터 새로 추가된 기능인데 C언어의 열거형보다 더 향상된 것으로 열거형이 갖는 값뿐만 아니라 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다. class Card { static final int CLOVER = 0; static final int HEART = 1; static final int DIAMOND = 2; static final int SPADE = 3; static final int TWO = 0; static final int THREE = 1; static final int FOUR = 2; final int kind; final int num; } ↓ class Card { enum Kind { CLOVER, HEART, DIAMOND, SPADE..
먼저 Vector와 ArrayList에 관한 기본적인 지식이 부족한 사람들은 이전 글인 컬렉션부터 보고 오면 될 것 같다. https://smujihoon.tistory.com/155 다시 하자 기초! 컬렉션 프레임워크 컬렉션 프레임웍 데이터 군을 저장하는 클래스들을 표준화한 설계를 뜻한다. 다수의 데이터, 즉 데이터 그룹을, 프레임웍은 표준화된 프로그래밍 방식을 의미한다. JDK1.2 이전까진 Vector, HashTable, Properties.. smujihoon.tistory.com 동기화란? 동기화는 쓰레드가 하나의 자원을 놓고 싸우지 말고 락을 가진 쓰레드부터 차례대로 그 자원을 쓰고 다음 쓰레드에게 락과 함께 자원을 반납하는 것을 말합니다. 주의할점은 동기화를 안해도 되는 부분을 괜히 동기화..
지네릭스 (Generics) JDK1.5에서 처음 도입된 지네릭스는 JDK1.8부터 도입된 람다식만큼 큰 변화였다. 그 당시만 해도 지네릭스는 선택적으로 사용하는 경우가 많았지만 이제는 지네릭스를 모르고는 Java API문서조차 제대로 보기 어려울 만큼 중요한 위치를 차지 지네릭스란? 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다. 객체의 타입 안전성을 높이고 형변환의 번거로움이 줄어든다. 안정성을 높인다는 것은 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류를 줄여준다는 뜻이다. 예를 들어 ArrayList는 다양한 객체를 담을 수 있지만 보통 한 종류의 객체를 ..
컬렉션 프레임웍 데이터 군을 저장하는 클래스들을 표준화한 설계를 뜻한다. 다수의 데이터, 즉 데이터 그룹을, 프레임웍은 표준화된 프로그래밍 방식을 의미한다. JDK1.2 이전까진 Vector, HashTable, Properties와 같은 컬렉션 클래스, 다수의 데이터를 저장할 수 있는 클래스들을 서로 다른 각자의 방식으로 처리해야 했으나, JDK1.2부터 컬렉션 프레임웍이 등장하면서 다양한 종류의 컬렉션 클래스가 추가되고 모든 컬렉션 클래스를 표준화된 방식으로 다룰 수 있도록 체계화되었다. 컬렉션 프레임웍의 핵심 인터페이스 크게 3가지 타입이 존재한다. List, Set, Map으로 말이다. 그리고 인터페이스 List와 Set의 공통된 부분을 다시 뽑아서 새로운 인터페이스인 Collection을 추가로..