woowacourse / tecoble-comments

0 stars 0 forks source link

post/2020-06-24-caching-instance/ #58

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

반복적으로 사용되는 인스턴스 캐싱하기

캐싱(Caching)이란 캐싱을 알아보기 전에 캐시의 사전적인 정의를 알아보자. 캐시(cache…

https://tecoble.techcourse.co.kr/post/2020-06-24-caching-instance/?utterances=cc1dbd7bc89f0d80ef2375075mY6H7fLlDGd013omF9gZNDByF5Rki2k6lxhZIJtjKVfc8e0%2BsH0gMq%2BObueesmu4kWdLhW4nsYjEqUqzuS%2FrtQh4AmuYi9SGNUKY2yCqyxcTYfruJxcwDlLa60%3D

jojogreen91 commented 2 years ago

공부하다보니 스티치의 글이었네요! ㅋㅋ 잘봤습니다 :)

bearjun05 commented 1 year ago

반복적으로 생성되는 인스턴스를 캐싱 개념으로 해결하는 좋은 아이디어에 대해 배웠습니다! 덕분에 IntegerCache 로직에 대해 생각하고 정리할 수 있었던 좋은 시간 되었습니다. 다만 문제가 되는 부분이 있는 것 같고 제 생각이 틀렸다면 확인 부탁드립니다!

  1. LottoNumber.valueOf() 의 비효용성 Integer캐싱에서 차용해 LottoNumber를 만드신 것 같은데, 로또 넘버는 어차피 1~45까지의 검증 로직이 있어서 그 외의 값이 나오면 예외가 발생할 텐데 이렇게 될 경우 valueOf() 를 활용하지 못하는 문제가 생깁니다.
  2. valueOf() 로직 자체의 문제 LottoNumber lottoNumber = CACHE.get(number); 라고 선언된 부분을 보면 CACHE 에 저장되어 있지 않은 범위의 숫자가 들어가게 되면 OutOfBound 예외가 발생합니다. 이런 경우 다시 한번 1번과 같은 비효용성 문제가 발생합니다.

제가 생각할 때 이런 문제가 발생하는 이유는 IntegerCache 와 LottoNumber의 Cache 는 애초에 다른 목적을 가지고 있기 때문입니다. IntegerCache 는 ‘자주 쓰는 값을 캐시에 저장해서 인스턴스 발생을 줄이자’ 라는 것이고, LottoNumber 는 ‘발생할 수 있는 모든 값을 캐시에 저장하고 그 캐시를 활용(셔플)해 인스턴스 발생을 줄이자’ 라는 것 입니다. 그렇기 때문에 Integer는 모든 값을 다 캐시에 저장 할 수 없기 때문에 valueOf() 를 활용해 인스턴스를 생성하고 미리 설정한 자주 쓰는 값의 범위 안에 있는 값들은 중복 인스턴스 생성을 방지 하는 것이고, LottoNumber는 이미 모든 값들이 캐시에 저장 되어 있으므로 valueOf()를 통해 인스턴스를 만드는 것이 필요 없는 이유입니다.

결론적으로 엄밀히 따지면 LottoNumber에는 Integer에 쓰인 캐싱 개념을 똑같이 적용하는데 무리가 있다고 생각합니다. 어차피 모든 경우의 수가 LottoNumber 캐시에 다 담겨있으므로 인스턴스를 중복해서 생성할 필요가 없습니다. 예를 들자면 1~45까지 숫자를 넣은 리스트가 하나 있는셈이고 그 리스트를 셔플해 앞에서 부터 6개를 내보내면 되는 기능입니다. 로또 번호를 뽑을 때마다 리스트를 새로 생성할 필요도 없고, 리스트에 기존 숫자를 새로운 숫자로 바꿔줄 필요도 없습니다. 그냥 원래 가지고 있는 리스트 하나로 계속 셔플만 하면 되는 것 이죠. 캐시의 개념을 적용했다기 보다는 로또 번호를 뽑는 방법을 셔플로 바꾼 것 이라고 하는 것이 더 정확해 보입니다. 지금까지 저의 의견을 적은 것 뿐이니, 확인해보시고 날카로운 지적 부탁드립니다. 좋은 글 써주셔서 감사합니다.