ssausand-sunny / cs-study

면접.. 붙으려면 CS 공부 해야겠지?
0 stars 0 forks source link

Array대신 ArrayList와 같은 Collection 객체를 쓰는 이유는 무엇인가요? #21

Open kjy0349 opened 4 months ago

kjy0349 commented 4 months ago

문제

Array대신 ArrayList와 같은 Collection 객체를 쓰는 이유는 무엇인가요?

예상 꼬리 질문
  1. 자바 제네릭에 대해서 설명해주세요.
  2. 연속 메모리 할당에 대해서 설명해주세요.

들어가야 할 키워드 정리

Hunnibs commented 4 months ago
질문 답변

Array는 미리 Memory 공간을 확보해야하는 반면 ArrayList와 같은 Collection 객체는 메모리를 동적으로 관리할 수 있기 때문입니다. 또한 Collection에 속한 자료구조들을 잘 활용한다면 Array보다 더 빠른 시간복잡도로 삽입, 삭제 연산을 실행할 수 있는 이점도 존재합니다.

꼬리 질문

1. 자바 제네릭에 대해서 설명해주세요. Java Generic 타입은 객체에 대한 타입 매개변수입니다. 즉, Generic은 객체가 어떤 타입의 객체인지를 설명해주는 역할을 수행합니다. 예를 들어 Apple이라는 객체 클래스가 존재하고 해당 리스트를 관리하려한다면 우리는 ArrayList 이라고 객체를 생성하게 됩니다. 이 때 꺽쇠괄호 안에 객체의 타입을 지정해 주는 것이 Generic입니다. 2. 연속 메모리 할당에 대해서 설명해주세요. 연속 메모리 할당은 Array와는 다르게 Collection의 ArrayList에서 발생하는 현상입니다. 메모리 저장 공간을 미리 설정하지 않고 요청이 올 때 마다 새로운 공간을 할당 받아 사용하는 방식을 연속 메모리 할당이라고 합니다.

kjy0349 commented 4 months ago
예상 답안 ArrayList는 Collection 객체로, Generic을 사용해 내부 요소들의 TypeSafe를 체크해 컴파일 타임에 타입에러를 잡아낼 수 있기 때문에 주로 사용합니다.
예상 꼬리 질문 답안
  1. 자바 제네릭에 대해서 설명해주세요.
    1. 자바 제네릭은, 컴파일 타임에 내부에 포함된 요소들의 TypeSafe를 체크하는것을 주된 목적으로 갖고 있는 기능입니다. 컴파일 타임에 TypeSafe를 체크한 이후, 실제 컴파일 된 코드에서는 제네릭 코드가 사라져 런타임 성능에는 전혀 영향을 끼치지 않습니다.
  2. 연속메모리할당에 대해서 설명해주세요.
    1. 연속메모리할당은, Array와 ArrayList와 같이 배열 형식의 자료구조를 생성해 메모리를 할당할 때 주로 사용되는 방식입니다. 해당 자료구조들은 연속된 메모리 구조를 갖고 있어 여러번 접근할 때 LinkedList와 다르게 성능상 이점을 가져갈 수 있습니다.
kgh2120 commented 4 months ago
예상 답변 Java의 CollectionsFramework을 사용하는 이유는 총 3가지라고 생각합니다. 1. CollectiosnFramework이 제공하는 다양한 메서드와 최적화 2. Generic을 통한 Type 제한 3. Interface와 구현체의 분리를 통한 구현체 변경에 용이하다. ++ 각각에 대해서 물어본다면... CollectiosnFramework이 제공하는 다양한 메서드와 최적화 CollectionsFramework의 경우 인터페이스와 추상 클래스를 통해 다양한 메서드를 사전에 제공하고 있습니다. 이는 직접 배열을 통해 개발자가 구현하지 않아도 되어서 많은 편의성을 제공합니다. 또한 Collections F.W의 경우 성능에 관련된 최적화 작업이 되어 있습니다. 그 예시로 HashMap같은 경우 해시 충돌에 대비하여 Seperate Chaining 방식을 사용하는데, 이 과정에서 버킷의 사이즈에 따라서 LinkedList와 R.B Tree를 변환하며 worst case에서 O(N)을 O(log N) 형태로 줄이기 위한 작업을 진행해줍니다. Generic을 통한 Type 제한 -> 꼬리 답변에 작성 Interface와 구현체의 분리를 통한 구현체 변경에 용이하다. C F.W에서 제공하는 클래스들은 모두 인터페이스의 구현체입니다. ArrayList와 LinkedList는 모두 List의 구현체입니다. 둘의 서로 다른 특징으로 인해 개발자는 상황에 더 맞는 구현체를 사용할 수 있으며, 인터페이스에 의존하고 있다면, 많은 코드 변경 없이도 구현체를 변경할 수 있다는 이점을 볼 수 있습니다.
예상 꼬리 질문 답변 - 자바 제네릭에 대해서 설명해주세요. 자바의 제네릭은 한 클래스나 메서드에서 사용될 변수의 타입을 동적으로 설정할 수 있는 기능으로 클래스의 재사용성을 높혀줍니다. 생성된 객체와 메서드에 선언된 제너릭 정보에 따라서, 다른 타입이 들어가는 것을 컴파일 타임에서 검사해주기 때문에, 오류를 사전에 방지할 수 있습니다. - 연속 메모리 할당에 대해서 설명해주세요. 배열같은 경우는 생성이 되는 순간 물리적으로 연속된 메모리 공간을 갖게 됩니다. 이를 통해 배열은 0번 인덱스의 주소를 안다면, 인덱스와 변수의 크기를 기반으로 주소값을 찾아내 즉시 조회가 가능한 Random Access가 가능해 조회 성능을 O(1)로 만들 수 있습니다.
Leeminw commented 4 months ago
예상 답안

제네릭을 통한 타입체크가 가능하기 때문에 컴파일 타임에 에러를 잡을 수 있기 때문에 사용합니다.

예상 꼬리 질문 답안

- 제네릭이란 클래스, 인터페이스, 메서드를 정의할 때 사용할 데이터 타입을 미리 명시하지 않고, 나중에 사용할 때 구체적인 타입을 지정할 수 있도록 하는 기능입니다. 코드의 재사용성과 타입 안정성을 올릴 수 있는 장점이 있습니다. - Array나 ArrayList의 경우 메모리에 저장될때 물리적으로 연속된 공간에 저장하게 됩니다. index를 기반으로하는 접근이 용이하여 조회등의 성능이 올라가지만, 삽입 삭제의 경우 최악의 시간으로는 O(n)의 시간이 걸리게 됩니다.