티스토리 뷰
Done
자바의 정석 쓰레드 일부, 람다와 스트림 일부
해커랭크 4문제
Learned
JAVA 기초
- String s; s.contains(" ");
- Stirng.substring(start, end); https://coding-factory.tistory.com/126
- 파이썬에서는 문자열을 인덱스로 슬라이싱 하고 교체하고가 가능했는데 자바에서는 그게 아니라 헷갈렸다.
Thread
- join 작업 중인 스레드.join() join도 static. join 앞에 작성된 스레드가 작업을 완료할 때까지 기다린다.
: gc.join() 가비지 컬렉터가 청소 다할 때까지 기다린다 - 쓰레드의 동기화
: 해당 코드를 실행할 때 하나의 쓰레드만 작동할 수 있도록, 락을 걸어주는 것이다
: 임계영역을 묶어 놓으면 (synchronized 활용) 코드들에 대한 자물쇠 열쇠를 그를 실행하는 쓰레드가 갖고 있는 것. 해당 코드를 완료하기 전까지 그 열쇠를 다른 쓰레드에게 주지 않는다. 해서 만약 sleep(5000)을 해도 원래는 그 다음 코드를 다른 쓰레드에서 실행했을 텐데, 임계 영역 안은 sleep 상태로 남을 수 있다.
: 이를 어디 쓰냐면 객체를 공유할 때 쓰인다. 어떤 쓰레드가 해당 값을 바꾸고 있는데 다른 스레드가 값을 바꾼다면 문제. 먼저 온 쓰레드가 이미 값을 읽은 상태 > 연산 결과 아직 반환하지 상태에서 다른 스레드가 이에 해당하는 값을 자기만의 연산대로 바꿔 return 해 놓으면 처음 왔던 스레드 값 오류.
: 이를 막기 위해서 동기화를 해 놓는다 - 동기화의 비효율과 wait notify
: 그런데 어떤 값이 특정 조건이 될 때 해당 스레드가 sleep되면 다른 스레드가 해당 코드들에 접근 할 수 없는 상황일 때(임계 영역으로 묶여 있어) 계속 그 임계영역 안 상태는 sleep이 된다. 조건을 변경할 수도 없으니까. 그래서 wait가 notif가 있다.
: 어떤 조건일 때 스레드를 sleep시키지 않고 wait시키면 해당 스레드는 임계영역 설정으로 갖고 있던 키를 내놓고 대기실로 들어간다. 그러면 임계영역 안에 있던 코드들에 대해서 값을 변경할 수 있고, 다른 스레드에서 이 조건에 관련된 값을 바꾸면 notify()를 해준다. 그러면 wait 되어있던 스레드가 일어나 다시 작업을 시작한다.
: 여기서 문제는 wait 대상이 지정되지 않기 때문은 엄한 스레드가 일어날 수 있다는 것이다. 이를 해결하기 위해 lock & condition이 나왔는데.. 이는 키워드만 알아두고 ( # todo)
람다 (+복습)
- 람다식은 익명 객체다. 이를 다뤄줄 리모콘은 함수형 인터페이스(단 하나의 추상 메서드만 있는 인터페이스).
로 함수형 인터페이스를 선언하고,interface HamSuInter { public abstract int sum(int x); }
이렇게 함수형 인터페스 타입의 참조변수로 람다식을 참조하면 h.sum(1) 같은 값 계산이 가능하다.HamSuInter h = a -> a + 1000;
= 람다식은 익명 객체이기 때문에 참조변수가 필요하고 그 참조변수의 타입이 함수형 인터페이스 - 함수형 인터페이스에 선언된 매개변수 타입과 종류와 해당 메소드를 오버라이딩 해주는 메소드에서도 같은 개수와 종류로 받아줄 수 있게 해야한다.
- 함수형 인터페이스 타입이 매개변수로 들어가면 이 메서드 호출할 때 해당 인터페이스를 구현한 메소드를 매개변수로 넣어 줘야 한다는 뜻이다. ( 함수형 인터페이스 객체로 넣어도 되고, 직접 람다식을 작성해도 되고)
- 함수형 인터페이스 타입이 return 값으로 나올 수 있다. 이 때 return에 바로 람다식을 작성해 줘도 된다. 어차피 함수형 인터페이스 타입을 반환한다는 것은 그를 오버라이딩한 실제 람다식을 내보낸다는 말이니까.
람다 + 함수형인터페이스
- 이것들 유용하게 쓰인다 (키워드만 알아 놓고 구체적인 방법은 사용하며 익혀가자)
- Collection
- removeIf 조건에 맞는 요소를 삭제
- List
- replaceAll 모든 요소를 변환하여 대체
- Iterable
- forEach 모든 요소에 직접 action 수행
- Map
- compute 지정된 키의 값에 f 수행
- computeAbsent 키가 없으면 작업 f 수행 후 추가
- computePresent 키가 있을 때 작업 f 수행
- merge 모든 요소에 병합작업 수행
- forEach 모든 요소에 작업 action 수행
- replaceAll 모든 요소에 치환 작업 수행
메서드 참조
- Collection
- 클래스이름::메서드
: 함수형 인터페이스에 들어가는 값, 나오는 값의 타입 아니까. 줄일 수 있는 것. - Function<Integer, Intger>처럼 어떤 타입으로 들어가는 것 까지 몇개가 들어가는 것까지 아니가 매개변수 부분 써줄 필요없이 구현식만 써주는데 클래스::메소드
: 그래서 매개변수가 있는 것도 생략해 줄 수 있는 거지
스트림
- 모든 데이터 타입을 스트림으로 만들어 같은 방식으로 처리할 수 있다.
- 스트림의 특징
- 데이터를 읽기만 하고 변경은 불가.
- 일회용. 한 번 사용 후 다시 스트림 만들어야 한다
- 병렬 스트림 지원
- 그 외 : 난수 스트림, 빈 스트림, 람다식으로 스트림 만들기, 폴더에 있는 파일들로 스트림 생성 등이 가능하다
- 스트림의 중간연산 skip, limit, filter, distinct, sorted(워하는 기준 생성가능) 까지 공부
Bad
- 적당히 자바를 공부하고 그 외 하고 싶던 것들을 하려고 했지만 목표한 자바 기본서 공부도 다 하지 못했다.
Good
- 만든 샐러드가 맛있엇다.
Feeling
- 흠... 내일 어떤 미션이 나올지 약간 두렵다는 거?...
'기타 > TIL' 카테고리의 다른 글
210201 월 TIL (0) | 2021.02.01 |
---|---|
210129 금 TIL (0) | 2021.01.29 |
Learned (0) | 2021.01.26 |
210126 화 TIL (0) | 2021.01.26 |
210124-25 토일 TIL (0) | 2021.01.25 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Sort
- 프로그래머스lev2
- Gitignore
- 프로그래멋lev2
- 예외
- arraylist
- 프로그래머스lev1
- 백준
- JdbcTemplate
- 그래프이론
- Stack
- Stream
- 프로그래머스lev3
- 힙
- 우선순위큐
- 순열조합
- thread
- FLASK
- spring-boot-qna
- 동빈북
- 최단경로
- SQL코딩테스트
- Queue
- array
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함