이론 정리 144

스트림 소개

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

이론 정리/java 2023.09.30

고루틴(goRoutine)

고루틴(goRoutine) 쓰레드 먼저 쓰레드는 실행 흐름을 의미. 프로그램은 사실 기계어 명령의 다발인데, 이게 로드되면 메모리로 올라가게 된다. CPU는 이 명령어를 실행하는 주체이고 그냥 연산해서 결과를 보내주는 녀석이다. 그래서 이제 원래는 하나의 CPU가 이 명령어의 다발(쓰레드)를 실행해 주었다. 멀티 쓰레드 근데 이제 멀티쓰레드 어쩌고를 들어본적이 있을텐데, 그거는 코어가 빠르게 쓰레드를 교체하게 된다. (실행 흐름이 여러개가 돌아감) 이게 어떻게 가능할까? 각 쓰레드는 자신만의 IP포인트가 있다. CPU가 각 IP포인트에 있는 명령을 수행한다. 그러다가 다음 쓰레드의 IP포인트에서부터 증가하면서 수행한다. 그러고 또 다음 쓰레드를 찾아간다. 그니까 사실 동시에라기 보다는 각 쓰레드의 명령을..

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

구문(statements) 과 표현식(expression)

표현식 (expression) 결과를 반환하는 코드를 의미한다. 말하자면, 어떠한 계산을 통해 그 결과를 하나의 값으로서 나타내는 것이다. int a = 12*3; double b = 12/3;여기서 각 값 a, b는 오른쪽의 계산이 완료된 후의 값을 가지게 될 것이다. 그리고 오른쪽의 계산 을 표현식이라고 한다. 즉 어떤 계산 == 식, 이라고 생각하면 된다. 구문 (Statement) 프로그램에서 실행 가능한 최소단위 코드를 의미한다. 말하자면 해당 프로그램이 실행하는것은 모두 구문이라고 생각하면 된다. -> 다르게 말하자면 java에서 작업이 실행된다면(최소단위의 실행이 맞춰진다면) 이것은 최소 하나 이상의 구문이 존재한다는 것이다. String ryooChan; // 선언문 ryooChan = "..

이론 정리 2023.07.21

동적 파라미터화

동적 파라미터화 여러 요구사항에 효과적으로 대응 가능한 방법. 아직은 어떤 식으로 동작할지가 결정되지 않은 코드 블록이고, 나중에 프로그램에서 실행된다. 문제 상황 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

select for update에 대해서(feat deadlock, gaplock)

select for update가 뭘까?? 이름에서 알 수 있듯, 업데이트를 하기 위해 검색을 하는 것이다. 즉, 이후의 Update를 위해 select를 진행하는 것이라 할 수 있다. 그래서 뭐요? 사실 그냥 보면 뭐 그런갑다.. 할 수 있다. 근데 사실 저 select for update에서 중요한 것은, Select된 행의 UPDATE가 실제로 커밋되기 전까지 다른 트랜잭션이 이 행을 수정할 수 없다는 것이다. 뭔소리에요?? 그러니까 여러 트랜잭션이 하나의 레코드에 접근한다고 가정할 때, 현재 select for update 수행중인 내용은 변경 불가하다는 것이다!! 아래에서 실제로 보여주겠다. 실습 Table 먼저 human 테이블에 다음과 같은 데이터가 있다. 3개의 트랜잭션을 수행해 볼 것이다..

MySql 인덱스 - 기본 개념

MySQL 인덱스 실무에서 엄청나게 중요한녀석임... 이를 사용해서 select를 할 때에 데이터를 빠르게 응답하도록 할 수 있음! 사실 인덱스를 한다고 뭐 쿼리가 바뀌는건 아니다. 그냥 이걸 통해 속도를 빠르게 하는거임. 데이터베이스를 빠르게 하도록 하는 "튜닝" 에서 가장 핵심적인 것이 인덱스이다. 물론 막 쓰면 오히려 성능을 떨어뜨릴 수도 있다. 그래서 일단 인덱스의 개념이랑 활용 등을 찾아보도록 한다. 인덱스 개념 예를 들어 데이터베이스에 사람 이름 키 몸무게 을 갖는 테이블이 있을 때 1 류찬 178 70 2 김찬 189 99 3 박찬 140 39 4 이찬 180 34 5 반찬 200 50 6 징기스찬 160 50 7 가슴이벅찬 390 34 요런 식으로 있다고 하자. (일단 동명이인은 없다고 가..

Mysql 엔진 Lock

MySql 엔진 lock Mysql 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다. 글로벌 락(Global lock) FLUSH TABLES WITH READ LOCK 위의 명령을 통해 획들 가능한 잠금이다. 글로벌 락의 특징 MySql에서 제공하는 잠금 중 가장 범위가 큰 잠금이다. 해당 락이 활성화되면 전체 테이블/DB가 영향을 받는다. select를 제외한 DDL, DML문장은 글로벌 락이 해제되기 전까지 대기하게 된다. 해당 락은 MySql의 모든 테이블에 잠금을 걸게 된다. 추가적으로, 모든 테이블/DB에 대해 잠금을 걸기 때문에 해당 락 명령 실행 이전에 수행되던 트랜잭션/SQL이 끝날 때까지 대기하게 된다. 참고로 모든 SQL에 대해서이기 때문에 락 대상이 아닌 select 명령도 ..

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