Java (28) 썸네일형 리스트형 자바의 람다(Lambda) 자바에서 JDK1.8부터 람다식(lambda expression)을 도입함으로써, 객체지향언어였던 자바가 동시에 함수형 언어가 되었습니다. 이번 포스팅은 람다식에 관해서 작성하였습니다. 람다식이란? 메서드를 하나의 식(expression)으로 표현한 것입니다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지게 됩니다. 그래서 람다식을 '익명 함수(anonymous function)'라고도 합니다. 람다식은 메서드를 변형한 형태이지만, 변수처럼 다룰 수 있습니다. 즉, 메서드의 매개변수로 전달되는 것도 가능하고, 메서드의 결과로 반환될 수도 있습니다. 람다식의 형태 람다식은 아래와 같이 메서드를 식(expression)으로 바꿀 수 있습니다. 메서드: 반환타입 메서드이름(매개변수 리스트) { .. volatile 키워드 자바 코드를 보면 특정 변수 앞에 volatile이라는 키워드가 붙어져 있는 경우를 볼 수 있습니다. volatile 키워드가 무엇이고 왜 사용되는지에 대해서 해당 포스팅을 작성하였습니다. 자유롭게 피드백해 주시면 감사하겠습니다!! volatile 키워드 필요한 이유 먼저, volatile 키워드가 무엇인지에 대하여 설명하기 전에 왜 volatile 키워드가 필요한지 그 배경에 대해서 알아보겠습니다. 싱글 코어 프로세서가 장착된 컴퓨터가 아닌, 멀티 코어 프로세서로 돌아가는 컴퓨터에서는 코어마다 별도의 캐시를 가지고 있습니다. 코어는 메모리에서 어떤 값을 읽어와서 캐시에 저장한 후, 캐시에서 값을 읽어서 작업합니다. 해당 값이 필요할 때 우선 캐시에 값이 저장되어 있는지 확인한 후, 없으면 메모리에서 값.. Lock과 Condition (await()과 signal(),signalAll()) synchronized 블록으로 동기화를 구현하면 원하는 쓰레드를 선택해서 notify()를 할 수 없어 경쟁상태(race condition)와 기아상태(starvation)가 발생할 수 있습니다. 해당 내용은 아래 포스팅에서 확인하실 수 있습니다! https://silver-programmer.tistory.com/entry/wait%EA%B3%BC-notify-notifyAll wait()과 notify(), notifyAll() 멀티 쓰레드로 구성된 프로세스에서 임계 영역을 보호하기 위해, 즉 쓰레드의 동기화를 위해 synchronized 키워드를 활용합니다. 혹시 synchronized에 대해서 개념을 알고 싶으신 분들은 아래 포스팅을 silver-programmer.tistory.com 이 때 .. wait()과 notify(), notifyAll() 멀티 쓰레드로 구성된 프로세스에서 임계 영역을 보호하기 위해, 즉 쓰레드의 동기화를 위해 synchronized 키워드를 활용합니다. 혹시 synchronized에 대해서 개념을 알고 싶으신 분들은 아래 포스팅을 참고해 주세요! https://silver-programmer.tistory.com/entry/synchronized%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%93%B0%EB%A0%88%EB%93%9C%EC%9D%98-%EB%8F%99%EA%B8%B0%ED%99%94 synchronized를 이용한 쓰레드의 동기화 이번 포스팅은 쓰레드의 동기화를 위한 synchronized에 대하여 작성하였습니다. 싱글 쓰레드가 아닌 멀티 쓰레드로 프로세스를 구성할 때, 같은 자.. synchronized를 이용한 쓰레드의 동기화 이번 포스팅은 쓰레드의 동기화를 위한 synchronized에 대하여 작성하였습니다. 싱글 쓰레드가 아닌 멀티 쓰레드로 프로세스를 구성할 때, 같은 자원을 공유해서 작업을 하게 됩니다. 따라서 서로의 작업에 영향을 미치게 되고 이로 인해 의도했던 것과는 다른 결과를 얻을 수 있게 되는 문제점이 있습니다. 아래 예시를 통해 어떤 문제점이 발생하는지 확인해 보겠습니다. public class Main { public static void main(String[] args) { Runnable r1 = new Thread_0(); new Thread(r1).start(); new Thread(r1).start(); } } class Thread_0 implements Runnable { TargetInstan.. 제네릭(Generic) 타입의 형변환 이번 포스팅에서는 제네릭 타입에서는 어떤 형변환이 가능하고 불가능한지에 대해서 알아보겠습니다. 1. 제네릭타입과 원시 타입끼리의 형변환 아래의 코드처럼 제네릭타입과 원시 타입끼리는 형변환이 가능하지만 경고가 발생합니다. class Box {} public class Main { public static void main(String[] args) { Box box = new Box(); Box stringBox = new Box(); box = (Box)stringBox; // 가능, but 경고 발생 stringBox = (Box) box; // 가능, but 경고 발생 } } 2. 제네릭 타입 간의 형변환 대입된 타입이 같은 제네릭 타입끼리는 당연히 형변환이 가능합니다. 그렇다면 다른 제네릭 타입 간.. Thread 실행 제어 여러 thread가 실행될 때 Thread 클래스에서 제공하는 다양한 메서드를 통해 쓰레드들끼리의 실행 순서를 정하거나, 실행을 일시정지시키는 등 실행 제어가 가능합니다. 이번 포스팅은 쓰레드 실행 제어에 관련 있는 메서드에 대해서 알아보겠습니다! Thread 실행 제어 메서드 종류 메서드 설명 static void sleep(long millis) static void sleep(long millis, int nanos) 지정된 시간동안 쓰레드를 일시정지 시킵니다. 지정한 시간이 지나면 자동적으로 다시 실행대기상태가 됩니다. (millis: 1000분의 일초, nanos:10억분의 일초) void join() void join(long millis) void join(long millis, int na.. 제네릭(Generic)이란? 자바의 제네릭(Generic)은 다양한 타입의 객체를 다루는 메서드나 컬렉션 클래스에 컴파일 시 컴파일 체크를 해주는 기능을 제공해 줍니다. 컴파일 시에 타입 체크를 해주기 때문에 객체의 타입 안정성을 높이고 형변환을 할 필요가 없어 편리합니다. 즉, 타입 안정성을 제공해 주기 때문에 의도하지 않은 타입의 객체가 저장되는 것을 방지하고, 저장된 객체를 꺼내올 때 잘못 형변환 되는 것을 막아줍니다. 이번 포스팅은 자바의 제네릭에 관한 내용을 폭넓게 다뤘습니다. 제네릭 자체가 내용이 많다 보니 이해하기가 어려웠는데 이번 포스팅을 보고 도움이 되길 바랍니다!! 제네릭 클래스 선언 제네릭 클래스는 아래와 같이 선언하면 됩니다. public class Box { T item; void setItem(T item).. 이전 1 2 3 4 다음