우아한테크코스에서 진행하는 미션을 진행해보면서 나의 생각과 배운 것을 정리하는 글

[로또미션]

[내코드PR]

 

[로또 - 1단계] 미션 제출합니다. by changjun6518 · Pull Request #2 · changjun6518/java-lotto-1

안녕하세요! 😊 로또 미션을 구현해보았습니다! 🎓 구현하면서 조금이라도 궁금하고 의문이 들었던 생각들을 정리하고 코멘트에 남겼습니다! 피드백 주시면 저에게 큰 도움이 될 것 같습니다!

github.com

 


기능목록 작성 후에 처음 작성하는 코드는 뭘까?

    • 다들 어느정도 필요한 클래스를 구상하고 테스트 코드부터 작성하는 식으로 진행하는 듯 했다.

입력값은 보통 String 값인데 클래스 멤버변수로 다른 타입을 가질때 어떻게 할까?

  • InputView 영역 즉, 프론트엔드 쪽에서 정해진 형식을 통해 보내질 것이기 때문에 String이 아닌 Integer를 매개변수로 받아와도 될 것 같다.
  • 하지만 프론트엔드 뿐만 아니라 백엔드 쪽에서도 검증하는 함수가 필요하다.
  • 생각해보니 amount에 문자가 들어갈 경우 Integer.parseInt() 오류를 처리하기 난처했는데 매개변수로 Integer로 받기 때문에 컴파일?시에 오류가 나서 사전에 오류를 방지할 수 있다!
  • 이렇게 될 경우 위 isValidDigit 검증함수는 불필요하게 될 것 같다.

값 복사는 왜 해야할까? ( 위 Amount 클래스 생성자에서 검증 로직을 거치기 전에 값부터 복사하기 )

  • 위 예시로 보면 검증로직을 거치고 마지막에 this.amount = amount 를 하여 대입을 하게 된다.
  • 이렇게 진행하면 멀티스레드 환경에서 this.amount 에 대입 직전에 다른 스레드에 의해 매개변수가 가리키고 있는 값이 바뀔 가능성이 존재할 수 있다는 문제가 있다.

  • 생성자가 실행되면 생성자를 실행시킨 함수에 있는 amount(Stack에 있는)의 주소가 넘어온다.
    • 이때 주소가 넘어오는지에 대한 정확한 지식이 없다... 토론해보았지만 해답을 얻지 못했다.
    • JVM + 스택, 힙 변수 생성 과정 + 기본형 변수, Wrapper 클래스 생성 등
  • 하나의 스레드가 그 주소에 있는 값(10000)을 확인하면서 검증한다.
  • 이때 다른 스레드가 amount 값을 변경시킨다. (예를 들어 5000으로 변경)
  • 그러면 처음 스레드가 검증을 끝난 뒤 검증할때 값 10000 이 아닌 5000을 instance의 amount에 복사하게 된다.
  • 이러한 문제를 방지하기 위해 값부터 복사하고 복사한 값을 검증하는 식으로 하는 것 같다.

 


회고

오전에 하는 스터디사람들과 나의 궁금점들을 공유했다.

시험삼아 해보았지만 생각보다 많은 부분을 토론하게 되었고 혼자 고민했던 것보다 3배는 더 많은 것을 얻은 느낌이였다. 

앞으로 궁금증들을 모두 적고 정리하고 공유하면서 토론을 진행해보려고한다.

+ 우테코 미션 회고들(이전 기수들)을 참고하면서 배울 점들을 쏙쏙 빨아보려한다.

 

참고

[값복사]

[스택&힙]

 

+ Recent posts