티스토리 뷰

기타/TIL

210127 수 TIL

bong-f 2021. 1. 27. 09:49

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); } 
    로 함수형 인터페이스를 선언하고,
    HamSuInter h = a -> a + 1000; 
    이렇게 함수형 인터페스 타입의 참조변수로 람다식을 참조하면 h.sum(1) 같은 값 계산이 가능하다.
    = 람다식은 익명 객체이기 때문에 참조변수가 필요하고 그 참조변수의 타입이 함수형 인터페이스
  • 함수형 인터페이스에 선언된 매개변수 타입과 종류와 해당 메소드를 오버라이딩 해주는 메소드에서도 같은 개수와 종류로 받아줄 수 있게 해야한다.
  • 함수형 인터페이스 타입이 매개변수로 들어가면 이 메서드 호출할 때 해당 인터페이스를 구현한 메소드를 매개변수로 넣어 줘야 한다는 뜻이다. ( 함수형 인터페이스 객체로 넣어도 되고, 직접 람다식을 작성해도 되고)
  • 함수형 인터페이스 타입이 return 값으로 나올 수 있다. 이 때 return에 바로 람다식을 작성해 줘도 된다. 어차피 함수형 인터페이스 타입을 반환한다는 것은 그를 오버라이딩한 실제 람다식을 내보낸다는 말이니까.

람다 + 함수형인터페이스

  • 이것들 유용하게 쓰인다 (키워드만 알아 놓고 구체적인 방법은 사용하며 익혀가자)
    • Collection
      • removeIf 조건에 맞는 요소를 삭제
    • List
      • replaceAll 모든 요소를 변환하여 대체
    • Iterable
      • forEach 모든 요소에 직접 action 수행
    • Map
      • compute 지정된 키의 값에 f 수행
      • computeAbsent 키가 없으면 작업 f 수행 후 추가
      • computePresent 키가 있을 때 작업 f 수행
      • merge 모든 요소에 병합작업 수행
      • forEach 모든 요소에 작업 action 수행
      • replaceAll 모든 요소에 치환 작업 수행

        메서드 참조

  • 클래스이름::메서드
    : 함수형 인터페이스에 들어가는 값, 나오는 값의 타입 아니까. 줄일 수 있는 것.
  • 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
링크
«   2024/11   »
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
글 보관함