Java

[우아한 테크코스 Level2 모의 면접 질문 및 답변 재정리 - 2]

11. Equals + hashcode의 이유? 

Equals 메서드는 주소값이 다른 객체는 서로 다른 객체로 판단한다. Equals 메서드를 재정의하는 경우 같은 인스턴스 변수를 갖는 객체는 같다는 결과를 얻을 수 있다. 

Equals에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 객체의 hashCode 메서드는 항상 같은 값을 반환한다. 즉, equals가 같다고 판단했으면 hashCode 값은 항상 같다. 하지만 equals가 다르다고 판단했을 때에도 해시코드 값은 같을 수 있다. 또한 같은 값을 가진 객체가 서로 다른 해시값을 갖게 될 수도 있으므로 꼭 재정의해주어야한다. 


12. 상태패턴 사용한 방법? (내용 보충하기)

특정 상태에 따라 결과값이 나뉘는 경우 상태패턴을 사용하였다. 


13. 분기를 사용하면 안좋나? 

분기가 많으면 가독성이 떨어지고 에러가 발생한 경우 잡아내기 힘들다.


14. 방어적 vs 깊은 vs 얕은?

방어적 복사란 외부와 내부에서 주소값을 공유하는 인스턴스 간의 관계를 끊어주기 위해 새로운 객체로 감싸서 복사해주는 방법이다.

깊은 복사란 해당 객체와 인스턴스 변수까지 모두 복사하여 기존 객체와의 관계를 완전히 끊어주는 복사 방법이다.

얕은 복사란 해당 객체만 복사하기 때문에 기존 객체와 완전히 끊기지 않는다.


15. 방어적 복사는 깊은 복사인가?

방어적 복사는 깊은 복사라고 생각한다. 그 이유는 인자로 전달받은 객체와의 주소 관계를 완전히 끊어 새로운 객체를 반환하기 때문이다. 


16. 자바는 call-by-value? Call-by-reference? 

Call-By-Value이다. 

사실 이렇게 정답이 정해져있는 경우에도 "그 이유는.."을 달아 설명해야하는 것인지 궁금하다.

 

이 질문에 대한 답변은 따로 정리해보았다.

joanne.tistory.com/144


17. 직렬화, 역직렬화 사용한 이유? 

사용하지 않았다.


18. 이벤트소싱 방식이란? 이벤트 소싱을 적용한 이유? 이벤트 저장이 100개가 넘으면 어떻게 해결할 것인가?

발생한 이벤트를 모두 저장하는 방법.

예를 들어, 이번 체스 게임에서 최종 보드 상태를 저장하는 것이 아닌 움직임과 관련된 이벤트를 모두 저장하는 것.

이벤트 소싱을 적용한 이유는 히스토리를 관리하기 좋다고 생각하였기 때문이다. (이전 상태로 되돌리거나, 사용자의 모든 이벤트를 보여주기 위할 때 좋다. 왜? 사용자가 남긴 모든 이벤트가 저장되어있기 때문에 시점을 선택하면 모두 보여줄 수 있다.)

100개가 넘는다면 스냅샷을 사용할 수 있을 것 같다. 예를 들어 지금과 같은 경우에는 1번 명령부터 100번 명령까지를 모두 불러와 보드를 그려야하는데, 20번 단위마다 보드 그 자체를 저장하는 스냅샷을 찍어둔다면 100번의 경우에는 100번째 스냅샷을 가져와 바로 보드를 그릴 수 있기 때문이다. 


19. 변수 이름 짓는 기준? 

엘레강트 오브젝트에서 나온 조정자는 동사, 빌더는 명사, boolean을 리턴할 경우에는 형용사 규칙을 사용하려고 한다. 


20. 일급컬렉션의 장점으로 컬렉션의 불변성을 보장한다는 것이 무엇인가?

내부 필드로 선언한 컬렉션을 final로 선언하고 주입받을 때에도 방어적 복사로 연결관계를 끊어준 뒤 할당한다면 컬렉션의 불변성을 보장할 수 있지만, 그렇지 않다면 보장하지 못할 것이라고 생각한다.


21. 절차지향프로그래밍 vs 객체지향프로그래밍 (내용 추가하기)

절차지향이란 순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법 ex. C 순차적인 실행에 초점이 맞춰져있다. 

객체지향이란 실세계처럼 책임을 가진 객체가 존재하고 객체간의 협력으로 프로그램을 만들어가는 기법, 객체간의 관계/ 조직에 초점을 두고 있다.