JAVA
java.util.function 패키지
java.util.function 패키지
2022.08.01java.util.function 패키지 (1/3) 자주 사용되는 다양한 함수형 인터페이스를 제공 java.util.function 패키지는, 자주 사용되는 다양한 함수형 인터페이스를 제공한다. Runnalbe은 우리가 쓰레드에서 배웠던 것인데, 매개변수도 없고, 반환값도 없는 경우에 Runnalbe인터페이스를 사용하면 된다. 공급자 Supplier라는 함수형 인터페이스는 매개변수는 없고, 반환값만 있다. 소비자 Consumer는 Supplier와 반대로 매개변수만 있고, 반환값이 없다. 함수 Function은 일반적인 함수, 하나의 매개변수를 받아서 결과를 반환한다. 조건식 Predicate는 함수와 똑같은데 어떤차이가 있냐면, 입력받은 결과를 true아니면 false로 반환한다. 조건식을 표현하는데 ..
함수형 인터페이스
함수형 인터페이스
2022.07.30함수형 인터페이스 함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스 함수형 인터페이스는 단 하나의 추상 메서드만 선언된 인터페이스를 말한다. 예를 들어 이러한 인터페이스를 함수형 인터페이스라고 한다. 함수형 인터페이스에는 "@FunctionalInterface" 애노테이션을 작성해준다. 해당 애토테이션을 작성하지 않아도 에러가 나진 않지만, 해당 애노테이션을 작성해주면, 이 함수형 인터페이스를 올바르게 작성했는지 컴파일러가 체크해준다. 그래서 붙여주는 것이 좋다. MyFunction이라는 함수형 인터페이스는 max()라는 메서드를 하나 가지고 있고, 이것을 구현하면, 이렇게 된다. 익명 클래스의 선언, 객체 생성을 동시에 한 것이다. new 조상이름(이때 조상이름은 클래스 or 인터페이스)..
람다식, 람다식 작성하기
람다식, 람다식 작성하기
2022.07.28람다식 (Lambda Expression) 함수(메서드)를 간단한 '식(expression)'으로 표현하는 방법 람다식이란, 함수(메서드)를 간단한 식(expression)으로 표현하는 방법 이다. 예를 들어, max라는 메서드가 있을 때, 우측처럼 짧게 표현하려고 하는 것이 람다식이다. 익명 함수(이름이 없는 함수, anonymous function) 이 메서드를 람다식으로 바꿀 때 어떻게 하냐면, 반환 타입과 이름을 지운다. 그리고 {}블록 앞에 "->" 화살표를 넣는다. 그러면 람다식이 된다. 이렇게하면 이름이 없어지기 때문에 익명함수라고 한다. 함수와 메서드의 차이 근본적으로 동일, 함수는 일반적 용어, 메서드는 객체지향개념 용어 함수는 클래스에 독립적, 메서드는 클래스에 종속적 람다식 작성하기 ..
wait()과 notify()
wait()과 notify()
2022.07.27이전 시간에, synchronized 키워드를 이용해서 동기화 하는 방법에 대해서 알아보았었다. 동기화는 하면 데이터 보호라는 장점이 있다. 하지만 비효율적이라는 단점도 있다. 한번에 한 쓰레드만 임계영역에 들어갈 수 있으니 말이다. 그래서 동기화를 하면 프로그램의 효율이 떨어진다. 이 효율을 높일 방법을 생각해서 만들어낸 것이, wait()과 notify()이다. wait()과 notify() 동기화의 효율을 높이기 위해 wait(), notify()를 사용 Object클래스에 정의되어 있으며, 동기화 블록 내에서만 사용할 수 있다. - wait() - 객체의 lock을 풀고 쓰레드를 해당 객체의 wating pool에 넣는다. - notify() - waiting pool에서 대기중인 쓰레드 중의 하..
쓰레드의 동기화
쓰레드의 동기화
2022.07.09쓰레드의 동기화(synchronization) 멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다. 진행중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 '동기화'가 필요 멀티 쓰레드 프로세스에서는 여러 프로세스가 같은 자원을 공유하기 때문에 메모리도 공유한다. 그래서 어떤 한 쓰레드가 작업하던 것을 마치지 못하고 다른 쓰레드로 차례가 넘어갔을 때, 그 쓰레드가 다른 쓰레드의 작업에 영향을 줄 수 있다. 그래서 작업이 끝나지 않은 경우에 다른 쓰레드가 그 작업을 방해하지 않도록 하려면 "동기화"가 필요하다. 동기화란, 어떤 쓰레드가 진행중인 작업을 다른 쓰레드가 간접하지 못하게 막는 것이다. 동기화하려면 간섭받지 않아야 하는 문장들을 '임계 영역'으로 설정 그래서 동기화를 하려면, 다른..
join(), yield()
join(), yield()
2022.07.07join() 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다. A라는 쓰레드가 있을 때, B라는 쓰레드가 따로 돌고 있는데, A가 작업하다보니, B가 작업을 마쳐야(혹은 어떤 작업을 해야) 특정 일을 진행할 수 있을때는, A는 B가 작업을 다 마칠 때 까지 기다려야한다. 그럴때 사용하는 것이 join()이다. 그런데, 기다리는 시간을 정해주는데, 얼마나 기다릴지를 지정할 수 있다. 그런데 시간을 지정해 주지 않으면 작업이 모두 끝날 때 까지 기다려야한다. 사용법은 sleep()과 유사하다. try-catch로 감싸 주어야 하는데, 인터럽트가 발생하면 기다리는 것을 멈추게 된다. 그래서 예외처리를 해줘야 한다. 쓰레드 2개 만들어서 돌리다가, 쓰레드1작업이 끝날 때까지 기다리고, 쓰레드 2작업이 끈날..