주니어 자바 개발자를 위한 질문(Container)

박재언·2023년 8월 16일
0
post-thumbnail

1. 자바 컨테이너란 무엇인가요?

  • 자바 컨테이너는 자바 애플리케이션을 실행하기 위해 필요한 런타임 환경을 관리하는 소프트웨어이다. 자바의 주요 컨테이너는 웹 컨테이너, EJB 컨테이너가 있다.
    웹 컨테이너는 Java Servlet과 JSP들을 처리하는데 사용되고 EJB 컨테이너는 엔터프라이즈 자바 빈(EnterPrise Java Beans, EJB)를 처리하는데 사용된다.

2. Collection과 Collections의 차이는 무엇인가요?

  • Collection은 컬렉션 프레임워크의 인터페이스로 여러 객체를 그룹화하여 추가, 저장, 삭제 등의 기본적인 기능을 제공한다. 대표적인 하위 인터페이스로는 List, set, Map이 있다.

  • Collections는 유틸리티 클래스로 Collection 인터페이스를 구현한 컬렉션 객체들을 검색, 조작 및 전달하는데 사용된다

  • Collection Framework는 컬렉션을 표현하고 조작하기 위한 통합 아키텍처이다.

📌 Collection에 대해서

3.List, Set, Map의 차이점을 말해주세요.

  • List의 중복되는 데이터들을 저장할 수 있고, 배열 처럼 순서가 있다는 것이다.
  • Set은 중복이 되지않고 순서가 존재하지 않는다.
    • 다만 LinkedHashSet은 순서를 보장한다.
  • Map은 데이터를 저장할때 key와 value로 짝지어져 저장되며 key는 중복저장되지 않고 value는 중복 저장이 된다.

4. HashMap과 Hashtable의 차이는 무엇인가요?

  • Hashtable은 데이터 변경 메소드가 동기화로 선언되어 있기 대문에 메소드 호출 전 스레드간 동기화 락을 통해 멀티쓰레드 환경에서 데이터의 무결성을 보장해 준다.
    key와 value의 값으로 null을 허용하며 동기화 처리로 인해 HashMap보다 느리다.
    또한 요소의 삽입 순서를 유지한다.
  • HashMap은 동기화를 제공 하지않기 때문에 데이터의 무결성을 보장할수 없다.
    동기화를 제공하지 않아서 Hashtable보다 속도가 빠르며 key값으로 null을 허용하며 요소의 삽입 순서를 보장하지 않는다. 또한 AbstracMap 클래스를 확장하고 있어 더 유연한 상속 구조를 나타낸다.

사진 출처 :http://www.instanceofjava.com/2015/07/collections-interview-questions-java.html

5. 각각 어떤 상황에서 HashMap과 TreeMap을 선택하나요?

  • TreeMap은 순서를 보장하며 동기화를 지원하기 때문에 멀티 스레드 환경이나 정렬이 필요한 데이터를 다룰 경우에는 TreeMap을 쓰고 이 외의 경우에는 HashMap의 작업 속도가 더 빠르기 때문에 HashMap을 선택한다. 또한 TreeMap은 null 키를 허용하지 않고 HashMap은 null 키를 허용하기 때문에 null의 유무에 따라서도 선택을 할 것이다.

6. HashMap 구현 원칙은 무엇인가요?

  • HashMap을 구현할 때 Key를 신중하게 정해야하며 서로 다른 키들이 같은 해시 코드를 가질 경우를 대비해 충돌에 대한 해결책을 마련해 두고 초기 용량과 로드팩터를 잘 설정해 둔다. 그리고 HashMap은 동기화를 지원하지 않아 스레드 간의 안정성을 보장하지 않기 때문에 멀티 스레드를 사용할 경우 외부에서 동기화를 보장해줘야한다.

  • 해시는 버킷에 저장이 되며 다른 키가 같은 해시 값을 가진다면 같은 버킷에 채워지게 된다. 이는 키에 용량이 무한대가 아니기 때문에 그렇다. 한 버킷에 여러 개가 존재하는 경우 충돌이 일어나는데 이러한 경우를 피하기 위해 버킷의 일정 용량이 채워질 경우 용량을 늘리며 원래 버킷의 값들을 새로운 버킷으로 옮기는 과정이 일어난다. 이 때 처음 용량이 초기용량이고 용량을 늘리는 기준점이 로드팩터이다. 용량을 너무 낭비하지도 않고, 용량을 늘리는 과정을 많이 반복해 성능 저하를 발생시키지 않는 적절한 값을 찾아야 하기 때문에 초기용량과 로드팩터의 설정이 중요하다.

7. HashSet 구현 원칙은 무엇인가요?

  • HashSet을 구현할 때 Key를 신중하게 정해야하며 서로 다른 키들이 같은 해시 코드를 가질 경우를 대비해 충돌에 대한 해결책을 마련해 두고 초기 용량과 로드팩터를 잘 설정해 둔다. 그리고 HashSet은 동기화를 지원하지 않아 스레드 간의 안정성을 보장하지 않기 때문에 멀티 스레드를 사용할 경우 외부에서 동기화를 보장해줘야한다.

  • HashSet은 HashMap과 다르게 객체만 저장할 수 있으며 들어가는 객체를 이용하여 hashcode를 생성하고, equals()메소드를 이용해 hascode를 비교해 중복된 객체가 있는지 체크한다.

8. ArrayList와 LinkedList의 차이점은 무엇인가요?

  • ArrayList와 LinkedList는 List의 Collection 구현체이지만 동작 방식이 다르다.

  • ArrayList는 중복을 허용하고 순서를 유지하며 인덱스로 원소들을 관리한다.
    인덱스로 관리하기 때문에 무작위로 index의 데이터를 한번에 가져올 수 있다.
    하지만 삽입과 삭제에 따라 데이터의 위치가 움직이는 단점이 있다.

  • LinkedList는 내부적으로 양방향의 연결 리스트로 구성되어 있어서 배열의 크기를 변경할 수 없으며 데이터에 순차적으로 접근하기 때문에 검색의 속도가 느리다.
    하지만 데이터를 삽입과 삭제할 때 원하는 주소값만 병경해주면 되기 때문에 ArrayList에 비해 효율적이다.

  • 조회시에는 ArrayList가 성능이 잘나오고 삽입,삭제 시에는 LinkedList가 더 성능이 뛰어나다.

9. Array에서 List로 전환하려면 어떻게 해야하나요?

  • 반복문을 사용하여 배열의 요소를 add()를 통하여 List객체에 추가하는 방법이 있다.

  • Collections의 addAll() 메서드를 사용하여 List로 전환한다.

    • addAll()메서드는 첫 번째 매개변수로 비어있는 List 객체를 전달하고 두 번째 매개변수로는 배열을 전달한다. ex) Collections.addAll(List, Array);
  • Stream API를 사용하여 배열을 스트림으로 변환후 Collectors.toList()메서드를 사용하여 스트림을 List로 변환할수 있다. 이때 Java의 버전이 1.8이상인 경우 사용 가능하다

10. ArrayList와 Vector의 차이점을 말해주세요.

  • 두 배열은 크기가 동적인 배열을 사용할 때 주로 사용하는 클래스인데 둘의 가장 큰 차이점은 Vector는 동기화가 가능하며 ArrayList는 동기화가 되지 않는다. 따라서 Vector는 thread-safe하며 한번에 하나의 스레드만 액세스가 가능하다. ArrayList는 동기화 되지 않았기 때문에 Vector보다 더 빠르다.

  • 동적 배열 클래스로 최대 인덱스를 초과할때 추가되는 인덱스의 수도 다른데 Vector는 현재 배열의 크기의 100%가 증가하며, ArrayList의 경우 현재 배열 크기의 50%가 증가한다.

  • Vector와 ArrayList의 비교

    • 공통점
      • 순서가 있는 Collection이다.
      • List 인터페이스를 구현하고 있다.
      • 데이터를 중복해서 포함 할 수 있다.
    • 차이점
      • Vector는 자동으로 동기화를 보장, ArrayList는 동기화를 보장하지 않는다.
      • 동적 메모리 증가의 인덱스 수가 다르다.
    • Vector와 ArrayList의 기능
      • ArrayList는 배열에 동적 메모리 증가 기능을 구현한 클래스이다.
      • Vector는 ArrayList에 동기화가 보장되도록 최적화한 클래스이다.

11. Array와 ArrayList의 차이점을 말해주세요.

  • Array는 초기화시 size를 지정하고 고정되어있지만 ArrayList는 size를 표시하지 않으며 가변적이다.

  • Array는 원시타입(primitive type)과 Object타입을 모두 저장할수 있는 반면 ArrayList는 오직 Object타입만 저장할 수 있다.

  • Array는 for,for eact를 통해 순회할 수 있으며 ArrayList는 Iterator,for eact를 통해 순회할 수 있다.

  • 길이를 조회할 때 Array는 Array.length를 사용하고 ArrayList는 size()메소드를 이용한다.

  • ArrayList는 배열의 크기가 증가함녀 자동 크기 조정을 통해 이전 배열의 요소를 새 배열로 복사하는 과정을 거치는데 이러한 과정 때문에 Array보다 성능이 떨어진다.
    일반적으로 요소를 추가하고 조회할 때는 Array와 ArrayList는 비슷한 성능을 보인다.

  • Array는 다차원 배열을 구현하는게 가능하지만 ArrayList는 항상 단일 차원이다.

  • Array는 '='를 사용하여 요소를 추가하고 ArrayList는 add() 메소드를 사용하여 요소를 추가한다.

사진출처: https://javahungry.blogspot.com/2015/03/difference-between-array-and-arraylist-in-java-example.html

12. Queue에서, poll()과 remove()의 차이는 무엇인가요?

  • poll은 큐의 첫번째 요소를 삭제하고 큐가 비어있다면 예외를 발생시킨다.
  • remove는 큐의 첫번재 요소를 삭제하고 큐가 비어있다면 null을 반환한다.
  • 두개의 차이는 큐가 비어 있을 때 반환하는 값이 차이가 있다.

13. thread-safe한 컬렉션 클래스들은 무엇이 있을까요?

  • Stack, Vector, CopyOnWriteArrayList
  • CopyOnWriteArraySet
  • HashTable, ConcurrentHashMap

14. iterator란 무엇인가요?

  • iterator란 반복자란 의미로 자바에서는 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 한것이다.
    iterator는 모든 컬렉션 프레임워크에 공통으로 사용 가능하고 쉽게 값을 가져오고 제거할 수 있다는 장점이 있다. 하지만 처음부터 끝까지 단반향 반복만 가능하고 값을 추가하거나 변경하는 것은 불가능하며 대량의 데이터를 제어할때 속도가 느리다는 단점이 있다.

15. iterator와 listIterator의 차이는 무엇인가요?

  • listIterator는 iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스로
    컬렉션 요소의 대체, 추가 그리고 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원한다는 차이가 있다.

질문 출처: https://medium.com/@xjpp22/top-100-java-interview-questions-for-1-to-3-years-experienced-programmers-63ad74069cb6

2개의 댓글

comment-user-thumbnail
2023년 8월 16일

좋은 글 감사합니다. 자주 올게요 :)

1개의 답글