TIL

  1. Lazy Loading
  2. HashMap에 load factor가 존재하는 이유
  3. state machine

 


 

Lazy Loading

lazy loading은 JPA에서 처음 접해봤고 이 컨셉이 JPA에만 국한되는 컨셉인 줄 알았다.

하지만!!! ArrayList를 생성(Java7 이상부터)할 때도, Servlet에서도 사용되는 컨셉이였다.

 

lazy loading은 실제로 리소스나 객체의 로딩을 지연 시키는 개념이다. 대체 왜 이런 컨셉을 만든걸까?

바로 성능을 개선하고 시스템 리소스를 절약하기 위함이다.

 

예를 들어, defendency가 많은 프로그램에서 어떤 기능을 추가하는 프로젝트를 진행한다고 가정해보자. 내가 기능을 추가하고 수정할 때마다 서버를 띄워서 확인을 해야하는데 이 거대한 defendency를 같이 빌드하고 서버에 띄운다면?

사용하지도 않는 defendency를 띄우느라 소모되는 시간과 바닥나는 내 인내심을 감당할 재간이 없다...ㅎ

이때 사용하지 않는 defendency를 lazy loading으로 바꾸면 시간 감축 측면에서 많은 이득을 볼 수 있다.

 

또 다른 예로 ArrayList나 HashMap에 첫번째 데이터를 추가할 때까지 JVM에서는 Array 또는 Map에 대한 메모리 할당을 지연한다. 만약 이 컬렉션 객체들을 생성하는 족족 메모리에 할당해놓고 사용하지 않으면? 매우 비효율적이다. 지연로딩을 통해 객체가 실질적으로 사용될 때만 메모리에 할당 되도록 만들었다.

 

 

 

 

HashMap에 load factor가 존재하는 이유

일단!!!! ArrayList는 load factor가 없다! 나는 어떤 자료를 보고 있다고 있다고 생각했나😫

아무튼 ArrayList엔 load factor가 없는데 HashMap에는 load factor가 있는 이유는 무엇일까?

바로 해시충돌을 최대한 방지하기 위해서다.

 

ArrayList 같은 경우엔 10칸 짜리 배열이 있다고 했을 때, 그 10칸에 데이터가 다 저장 됐으면 배열이 다 찼다고 명확하게 판단할 수 있겠다. 근데 HashMap은 10칸 짜리 배열이 있다고 해도 10개의 index를 다 사용하지 않을 수도 있다. 해시충돌로 같은 index를 공유하는 데이터들도 있을 것이기 때문이다.

 

데이터가 많이 찰 수록 해시충돌이 일어날 가능성이 커지니까 load factor를 사용해 배열을 확장할 타이밍을 잡는 것이다.

 

 

 

 

State Machine

 

  • 상태(state)와 상태 간의 전이(transition)로 구성된 모델이다.
  • 전이는 어떠한 event에 의해 다른 상태로 변화할 수 있는 것을 의미한다.
  • 각 state는 특정 조건에 따라 입력을 받아 다음 state로 전이될 수 있다.
  • 어떤 시스템의 동작을 모델링하고 제어하는데 사용된다.
  • 유한한 개수의 state를 가질 수 있는 추상 기계이다.
  1. 현재 상태로부터 가능한 전이 상태와
  2. 전이를 유발하는 조건들의 집합으로 정의

 

 

 

for foobar 문장에서 foo 일치시키는 state machine 만들기

foo와 일치하는 문자열은 끝까지 만들고, 일치하지 않으면 다시 시작한다.

 

  • forf-o는 소비되지만 r은 최종 상태인 foo와 일치하지 않으므로 실패하고 다음 토큰을 사용하여 start 지점으로 돌아간다.
  • foobarf-o-o가 소비되고 최종 상태 foo와 일치한다. (다음에 bar를 남김)
  • bar → 아무 것도 일치하지 않는다. (공백도 일치하지 않음)

결과적으로 for foobar 문자열에서 매칭되는 문자열 foo가 1개 있다.
위 예제에서 알아본 것들이 state machine 정규식 엔진이 작동하는 방식의 핵심이다.

 

 

 

(foo|bar) state machine 만들기

foo 또는 bar와 일치해야 한다.

 

  • f 또는 b와 일치하는 문자열은 각각의 경로를 지나가며 foo를 완성시키거나 bar를 완성시키거나 시작 지점으로 돌아간다.

 

 

 

 

📚 참고

https://bugs.openjdk.org/browse/JDK-8174089
https://dealicious-inc.github.io/2021/04/12/state-machine.html
https://medium.com/codex/regex-state-machines-and-automata-basics-and-theory-4d4757db8bd5