Java - Lambda / Thread
이 페이지는 다음에 대한 공부 기록입니다
JAVA(자바), Python(파이썬) 기반의
AI 활용 응용 소프트웨어 개발자 양성 과정
2021.11.10. ~ 2022.05.18.
찾으시는 정보가 있으시다면
주제별reference를 이용하시거나
우측 상단에 있는 검색기능을 이용해주세요
29일차 수업
========복습========
List
인덱스 있음, 중복 허용, add, get
ArrayList = [값, 값…]
Set
인덱스 없음, 중복 불가, 무작위, add, get안됨, iterator과 for 사용해 접근
HashSet = [값]
Map
인덱스 없음, 키와 값 한쌍(Entry) 생성, 키는 중복 불가, 값은 중복 허용, put, get
HashMap = {키=값}
======== 끝 ========
29일차 수업
익명 클래스
인터페이스를 사용하려고 할 때 1회성 사용을 목적으로 정의하는 클래스
@FuntionalInterface
// 람다식 인터페이스야! 인터페이스에 메소드를 두 개 작성하면 오류 표시해줌
// interface Printable, 익명 클래스 사용 예시
Printable prn = new Printable(){
@override
public void print(String s){
System.out.print(s);
}
};
Lambda
추상 메소드의 파라미터와 재정의 내용만 작성하는 방법
인터페이스명 구현변수명 = (재정의할 추상 메소드의 파라미터) -> {재정의 코드};
람다 사용하기 위해서는 인터페이스에 추상메소드가 하나만 있어야함
// 위와 같은 interface를 람다를 이용해 사용하기
Printable prn1 = (s) -> System.out.println(s); // 코드 내 중괄호가 없으면 중괄호 생략가능
prn1.print(“프린트”); //output will be 프린트
interface를 파라미터로, 람다를 인자로도 사용가능
thread
실행의 흐름을 처리하는 주체
메인에서 다른 함수로 이동을 할 때, 메인함수는 멈춘 상태로 다른 함수가 실행, 끝나면 메인함수가 실행
멀티 쓰레드 : 실행 흐름을 처리하는 주체를 다수로 만들겠다
쓰레드를 만들고 싶다면, Runnable 구현해서 사용한다
Runnable task = () -> {System.out.print(“task1” + Thread.currentThread().getName());};
// Runnable을 람다를 통해 구현하고, 현재 쓰레드의 이름을 불러와 호출, output “task1 Thread-0”
Thread t1 = new Thread(task1);
t1.start();
// 쓰레드 객체 생성 후, start 메소드를 실행하면, task1이 실행된다
System.out.print(“End” + Thread.currentThread().getName());
// 우리는 main이라는 쓰레드에서 작업을 해왔고, 동시 실행이기 때문에 출력 순서가 변동이 있다 output End main
람다를 구현하지 않고 Thread를 상속받은 클래스에 run을 override 하는 방법도 있다
ex)
// Thread를 상속받은 Task 클래스
class Task extends Thread{
public void run(){ // run 메소드를 override 해주기
System.out.println(Thread.currentThread().getName());
}
}
// 메인 메소드에서
Task t1 = new Task();
t1.start(); // run()이 실행이 된다
멀티 쓰레드로 구성이 되면 프로그램의 작업속도가 빠르다는 이점이 있으나,
다른 쓰레드 끼리 같은 작업을 할 때, 문제가 발생한다
synchronized : 동기화 기능 사용해서 충돌을 예방한다
ex)
class Counter{
int count = 0;
// 두 메소드를 각기 다른 쓰레드에서 실행시킬 경우, 충돌 우려가 있어서 synchronized를 사용한다
// 한 쓰레드가 count에 접근 중이면 다른 쓰레드는 해당 처리가 끝날 때 까지 기다린다
synchronized public void inc(){
count++;
}
synchronized public void dec(){
count--;
}
}