✏️본 게시글은 자바로 배우는 핵심 자료구조와 알고리즘을 학습한 내용을 개인적으로 학습하기 위해 정리한 글입니다.
이 책은 다음 세 가지 주제를 다룹니다.
- 자료구조
- 알고리즘 분석
- 정보 검색
1.1 리스트가 두 종류인 이유
Java Collections Framework를 사용하다 보면 ArrayList와 LinkedList 클래스를 헷갈릴 수 있습니다.
왜 자바는 List 인터페이스에 두 가지 구현을 제공할까? 둘 중에 어떤 것을 선택해야 할까?
예제를 통해 ArrayList, LinkedList와 유사한 클래스를 구현하고, 따라서 이들의 동작 방법과 각각의 장단점을 학습할 예정입니다.
어떤 동작은 ArrayList가 빠르거나 저장 공간을 적게 사용하고 다른 상황에서는 LinkedList가 빠르거나 메모리 사용량이 적습니다.
어느 것이 더 좋을지는 수행하는 동작에 달려 있습니다.
1.2 자바 interface
자바 interface는 메서드 집합을 의미합니다. 이 interface를 구현하는 클래스는 이러한 메서드를 제공해야 합니다.
이 interface는 타입 파라미터인 T를 사용하여 Comparable이라는 제네릭 타입을 정의합니다.
이 interface를 구현하려면 클래스는 다음과 같아야 합니다.
- T 타입을 명시해야 합니다.
- T 타입의 객체를 인자로 받고 int를 반환하는 compareTo( ) 메서드를 제공해야 합니다.
이 클래스는 Number 클래스를 확장합니다. Number 클래스의 메서드와 인스턴스 변수를 상속하고 Comparable <Integer> 인터페이스를 구현합니다.
따라서 Integer 객체를 인자로 받고 int를 반환하는 compareTo 메서드를 제공합니다.
클래스가 interface를 구현한다고 선언하면 컴파일러는 interface가 정의한 모든 메서드를 제공하는지 확인합니다.
그리고 compareTo( ) 메서드를 구현할 때 삼항 연산자를 사용합니다
1.3 List interface
Java Collections Framework라는 interface를 정의하고 ArrayList와 LinkedList라는 두 구현 클래스를 제공합니다.
interface는 List가 된다는 의미가 무엇인지를 정의합니다.
이 interface를 구현하는 클래스는 add, get, remove와 20가지 메서드를 포함한 특정 메서드 집합을 제공해야 합니다.
ArrayList와 LinkedList 클래스는 이러한 메서드를 제공하므로 상호교환할 수 있습니다.
List로 동작하는 메서드는 ArrayList와 LinkedList 또는 List를 구현하는 어떤 객체와도 잘 동작합니다.
ListClientExample 클래스는 유용한 동작을 하지 않지만, List를 캡슐화하는 클래스의 필수 요소를 가지고 있습니다.
즉, List형의 인스턴스 변수를 가지고 있습니다.
ListClientExample 클래스의 생성자는 새로운 LinkedList 객체를 만들어 리스트를 초기화합니다.
getList 메서드는 getter 메서드로 List 객체에 대한 참조를 반환합니다.
main 메서드는 이 메서드들을 테스트하는 몇 줄의 코드를 포함합니다.
LinkedList나 ArrayList 같은 구현 클래스는 필요한 경우가 아니면 가능한 한 List 인터페이스를 사용합니다.
예를 들어, 인스턴스 변수는 List 인터페이스로 선언하고 getList 메서드도 List형을 반환하지만 구체적인 클래스는 언급하지 않습니다.
만약 LinkedList에서 ArrayList 클래스를 사용하고자 한다면 생성자만 바꾸고 그 외에는 그대로 둬도 됩니다.
이러한 스타일을 인터페이스 기반 프로그래밍 또는 간단하게 인터페이스 프로그래밍이라고 합니다.
여기서 인터페이스는 자바 interface가 아닌 일반적인 개념의 인터페이스를 말합니다.
라이브러리를 사용할 때 코드는 오직 List와 같은 인터페이스만 의존하고 ArrayList 클래스와 같은 특정 구현에 의존해서는 안됩니다.
이러한 방식으로 하면 나중에 구현이 변경되어도 인터페이스를 사용하는 코드는 그대로 사용할 수 있습니다.
반면에 인터페이스가 변경되면 인터페이스를 의존하는 코드는 변경되어야 합니다.
꼭 필요한 일이 아니면 라이브러리 개발자가 인터페이스를 변경하지 않는 이유입니다.
2023.03.12 - [Study/Think Data Structures] - [자바로 배우는 핵심 자료구조와 알고리즘] 2장. 알고리즘 분석
'Study > Think Data Structures' 카테고리의 다른 글
[자바로 배우는 핵심 자료구조와 알고리즘] 3장. ArrayList 클래스 (0) | 2023.03.14 |
---|---|
[자바로 배우는 핵심 자료구조와 알고리즘] 2장. 알고리즘 분석 (0) | 2023.03.12 |