BigDecimal은 뭔가요?
- BigDecimal클래스는 굉장히 큰 숫자를 오차없이 사용할 수 있는 java.math에서 제공하는 라이브러리입니다.
- 정확한 수치를 표현해야하는, 예를 들면 돈을 나타낼 때 사용할 수 있습니다.
어떻게 숫자를 표현하나요?
- 기존의 2진법으로 숫자를 표현하는 Double, Float와 다르게 BigDecimal은 10진법으로 소수점 아랫자리를 표현합니다.
- double이 8byte의 메모리를 사용하는 것에 비해, BigDecimal은 총 32byte의 메모리를 사용합니다.
Enum이 뭔가요?
- Enum은 열거형으로써, 서로 연관된 상수들의 집합이라고 할 수 있습니다.
- Java에서의 Enum은 여기에 로직을 추가하여, 서로 연관된 상수 Singleton 객체의 집합이라고 할 수 있습니다.
Enum을 왜 사용하죠? 장단점은요?
- Enum을 사용하는 이유는, 장점이 많기 때문입니다.
- 우선 상태와 행위를 동시에 관리하는 코드 작성이 가능해집니다.
- 함수형 인터페이스를 통해 해당 ENUM 객체가 자신의 로직을 가질 수 있게 설계할 수 있습니다.
- 역할과 책임의 관점에서 이는 객체지향적으로 좋은 코드라고 생각합니다.
- 허용 가능한 값들을 제한할 수 있어, 컴파일 타임에 오류 발견이 가능합니다
- 그냥 static 상수로 지정하는 것보다, IDE의 지원을 폭넓게 받습니다.
- 오타 검사, 테스트 작성 등
둘의 차이점을 알려주세요
- new ArrayList<>() 같은 경우, 온전한 List로써의 기능을 다 할 수 있는 List를 생성해 반환합니다.
- 생성자의 매개변수로 List를 넘겨받으면, 해당 주소의 참조를 끊고, 새롭게 List를 정의해 해당 원소들을 넣어 반환합니다.
- (여기서 원소들은 얕은 복사로 이루어지며, List의 주소만 다르게 반환됩니다.)
- Arrays.asList() 같은 경우, 읽기만 가능한 List를 생성해 반환합니다.
- add, remove등의 메서드를 통해 list를 제어하려하면, "UnsupportedOperationException"을 내뿜습니다.
- 원본 배열의 참조 역시 끊지 않으며, 얕은 복사로 주소를 공유하게 됩니다.
- List 형태로 배열을 포장했다고 생각하면 됩니다.
둘의 차이점을 알려주시고, 둘을 언제 써야할 지 알려주세요.
- 우선 HashMap은 중복된 원소를 허용하지 않으며, 순서를 고려하지 않고 저장되는 데이터 구조입니다.
- HashMap은 key와 value로 구성되어있는데, key로 value를 조회하기 때문에, key는 해당 데이터구조에서 고유해야합니다.
- HashMap이 중복된 원소를 검사하는 방법은 다음과 같습니다.
1. 우선 해당 객체의 HashCode가 같은지 검사합니다.
2. 이후 equals 연산을 통해 해당 객체가 동등성을 보장하는지를 검사합니다.
3. HashCode와 equals가 같다고 판명되면, 둘을 중복된 원소로 간주합니다.
- LinkedHashMap은 HashMap과 동일하게 원소를 저장하는데, 여기에 Doubly-Linked-List를 통해 데이터가 입력된 순서를 기억하게 합니다.
- LinkedHashMap은 아무래도 저장순서를 기록해야하는 점 때문에, 성능에서는 hashMap에 비해 조금 느린것으로 알고 있습니다.
- HashMap은 시간 복잡도가 O(1)으로 조회할 수 있도록 작성되있기에 자주 사용하는 자료구조인데요.
- 데이터를 저장하는 것에 있어서 데이터의 순서까지 기록해야 할 필요성이 있다면 LinkedHashMap을 사용할 것 같습니다.
hashCode가 무엇인가요?
- hashCode란 객체를 식별할 하나의 정수 값을 의미합니다.
- 클래스의 최상위 타입인 Object에서는 객체의 메모리 번지를 통해 hashCode를 만들어냅니다.
- 하위 클래스에서, hashCode를 자체적으로 오버라이딩 할 수 있습니다.
동일성과 동등성에 대해 설명해봐요
- 동일성은 두 개의 오브젝트가 완전히 같은 경우를 의미합니다.
- 객체는 메모리의 Heap영역에 저장되는데, 비교하려는 객체의 주소가 완전히 같은 경우, 두 객체를 동일하다고 일컫습니다.
- 이를 비교하기 위해 "=="을 사용하여 주소 비교를 하곤 합니다.
- 동등성은 두 개의 오브젝트가 같은 정보를 가진 것을 의미합니다.
- 쉬운 예시로, 값 객체 같은 경우, 표현하는 값이 같은 경우 동등한 객체로 판단해야 합니다.
- 기본적으로 Object 클래스에서는 equals는 동일성 비교를 합니다.
- 따라서, 동등성을 보장해야 하는 클래스에서 equals를 오버라이딩을 하게 됩니다.
왜 둘의 동치가 보장되어야 하죠?
- 객체의 고유함을 보장하기 위해 hashCode/equals 동치가 보장되야 합니다.
- hashSet과 hashMap 같은 경우, hashCode와 equals가 같다면 같은 key값으로 인지합니다.
- 2개의 같아야 하는 객체를 hashMap에 넣었는데, hashCode/equals가 다르게 정의되어있다면, 2개의 객체는 각각 key값으로 hashmap/hashset에 저장됩니다.
- 해당 방식은 결국, 고유한 key값을 통해 value에 접근하는 결과를 초래해요.
- 따라서 객체의 고유함을 보장하기 위해 둘의 동치가 보장되야 합니다.