/ LECTURE

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--;
	}
}