전체 글 405

java 깊은복사 vs 얕은복사(feat.clone)

깊은복사 vs 얕은복사(feat.clone) 간단하게 말하면 얕은복사 객체의 주소값을 복사함 깊은복사 객체의 실제 값을 복사함 이거임. 솔직히 뭐 딱히 쓸말이 없긴하다... 그래도 좀 상세히 알아보아요 얕은복사 먼저 얕은복사이다. @Getter @Setter @AllArgsConstructor public class Person { private String name; private int iq; }이런 식으로 Person이라는 객체를 선언해 줄 것이다. 그리고 @Test public void 복사() { Person person = new Person("류찬", 200); Person ryoochan = person; ryoochan.setIq(300); System.out.println("본래의 Ob..

이론 정리/java 2023.01.02

문제 풀이에서 1000000007, 1000000009으로 나누는 이유가 뭐지? (feat.모듈로 연산)

문제 풀이에서 1000000007, 1000000009으로 나누는 이유가 뭐지? (feat.모듈로 연산) 가끔 알고리즘 풀다보면 뭐 숫자를 몇으로 나눈 나머지를 써라~~ 이런 것들이 보인다. 아니 이거 왜씀? 하기도 하고, 결과에 나누라해서 진짜 결과에다가 나누면 제대로 안나온다... 이거 뭘까?? Integer, Long int형식은 32비트로 표현되고 표현할 수 있는 범위는 -2147483648 ~ 2147483647 이다. long형식은 64비트로 표현되고 표현할 수 있는 범위는 -9.22337204e18 ~ 9.22337204e18이다. 이게 가끔 문제에서 계산하다보면 저 이상의 숫자가 나오면 overflow가 나와버리는 것이다. 연산자 분배법칙 모듈러 연산은 주로 암호 알고리즘에서 사용된다. 일..

이론 정리 2023.01.01

ThreadLocal - 쓰레드로컬 이란?

ThreadLocal - 쓰레드로컬 이란? Comment 이름 그대로… 쓰레드 단위 로컬 변수 할당임ㅇㅇ 사실 이 Thread local에 대해서는 잘 몰랐는데, 놀랍게도 java1.2버전부터 제공되고있던 유서깊은 클래스였다고 한다. 그게 뭔데 일단 보통 java에서는 멀티 쓰레드를 이용해 한번에 작업을 처리해서 성능상의 이점을 얻을 수 있다. 근데 이 멀티 쓰레드 간에 리소스를 어떻게 공유해야 할지, 그리고 그 리소스의 동시성 문제를 어떻게 해결할 수 있을지 고민해야 한다. 그 방안 중 하나가 바로 Thread local이다. 그거 어떻게 하는건데. 일단 ThreadLocal의 내부는 Map구조를 갖고 있는데, key - thread정보, value - 변수 요렇게 저장한다. 그래서 각각의 쓰레드는 자..

이론 정리/java 2022.12.28

Heap and Stack

Heap and Stack 둘다 메모리를 저장하는 곳이다. 운영 체제에서는 프로그램의 실행을 위해 메모리 공간을 4부분으로 제공하는데 코드영역 실행할 프로그램 코드 데이터영역 전역변수, 정적 변수 프로그램 시작시 할당, 프로그램 종료시 소멸 Heap영역 사용자의 동적할당 전역 변수 런타임에 크기 결정 Stack영역 메모리의 정적 할당 지역 변수, 매개 변수, 함수 LIFO관리 컴파일타임에 크기 결정 요건데, 사실상 코드영역이랑 데이터영역은 그냥 있는 애들이고, heap이랑 stack에 대해 한번 자세히 알아보자! Stack Stack은 정적으로 메모리가 할당된다. 그리고 지역변수와 매개변수, 그리고 함수여서 함수가 호출되면 쭈루룩 할당되고, 호출이 완료되면 소멸된다. Stack은 이름 그대로(java에서..

이론 정리 2022.12.27

spring boot에서 redis를 사용한 동시성 이슈 처리

Redis를 활용해서 동시성 이슈를 방지하는 두 가지 방법이 있다. Lettuce setnx 명령어를 활용하여 분산락 구현 set if not exist의 줄입말이다. key와 value를 set할 때 기존의 값이 없을 때에만 set하기 spin lock 방식 락을 사용하는 쓰레드가 이걸 사용할 수 있는지 매번 시도하는 방식 retry 로직을 개발자가 직접 구현해야 한다. Redisson pub-sub 기반으로 Lock 구현 제공 앞선 쓰레드가 자신이 끝나면 다음 쓰레드에 접근하라고 할려줌 Lettuce 요런 식으로 lock을 사용하고 setnx를 써서 하면 이전에 만들어둔게 없음 1 -> 만들어짐 이전에 만들어둔게 있음 0 -> 안됨 이전에 있던걸 지우고 다시하면 잘 되는것도 확인 가능 구현이 간단하다..

낙관적/비관적 lock, named lock

pessimistic Lock 실제로 데이터에 Lock을 걸어서 정합성을 맞추는 방법 이걸 걸면 다른 트랜잭션에서는 lock이 해제되기 전에 데이터를 가져갈 수 없다. 데드락이 걸릴 수 있어 주의 필요 Optimistic Lock 실제로 lock을 이용하지 않고 버전을 이용해서 정합성을 맞추는 버전 먼저 데이터를 읽은 후에 update를 수행할 때 내가 읽은 버전이 맞는지 확인하여 업데이트한다. 내가 읽은 버전에서 수정사항이 생기는 경우 application에서 다시 읽은 후에 작업 수행 필요 Named Lock 이름을 가진 metadata locking이다. 이름을 가진 lock을 획득한 후 해제할때까지 다른 세션은 이 lock을 획득할 수 없다. transaction이 종료될 때 자동으로 lock이 ..

Spring boot Transactional annotation

Transaction이란 DB에서의 상태 변경을 위해 수행하는 작업의 단위 간단하게 말하면 CRUD를 통해 DB에의 접근을 진행하는 것이다. Transaction은 ACID라는 성질을 갖는다. Atomicity(원자성) 트랜잭션은 모두 DB에 반영되거나, 그렇지 않으면 모두 반영되지 않아야 한다. Consistency(일관성) 트랜잭션 처리 결과는 일관성이 있어야 한다. 즉, 트랜잭션 진행 도중 DB가 변경되어도 처음 트랜잭션 진행을 위해 참조한 데이터 기준으로 적용 Isolation(독립성) 둘 이상의 트랜잭션이 동시에 수행되고 있는다면 다른 트랜잭션의 연산에는 끼어들수 없다. Durability(지속성) 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 한다. Transactional a..

java의 Equals and HashCode(feat. HashMap)

Equals and HashCode(feat. HashMap) 보통 Spring boot를 사용할 때에 class에서 equals랑 hashcode를 같이 정의하고는 한다. 그리고 lombok에는 아예 @EqualsAndHashCode 라는 애가 있어 두개를 같이 사용할수도 있다. 그럼 이녀석들이 무엇일까? Default 먼저 이런 class를 정의해 주자. 해당 class는 RyooChan의 intelligence와 look을 인자로 갖고 있다. 이런 식으로 Object를 가져와서 값이 동일한지를 검사해 준다. Test결과 두 객체는 서로 다르다. 참고로 저거 equals를 조금 공부해 봤으면 아니 얘는 값을 비교하는건데 왜 달라?? 라고 생각할 수 있을거같은데 Object를 equals를 비교하면 요..

이론 정리/java 2022.12.25

java hashmap의 시간복잡도에 관해서

HashMap은, Map인터페이스의 컬렉션 중 하나이다. 이 HashMap은 key-value로 하나의 key가 하나의 value를 갖도록 한다. 이전에 ArrayList와 LinkedList의 차이점에 대한 글을 작성한 적이 있다. 각각의 내용들에 대해서 생각해 보면, 두 자료구조 모두 값을 읽어오거나 변경할 때에 시간복잡도를 고려해줄 필요성이 있었다. 근데 이 HashMap은 값을 넣거나 변경할 때 모두 시간복잡도가 O(1)이다!! 이게 어떻게 가능할까? Put의 시간복잡도 HashMap의 동작 방식 위에서 설명하였듯 HashMap은 하나의 key가 하나의 value를 갖는다. 이 key를 찾아가기 위해서 어떠한 key가 입력되면 java에서는 이곳에 해시함수를 적용시켜 고유 index를 만든다. 예..

이론 정리/java 2022.12.25

generic

java 제네릭(generic) type? Data type을 일반화한다는 의미. generic을 사용해서 컴파일 하는 동안 클래스 혹은 메서드에서 사용할 내부 데이터 타입을 지정할 수 있다. -> 해당 클래스에서 사용할 데이터의 타입을 외부에서 지정한다. 데이터 타입을 미리 지정한다?? 한번 보여드림ㅇㅇ 일단 위에서 설명한것처럼 generic은 클래스 혹은 메서드 에서 사용하는 친구이다. class RyooChan { private T intelligence; void setIntelligence(T intelligence) { this.intelligence = intelligence; } T getIntelligence() { return intelligence; } }참고로 이거는 Type이라 T..

이론 정리/java 2022.12.22