2020년 10월 2일 금요일

자바8, 함수형인터페이스, Consumer, Function, Predicate, Supplier(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

 

자바8, 함수형인터페이스, Consumer, Function, Predicate, Supplier(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)


http://ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=773



https://youtu.be/gWIks_tLsFI





자바8, 함수형인터페이스, Consumer, Function, Predicate, Supplier(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

1. 함수형 인터페이스(Functional Interface)

추상메소드가 하나뿐인 인터페이스를 Functional Interface라고 한다.

자바8 부터는 람다식을 사용하여 함수형 인터페이스의 인스턴스를 나타낼 수 있다.

함수형 인터페이스에는 여러 개의 default 메서드가 있을 수 있다.

함수형 인터페이스의 인스턴스를 생성하기 위해 익명 클래스 등을 주로 사용했지만 람다식을 이용하면 편하다.

자바8에서 추가된 @FunctionalInterface 어노테이션은 함수형 인터페이스 임을 나타낸다.

Runnable, ActionListener, Comparable은 함수형 인터페이스 이며 자바8 이전에는 익명 클래스의 객체를 생성하거나 이러한 인터페이스를 구현해야 했지만 람다식을 이용하여 편리하게 구현할 수 있다.

Runnable 인터페이스의 인스턴스를 람다식을 이용하여 아래처럼 얻을 수 있다.

Runnable r = () -> System.out.println("oraclejava community");

쓰레드를 생성할 때 람다식을 이용할 수 있다.

new Thread( () -> System.out.println(“oraclejavacommunity”) )

[예제]

@FunctionalInterface

interface Worker {

public void work();

}

public class FITest {

static void execute(Worker worker) {

worker.work();

}

public static void main(String[] args) {

execute(new Worker() {

public void work() {

System.out.println("Hello~ 오라클자바커뮤니티");

}

});

execute( ()->System.out.println("Hello~ oraclejava community"));

}

}

2. java.util.function 패키지

함수형 인터페이스

java.util.function 패키지에는 몇가지 미리 정의된 함수형 인터페이스가 있다

Predicate: 하나의 매개변수를 주는 boolean형을 반환하는 test 메소드가 있다.

public interface Predicate<T> { boolean test(T t); }

Predicate<String> p = str -> str.isEmpty();

Boolean b = p.test(“ojc.asia”); //false

Consumer: 하나의 매개변수를 주는 void 형 accept 메소드가 있다.

public interface Consumer<T> { void accept(T t); }

Consumer<String> c = (s) -> System.out.println(s);

c.accept(“ojc.asia”); //ojc.asia

Function: T 유형의 인수를 취하고 R 유형의 결과를 반환하는 추상 메소드 apply가 있다.

public interface Function<T, R> { R apply(T t); }

Function<String, boolean> f = s -> s.isEmpty();

boolean b = f.apply(“ojc.asia”); //false

Supplier: 메소드 인자는 없고 T 유형의 결과를 반환하는 추상 메소드 get이 있다.

public interface Supplier<T> { T get(); }

Supplier<String> s = () -> “ojc.asia”;

String res = s.get(); //ojc.asia

UnaryOperator: 하나의 인자와 리턴타입을 가진다. T -> T

UnaryOperator<String> u = (s) -> “hello~ “ + s;

System.out.println(u.apply(“ojc.asia”)); //hello~ ojc.asia

//두 개의 인수, 동일한 타입의 결과를 반환하는 추상 메서드 apply가 있다.

BinaryOperator: A binary operator from (T, T) -> T

BinaryOperator bo = (s1, s2) -> s1 +”, ” + s2;

System.out.println(bo.apply(“Hello~”, “ojc.asia”));

3. 실습

package javatest;

import java.util.Arrays;

import java.util.List;

import java.util.function.Consumer;

import java.util.function.Function;

import java.util.function.Predicate;

import java.util.function.Supplier;

public class FITest2 {

public static void main(String[] args) {

List<String> cities = Arrays.asList("SEOUL","BUSAN","DAEGU","GWANGJU","JUNJU");

//하나의 매개변수를 주는 boolean형을 반환하는 test 메소드가 있다.

Predicate<String> p = (s)->s.startsWith("S");

for(String s: cities) {

if (p.test(s)) {

System.out.println("1. Predicate : S로 시작..." + s);

}

}

//하나의 매개변수를 주는 void 형 accept 메소드가 있다.

Consumer c = (s) -> {

if (s.toString().startsWith("S"))

System.out.println("2. Consumer : S로 시작..." + s);

};

cities.forEach(c);

//메소드 인자는 없고 T 유형의 결과를 반환하는 추상 메소드 get이 있다.

Supplier<String> s = () -> cities.toString();

System.out.println("3. Supplier : " + s.get());

//T 유형의 인수를 취하고 R 유형의 결과를 반환하는 추상 메소드 apply가 있다.

Function<String, Boolean> f = str -> str.startsWith("S");

for(String str: cities) {

if (f.apply(str)) {

System.out.println("4. Function : S로 시작..." + str);

}

}

}

}

1. Predicate : S로 시작...SEOUL

2. Consumer : S로 시작...SEOUL

3. Supplier : [SEOUL, BUSAN, DAEGU, GWANGJU, JUNJU]

4. Function : S로 시작...SEOUL



#자바함수형인터페이스, #함수형인터페이스, #자바Consumer, #자바Predicate, #자바Function, #자바Lambda,#람다식, #자바8, #자바8람다,#자바,#JAVA,#자바동영상,#자바강의,#자바교육,#자바강좌,#자바동영상강의,#추천자바강의,#추천자바강좌,#JAVA동영상,#JAVA강의,#JAVA강좌,#JAVA교육,#JAVA,#추천JAVA강의,#추천JAVA교육,#추천JAVA강좌,#자바소스,#자바온라인교육,#자바온라인강의



2020년 10월 1일 목요일

자바8, 람다식(Lambda Expression)이론,실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

 자바8, 람다식(Lambda Expression)이론,실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)      


ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=772

자바8, 람다식(Lambda Expression)이론,실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영��

자바8, 람다식(Lambda Expression)이론,실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)1. 람다식(Lambda Expression)프로그래밍에서 식별자 없이 함수를 실행할

ojc.asia


https://youtu.be/slP0ABnU_Wc


 

1. 람다식(Lambda Expression)


프로그래밍에서 식별자 없이 함수를 실행할 수 있는 방법을 제공

자바8 이전에는 '메소드'라는 함수 형태가 존재하지만 객체를 통해서만 접근이 가능하고, 메소드 그 자체를 변수로 사용하지는 못한다.

자바8에서는 함수를 변수처럼 사용할 수 있기 때문에, 파라미터로 다른 메소드의 인자로 전달할 수 있고, 리턴값으로 함수를 받을 수도 있다. 

이름없는 익명 함수 구현에서 주로 사용한다.

함수형 인터페이스의 인스턴스(구현 객체)를 표현한다.

추상 메소드가 하나인 인터페이스를 함수형 인터페이스 하고 하고 이 구현 객체를 람디식으로 표현한다. 람다식으로 하나뿐인 추상 메소드를 구현하는데, 이를 통해 함수형 인터페이스를 구현하는 것이다.


프로그래밍에서 식별자 없이 함수를 실행할 수 있는 방법을 제공

유형 선언-람다식에서 매개 변수의 유형을 선언 할 필요가 없다. 컴파일러는 매개 변수 값에서 동일하게 추론 할 수 있습니다.

매개 변수 주위의 선택적 괄호-괄호 안에 단일 매개 변수를 선언 할 필요가 없습니다. 매개 변수가 여러 개인 경우 괄호가 필요하다.


선택적 중괄호-본문에 단일 문이 포함 된 경우 식 본문에 중괄호를 사용할 필요가 없다. 문장이 여럿인 경우 중괄호({}) 사용한다.


선택적 반환 키워드-본문에 값을 리턴하는 단일 표현식이 있는 경우 컴파일러는 자동으로 값을 반환한다.(식이 값을 반환 함을 나타내려면 중괄호가 필요함)



람다식 형식

(arg1, arg2...) -> { body }   

    body에 표현식이 없거나 한개이상 올 수 있다.

(params) -> expression

(params) -> statement

(params) -> { statements }

(int a, int b) -> {  return a + b; }

() -> System.out.println("Hello World"); //파라미터없고 Hello World 출력

(String s) -> { System.out.println(s); } //String s입력매개변수로 받아 출력

() -> 8514790            //파라미터없고 8514790가 리턴

() -> { return 3.14 };   //파라미터없고 3.14리턴


2. 실습1

interface Hello {

   void sayHello(String name);


// default를 쓰면 인터페이스 내부에서도 코드가 포함된 메소드를 선언 할 수 있다.

   default void sayDefaultHello(String name) {

      System.out.println("안녕~ " + name);

   }

}


public class LambdaTest {

   public static void main(String[] args) {

      Hello h = (name) -> System.out.println("hello~ " + name);

      h.sayHello("이종철");


      h.sayDefaultHello("이종철");

   }

}


안녕~ 이종철

hello~ 이종철


3. 실습2


package javatest;

import java.util.ArrayList;

import java.util.function.Consumer;

public class LambdaTest2 {

public static void main(String[] args) {


        ArrayList<String> list = new ArrayList<String>(); 

        list.add("SEOUL"); 

        list.add("BUSAN"); 

        

        list.forEach( new Consumer<String>() {

         public void accept(String s) {

         System.out.println(s);

         }

        });

  

        //Consumer I/F 구현객체를 람다로 구현

        list.forEach(s -> System.out.println(s)); 

        list.forEach(System.out::println); 

}

}



SEOUL

BUSAN

SEOUL

BUSAN

SEOUL

BUSAN




#자바람다식, #자바Lambda, #람다식, #자바8, #자바8람다, #자바#JAVA#자바동영상#자바강의#자바교육#자바강좌#자바동영상강의#추천자바강의#추천자바강좌#JAVA동영상#JAVA강의#JAVA강좌#JAVA교육#JAVA#추천JAVA강의#추천JAVA교육#추천JAVA강좌#자바소스#자바온라인교육#자바온라인강의   

자바 스레드 동기화(wait, notify, synchronized)이론.실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

 


자바 스레드 동기화(wait, notify, synchronized)이론.실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)     

 

1. 스레드 동기화 방법 

 

wait

Object 클래스의 메소드로 이 메소드를 호출하는 스레드는 그 실행이 멈추게 된다. 하지만 아무 스레드나 실행이 멈추는 것은 아니며 호출하는 객체의 모니터를 가지고 있는 경우에만(synchronized 구문 안에 들어와 있는 경우) 해당이 된다. 즉 객체의 모니터를 가지고 있는 스레드가 wait 메소드를 호출하면 실행이 멈춘다는 뜻이다. 멈춘스레드는 그 객체의 모니터를 반환하고 대기한다.

이렇게 멈춘 스레드를 깨우려면 notify() 메소드를 호출하든지 wait() 메소드에 기다릴 시간에 대한 인자를 주어야 한다. 물론 notify로 깨우려면 객체에 대한 모니터가 필요하다.(synchronized 구문 안에 들어와 있는 경우) 

notify를 호출한 스레드가 모니터를 반환 할 때까지 (synchronized를 벗어날때 까지) 실제 깨어 있는 것이 아니다. notify를 호출한 스레드가 모니터를 반환하면 그제서야 wait되었던 스레드가 깨어난다.

 

notify

대기하는 스레드가 여럿 인경우 notify를 하면 어느 스레드가 깨어날지는 모른다. 그저 하나가 선택될 뿐이다. 이경우 전부 깨우기 위해서는 notifyAll 을 이용한다.

이 객체에 wait()하고 있는 쓰레드 중 한 쓰레드를 선택하여 재시작 한다.

다시 Monitor(lock)을 획득하지 못하면 기다린다

 

notifyAll

이 객체에 wait()하고 있는 모든 스레드 재시작

이 중 한 개만이 Monitor(lock)을 획득하고 재시작

wait(long timeout)

Timeout까지 대기한다.즉 시간이 지나면 notify() 효과를 갖는다

주의점

condition을 검사하는 loop를 만들어야

synchronized void someMethod() {

   ...

   while( !condition ) {

        wait()

 

wait와 notify의 용도

한 스레드가 어떤 객체의 메소드를 호출 할때 어떤 조건을 만족해야 한다면 이 스레드는 자신이 아직 이 메소드를 실행 할 준비가 되지 않았으므로 스스로 조건이 될 때까지 기다려야 한다. 이때 객체의 모니터를 얻고 wait를 호출함으로서 조건을 기다리게 된다. 이때 다른 스레드가 조건이 만족되었음을 알고 notify를 호출하여 스레드는 깨어나서 만족된 조건하에서 남은 작업을 진행하게 되는 것이다.

 

 

2. 실습

 

5ba4c8445d3c837600cd6c2d305d5ea5_1601610
 

 

package javatest;

 

class SharedData {

private boolean isFullData = false;

    private int data;

    

    // PutThread 3개중 어느 한순간에는 하나의 스레드만 put 메소드 진입가능

    // 데이터가 차있으면 wait한다.

    // 데이터를 채우고 대기중인 모든 PutThread를 깨운다.

    // 그 중 하나만 모니터를 얻고 run 상태가 된다.

    public synchronized void put(int data)     {

        try {

            while(isFullData)   // 데이터가 있으면 대기

                wait();      

        } catch(InterruptedException e ) {}

        this.data = data;        //데이터가 없으면 데이터를 채움

        isFullData = true;       //데이터 차있다고 표시

        notifyAll();             // 대기하는 모든 스레드 깨움

 

    }

    

    // GetThread 3개중 어느 한순간에는 하나의 스레드만 get

    // 데이터가 없으면 wait 한다.

    // 데이터를 get 한 후 대기중인 GetThread 모두를 깨운다

    // 그 중 하나만 모니터를 얻고 run 상태가 된다.

    public synchronized int get()     {

        try {

            while( !isFullData)   // 데이터가 없으면 대기

                wait();           

        } catch(InterruptedException e ) {}

        isFullData = false;       //데이터 없다고 표시

        notifyAll();          // 대기하는 모든 스레드 깨움

        return data;          //    데이터를 꺼냄

    }

}

 

class PutThread extends Thread {

    private SharedData shared;

    private int data;

    public PutThread(String name, SharedData shared, int data) {

     super.setName(name);

        this.shared = shared;

        this.data = data;

    }

    public void run() {

        shared.put(data); 

        //System.out.println( getName() + " put " + data);

    }

}

 

class GetThread extends Thread {

    SharedData shared;

    public GetThread(String name, SharedData shared) {

     super.setName(name);

        this.shared = shared;

    }

    public void run() {

        while(true) 

            System.out.println( getName() + " got " + shared.get() );

    }

}

 

public class WaitTest {

public static void main(String[] args) {

SharedData shared = new SharedData();

GetThread r1 = new GetThread("GetThread-1", shared);

GetThread r2 = new GetThread("GetThread-2", shared);

GetThread r3 = new GetThread("GetThread-3", shared);

        

        PutThread w1 = new PutThread("PutThread-1", shared, 10);

        PutThread w2 = new PutThread("PutThread-2", shared, 20);

        PutThread w3 = new PutThread("PutThread-3", shared, 30);

        r1.start();        r2.start();        r3.start();

        w1.start();        w2.start();        w3.start();

}

}

 

[실행결과]

GetThread-3 got 10

GetThread-1 got 20

GetThread-1 got 30

 

 

 

 

 

#자바스레드#자바쓰레드#자바Thread#자바volatile, #자바Atomic, #자바wait, #자바notify, #자바synchronized, #스레드동기화, #스레드#volatile#자바#JAVA#자바동영상#자바강의#자바교육#자바강좌#자바동영상강의#추천자바강의#추천자바강좌#JAVA동영상#JAVA강의#JAVA강좌#JAVA교육#JAVA#추천JAVA강의#추천JAVA교육#추천JAVA강좌#자바소스#자바온라인교육#자바온라인강의    

 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...