자바칩

[자바의 신] 22장. 컬렉션 (List): 문제 풀이 본문

Study/Java

[자바의 신] 22장. 컬렉션 (List): 문제 풀이

아기제이 2024. 5. 16. 19:22
728x90

정리해 봅시다

 

1. Collection 인터페이스를 구현하는 대표적인 3개의 자료 구조에는 어떤 것들이 있나요?

List(목록), Set(셋), Queue(큐)

 

 

2. 배열과 같이 순서가 있는 목록형을 나타내는 대표 인터페이스는 무엇인가요?

List 인터페이스

 

 

3. ArrayList라는 클래스의 생성자 중 매개변수가 없는 기본 생성자를 사용하면 기본적으로 몇 개의 저장 공간을 가지나요?

10개의 저장 공간

*사용 예시
ArrayList<String> list = new ArrayList<String>();

 

 

4. 만약 ArrayList 클래스의 저장 공간 개수를 처음부터 지정하려면 어떤 생성자를 사용하면 되나요?

ArrayList(int initialCapacity)

이 생성자는 매개 변수로 넘어온 initialCapacity 개수만큼의 저장 공간을 갖는 ArrayList를 만든다.

*사용 예시
ArrayList<String> list = new ArrayList<String>(100);

 

 

5. ArrayList 객체를 생성할 때 제네릭을 사용하는 이유는 무엇인가요?

ArrayList 객체를 생성할 때에는 제네릭을 사용하지 않고 서로 다른 종류의 객체들을 ArrayList에 넣어도 컴파일과 실행하는 데에는 문제가 없다. 하지만 대부분의 개발자들이 ArrayList를 사용할 때에는 서로 다른 종류의 객체들을 넣지 않고, 한 가지 종류의 객체들만 저장한다. 그러므로 ArrayList 객체를 생성할 때에는 한 가지 종류의 객체 타입으로 제네릭을 사용하는 것이 좋다.

 

 

6. ArrayList에 데이터를 담는 메소드 이름 두 가지는 무엇인가요?

메소드 특징
add() - 매개 변수로 넘어온 데이터를 담는다.
- 매개 변수에 인덱스 위치를 지정하지 않으면 가장 끝에 담고,
  인덱스 위치를 지정하면 지정한 인덱스 위치에 담는다.
addAll() - 매개 변수로 넘어온 컬렉션 데이터를 담는다.
- 매개 변수에 인덱스 위치를 지정하지 않으면 가장 끝에 담고,
  인덱스 위치를 지정하면 지정한 인덱스 위치부터 담는다.

 

 

7. Collection 인터페이스를 구현한 클래스의 객체에서 사용할 수 있는 for 루프의 구조는 어떻게 되나요?

for (초기화; 종료 조건; 조건값 증가) { }             // 세미콜론(;) 사용
for (타입이름 임시변수명 : 반복대상객체) { }    // 콜론(:) 사용

 

 

8. Collection 인터페이스를 구현한 클래스의 객체 크기를 확인하는 메소드 이름은 무엇인가요?

size()

이 메소드는 배열.length처럼 배열의 저장 공간 개수를 의미하는 것이 아니라,
ArrayList에 들어가 있는 데이터의 개수를 의미한다.

*사용 예시
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
System.out.println(list.size());    // 2

 

 

9. ArrayList에서 특정 위치에 있는 데이터를 확인하는 메소드는 무엇인가요?

get(int index)

*사용 예시
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
System.out.println(list.get(1));   // B

 

 

10. ArrayList에서 특정 위치에 있는 데이터를 삭제하는 메소드는 무엇인가요?

remove(int index)

*사용 예시
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
System.out.println(list.remove(0));   // A 삭제 후 리턴

 

 

11. ArrayList에서 특정 위치에 있는 데이터를 수정하는 메소드는 무엇인가요?

set(int index, E element)

*사용 예시
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
System.out.println(list.set(0, "C"));    // A를 C로 수정. 수정하기 전 값인 A 리턴
System.out.println(list.get(0));           // C

 

 

12. java.util 패키지에 있는 Stack이라는 클래스는 어떤 클래스를 확장한 것인가요?

java.util.Vector

 

 

13. Stack 클래스에서 데이터를 담는 메소드는 무엇인가요?

push(E element)

*사용 예시
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);    // 1 삽입
stack.push(2);    // 2 삽입

 

 

14. Stack 클래스에서 가장 위에 있는 데이터를 확인만 하는 메소드는 무엇인가요?

peek()

*사용 예시
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
System.out.println(stack.peek());     // 2 리턴
System.out.println(stack.peek());     // 2 리턴

 

 

15. Stack 클래스에서 가장 위에 있는 데이터를 삭제하고 리턴하는 메소드는 무엇인가요?

pop()

*사용 예시
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop());      // 2 삭제 후 리턴
System.out.println(stack.pop());      // 1 삭제 후 리턴

직접해 봅시다

package d.collection.practice;  // 1번

import java.util.ArrayList;

public class ManageHeight {     // 1번
    ArrayList<ArrayList<Integer>> gradeHeights = new ArrayList<>();     // 2번

    public static void main(String[] args) {    // 1번
        ManageHeight manage = new ManageHeight();
        manage.setData();   // 4번

        // 4번
        int classCount = manage.gradeHeights.size();
        for (int classNo = 0; classNo < classCount; classNo++) {
            manage.printHeight(classNo);
        }

        // 6번
        int classNo = 0;
        while (classNo < classCount) {
            manage.printAverage(classNo);
            classNo++;
        }
    }

    // 2번
    public void setData() {
        int[][] gradeHeightsArr = new int[5][];
        gradeHeightsArr[0] = new int[] {170, 180, 173, 175, 177};
        gradeHeightsArr[1] = new int[] {160, 165, 167, 186};
        gradeHeightsArr[2] = new int[] {158, 177, 187, 176};
        gradeHeightsArr[3] = new int[] {173, 182, 181};
        gradeHeightsArr[4] = new int[] {170, 180, 165, 177, 172};

        int classCount = gradeHeightsArr.length;
        for (int classNo = 0; classNo < classCount; classNo++) {
            ArrayList<Integer> heights = new ArrayList<>();
            int studentCount = gradeHeightsArr[classNo].length;
            for (int student = 0; student < studentCount; student++) {
                heights.add(gradeHeightsArr[classNo][student]);
            }
            gradeHeights.add(heights);
        }
    }

    // 3번
    public void printHeight(int classNo) {
        System.out.println("Class No." + (classNo + 1) + ":");
        ArrayList<Integer> heights = gradeHeights.get(classNo);
        for (int height : heights) {
            System.out.println(height);
        }
    }

    // 5번
    public void printAverage(int classNo) {
        System.out.println("Class No." + (classNo + 1) + ":");
        double sum = 0;
        ArrayList<Integer> heights = gradeHeights.get(classNo);
        for (int height : heights) {
            sum += height;
        }
        int studentCount = heights.size();
        System.out.println("Height average: " + sum / studentCount);
    }
}