JAVA 속성 벼락치기 (4) : 컬렉션 프레임워크

JAVA 속성 벼락치기 (4) : 컬렉션 프레임워크

클래스명을 정말 멋대로 작성하고 있었는데 클래스 이름은 보면 파스칼케이스로 선언하는 것 같다... 언제나 통일된 기준을 지니고 거기에 코드를 맞출 것.

(1) Generic

특정 클래스에서 여러 타입의 변수들을 사용하지만 사용하는 메서드 내용은 실질적으로 같고 오로지 타입만 다를 때, 선언시에 타입을 특정하지 않는 제네릭 프로그래밍을 통해 개발편의성을 높일 수 있다. (물론 Object 타입을 사용할 수도 있겠지만 Object 사용시 형변환을 수행해야하는 등 불편한 점이 많다.)

클래스를 사용할 때 다이아몬드 연산자 <>위치에 해당 클래스에서 사용할 자료형을 지정한다. 매개변수명으로는 자료형의 타입이라는 의미로 T가 많이 사용되지만 K(ey), V(alue), E(lement)등 의미에 따라 여러 알파벳 문자들이 사용된다. 또, static 변수는 타입으로 지정할 수 없다.

선언한 타입대로 사용해야 하고 선언한 타입과 다른 타입을 넣으면 당연히 에러가 발생한다.

(2) T extends

제네릭 프로그래밍이라고 해도 자료형에 의도치 않은 전혀 다른 클래스가 들어가면 곤란한 상황이 나올 수 있다. 이럴 때는 T extends를 통하여 클래스에서 사용할 수 있는 자료형에 제한을 걸어줄 수 있다.

방법은 간단하게 다이아몬드 연산자 안에 Material 클래스를 상속받은 클래스들만 타입으로 올 수 있다고 넣어주면 끝.

(3) 제네릭 메소드

제네릭 클래스 뿐 아니라 일반 클래스의 메소드에도 제네릭을 사용할 수 있다.

접근제어자 앞에 사용할 제네릭 매개변수를 선언해주면 된다.

(4) 컬렉션 프레임워크

java.util 패키지에는 프로그램 구현에 필요한 자료구조들을 구현해둔 JDK 라이브러리가 있다. 많이 사용하는 ArrayList, Vector 등도 이 중 하나. 이 라이브러리들을 활용하여 개발에 소요되는 시간을 절약하며 최적화된 알고리즘을 활용할 수 있다.

크게 여러 요소를 한번에 관리하는 Collection, 그리고 Key와 Value 쌍으로 이루어진 Map 두 개의 인터페이스로 나뉜다. Collection 아래에는 배열에 가까운 개념인 List 인터페이스와 집합에 가까운 개념인 Set 인터페이스가 존재한다.

https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

Collection 요소에는 요소들을 순회하는 Iterator라는 것이 있다. 리스트에는 순서라는 개념이 있기 때문에 굳이 iterator를 사용하지 않아도 for문을 돌려 get(i) 메소드를 통해 요소를 찾아낼 수 있지만 집합관련 인터페이스인 Set에는 순서라는 개념이 존재하지 않아 iterator를 통해 요소들을 순회해야 한다.

https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

get(i)

iterator

HashSet은 중복을 허용하지 않는 개념이므로, 필요에 따라 동일성 구현을 위하여 equals와 hashcode 메소드를 오버라이딩하여 사용하기도 한다. 기본적으로 equals 메소드를 통해서 동일성을 체크하고 리스트에 추가하도록 되어있나봄?

(5) Comparable과 Comparator

TreeSet은 객체의 정렬에 활용하는 클래스이다. Set이라는 이름답게 중복은 허용되지 않는다. 내부적으로 이진검색트리로 구현되며, 내부적으로 Comparable이나 Comparator 인터페이스를 구현해야만 TreeSet에 추가될수 있는데 String이나 Integer 등 많은 클래스들에 이미 Comparable이나 Comparator가 구현되어있다. 달리 말해 직접 구현해서 쓰는 클래스 타입은 수제로 해당 인터페이스를 추가해주어 정렬기준을 제시해야 제대로 정렬이 되어 보인다는 소리.

Comparator가 없으면 이렇게 Exception이 뜬다.

그러면 Comparable 구현하는법. 일단 Comparable 인터페이스를 상속받는다고 선언해주고, 정렬대상이 되는 데이터타입도 함께 지정해주어야 한다.

그 다음 compareTo 메소드를 오버라이딩해서 정렬기준을 세팅해주면 됨.

여기에서는 memberId를 기준으로 오름차순 정렬을 했다. 내림차순으로 정렬하고싶으면 간단하게 * (-1)을 해주면 된다. Tree를 이용하여 구현하는것이므로 절대값은 상관이 없고 양/음/0만 따진다.

(6) Map 인터페이스

HashMap은 Map 인터페이스의 구현클래스들 가운데 가장 많이 사용되는 것인데, key값을 기준으로 인자를 검색하고 꺼낸다. 주요 메소드는 containsKey()나 put(key, value), remove(key) 등. key가 되는 객체는 중복될 수 없으며, 객체의 유일성 비교를 위해 equals와 hashcode 메소드를 오버라이딩해서 사용하는 경우가 많다.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

HashMap 사용예시

from http://hardblackpencil.tistory.com/63 by ccl(A) rewrite - 2021-09-30 13:27:21