이론 정리/java 56

virtual thread 기본 공부

https://www.youtube.com/watch?v=BZMZIM-n4C0요거 보고 정리해 봤다.Virtual Thread안정성과 처리량에 대한 고민(전사 게이트웨이) -> 높은 트래픽에의 높은 처리량!!Kotlin의 coroutinejava project loom 에 도입된 virtual thread일단 virtual thread는 2018년에 project loom 으로 시작된 경량 스레드 모델이다.그리고 23년 JDK21에 정식 feature로 추가됨.장점스레드 생성 및 스케줄링 비용이 기존 스레드보다 저렴스레드 스케줄링을 통해 nonbloking I/O 지원기존 스레드를 상속해서 사용 가능스레드 생성 및 스케줄링 비용 저렴기존 자바 스레드는 생성 비용이 크다.자바에서 미리 여러 요청 처리를 위..

이론 정리/java 2024.04.27

자바 스트림 병렬성

병렬데이터 처리 스트림을 통한 순차 스트림을 사용하면 병렬 스트림으로 자연스럽게 바꿀 수 있다. 병렬 스트림 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림 그래서 병렬 스트림을 이용하면 모든 멀티코어 프로세서가 각각의 청크를 처리하도록 할당 가능 예를 들어 n을 받아서 1~n까지 모두 더하는 경우 이를 무한스트림으로 할 수 있는데, 이거를 n이 커지면 병렬로 처리하는게 좋을 것이다. 순차 스트림을 병렬 스트림으로 변환 순차스트림에 parallel 메서드 호출하면 기존의 함수형 리듀싱 연산이 병렬로 처리됨 저걸 쓰면 청크단위로 호출되는데, 스트림 자체에는 변화가 없고 내부적으로 불리언 플래그가 설정되는것 sequential은 반대로 병렬스트림을 순차스트림으로 바꾸는것 두 메서..

이론 정리/java 2023.12.30

java stream collector

정리 Collector 고급 리듀싱 기능을 수행하는 컬렉터 함수형 API의 장점 중 높은 수준의 조합성과 재사용성을 꼽을 수 있음 collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있는게 컬렉터의 최대 장점 보통 함수를 요소로 변환하는 경우(데이터 저장 구조를 변환) 컬렉터를 적용해서 누적한다. 직관적으로 toList 같은거 미리 정의된 컬렉터 미리 정의된 것이고, 크게 3가지 역할 수행 요약 연산 합계나 평균값 계산 등 연산을 요약하는것 문자열 연결 말 그대로 연결하는거고 뭐 사이에 구분자 넣는것도 가능 범용 리듀싱 요약 연결 위에서 한것들을 이걸 통해 정의 가능(reducing 팩토리 메서드) 위에서 한거를 이거는 다른 방식으로 쓸 수 있는것이다(프로그램적으로 위의 것들이..

이론 정리/java 2023.12.30

스트림 활용법

정리 스트림을 활용하는 방법에 관한 내용인데, 사실 이 부분은 어느 정도 알고 있기 때문에 정리하고자 한다. 이전에서 보았듯, 스트림은 내부 반복 뿐 아니라 코드를 병렬로 실행할지 여부를 알고 있다. 그래서 내부적으로 다양한 최적화가 가능하다. 필터링 프레디케이트 필터링 (filter) 프레디케이트를 사용해서 필터핑을 한다. 고유 요소 필터링 (distinct) 이름에서 알 수 있듯, 중복된 값을 제거하는것 객체의 Equals, HashCode를 통해 진행한다. 슬라이싱 요소의 선택이나 스킵 프레디케이트 활용 슬라이싱 Takewhile predicate결과값 이외는 모두 버리는 연산 즉, 결과값이 TRUE일 때까지는 값을 가져오지만 false가 되는 순간 스트림이 중지되고 반환 filter와의 차이점은 ..

이론 정리/java 2023.11.04

스트림 소개

정리 스트림과 컬렉션의 차이가 뭘까? 사실 회사에서 스트림을 쓰고 있는데 사용하면서도 이게 컬렉션보다 보기 편하고 쓰기 편하군ㅇㅇ 이정도 감상이었는데 이번에 확실히 감이 잡히더라 스트림 시작 여기서 제일 인상깊었고, 컬렉션과의 차이에 대해 쉽게 접근할 수 있었던게, 컬렉션의 주제는 데이터고 스트림의 주제는 계산 이라는 점이었다. 말하자면 컬렉션은 요소 저장 및 접근, 스트림은 그걸 가지고 계산하는 것이 주가 된다는 것이다. 그리고 스트림이 가진 두가지 중요 특징이 파이프라이닝 대부분의 스트림 연산은 스트림 연산끼리 연결해서 커다란 파이프라인을 구성할 수 있도록 스트림 자신을 반환함 lazy(결과값이 필요할 때에 계산하도록... 그니까 알아서 스트림의 중간/최종 연산을 통해 안쓸거는 안쓰게 하는 최적화 같..

이론 정리/java 2023.09.30

java의 HashMap과 해시 충돌(collision) 관련

java의 HashMap과 해시 충돌(collision) 관련 이거랑 이거를 먼저 읽고오는것도 괜찮다. HashMap의 collision 위에 글을 읽으면 알겠지만, hashMap은 key를 해싱시켜 저장한다. 즉 어떤 key가 들어왔을 때에 이를 변환시키게 되고, 당연한 일이지만 이 때에 같은 변환값을 갖는 해시 충돌은 반드시 일어날 수밖에 없다. 그러므로 이를 해결하기 위해 어떤 방식을 도입했는지에 대해 알아본다. -> 해결이란, 충돌을 아예 없애는 것이 아니라 최대한 줄이는 방법이다. 개방 주소법(open addressing) 간단하게 말하면 겹치면 다른곳에 저장하는 것이다. 만약 충돌이 발생하면 다른 주소에 값을 저장하는 식이다. 그리고 이 주소를 찾아가는 알고리즘도 여러 개가 있다. 선형 탐사법..

이론 정리/java 2023.08.23

람다 표현식

람다 표현식 람다 표현식이란? 메서드로 전달할 수 있는 익명 함수를 단순화한 것 람다 표현식은 일단 간결하게 코드를 전달하는데에 쓰인다. -> 말하자면 사실 이전에 못하던 기능을 람다를 통해 할 수 있다기 보다는, 그냥 코드가 깔끔해지고 알아보기 쉬운 것이다. 저기 위의 설명에서 그 이유를 대충 짐작할 수 있는데 익명 이름이 따로 없다. 이름을 만들 필요가 없으니 구현이 간단해진다. 함수 메서드와 다르게 특정 클래스에 종속되지 않는다. 파라미터 리스트, 바디, 반환 형식, 예외 리스트는 포함된다. 전달 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 익명 클래스처럼 코드를 막 구현할 필요는 없다. 람다에 대해서 (Apple a1, Apple a2) -> a1.getWeight()...

이론 정리/java 2023.08.05

동적 파라미터화

동적 파라미터화 여러 요구사항에 효과적으로 대응 가능한 방법. 아직은 어떤 식으로 동작할지가 결정되지 않은 코드 블록이고, 나중에 프로그램에서 실행된다. 문제 상황 1. 녹색 사과 필터링 enum Color { RED, GREEN }빨강, 초록 사과가 있다. 여기서 만약에 녹색 사과를 필터링하려 하면 if(GREEN.equals(apple.getColor())) { result.add(apple); }요렇게 쓸 것이다. 단점 만약 빨간사과, 노란사과, 검은사과 등등... 필터링 개수가 많아진다면? 저 if문이 계속해서 늘어나거나 또 빼짐에 따라 줄어들 수 있을 것이다. 2. 색의 파라미터화 위의 1에서의 단점을 해결하기 위함이다. public static List filterApples(List inve..

이론 정리/java 2023.07.12

this

this 생성자 this() 생성자에서 다른 생성자를 호출할 때 사용 다른 생성자 호출시 첫 줄에서만 사용가능 예시 class Car2 { String color; String gearType; int door; Car2() { this("white", "auto", 4); } Car2(String color) { this("color", "auto", 4); } Car2(String color, String gearType, int door) { this.color = color; this.gearType = gearType; this.door = door; } }요런 식으로 생성자에서 같은 클래스 안의 생성자를 호출할 때 사용한다. -> 사실 이거는 걍 Car2("color", "auto, 4"); ..

이론 정리/java 2023.04.18

static이랑 instance

static과 인스턴스 메서드 일단 얘들이 뭐냐면 class MyMath { long a, b; long add() { // 인스턴스 메서드 return a + b; } static long add(long a, long b) { // 클래스 메서드(static) return a + b; } }이렇게 되어있다. 그래서 이게 뭐가 다른걸까? 인스턴스 메서드 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드 iv : instance variable im : instance method 메서드 내에서 인스턴스 변수(iv) 사용가능 static 메서드(클래스메서드) 객체생성 없이 '클래스이름.메서드이름()'으로 호출 객체..

이론 정리/java 2023.04.18