[JAVA] 컬렉션

MINJEE·2024년 1월 14일

SMHRD_8_Java

목록 보기
8/10
post-thumbnail

🔷 컬렉션 (Collection)

: 가변 개수의 객체들(요소)의 저장소/컨테이너
  • 요소의 개수에 따라 크기 자동 조절
  • 요소의 삽입/삭제에 따른 요소의 위치 자동 이동
  • 제네릭(generics) 기법으로 구현

🔷 제네릭 (Generic)

 : 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신가능하도록 클래스/메소드를 일반화시키는 기법
  • 컬렉션의 클래스/인터페이스 이름에 타입매개변수(<E>,<K>,<V> 등) 포함
    • E(element) : 요소, K(key) : 키 값, V(value) : key에 대응되는 값
    • 요소는 객체만 가능 (int 등 기본타입을 불가능)
  • 타입 매개변수는 일반적으로 대문자 알파벳 한 개로 아무거나 사용 가능

🔷 Vector<E> 클래스 (java.util.Vector)

: 배열을 가변크기로 다룰 수 있게 하는 컨테이너
  • <E> : E 대신 사용할 요소의 특정 타입으로 구체화 (ex. )
  • 동기화 지원, 한번에 하나의 스레드만 접근 가능
  • 삽입 가능한 것 : 객체, null
    • 기본타입은 Wrapper객체로 만들어서 삽입
  • Vector<타입매개변수> 변수 = new Vector<타입매개변수>(용량); : 벡터 객체 생성
  • 메소드
    • 변수.add(E 요소) : 벡터 맨 뒤에 요소 추가
    • 변수.add(int 인덱스, E 요소) : 인덱스 위치에 요소 추가
    • 변수.capacity() : 벡터의 용량 리턴 (선언 시 용량 생략하면 디폴트값 10)
    • 변수.size() : 요소 개수 리턴
    • 변수.clear() : 모든 요소 삭제
    • 변수.remove(int 인덱스) : 인데스 위치의 요소 삭제
    • 변수.remove(Object 객체) : 객체와 같은 첫 번째 요소를 삭제
    • 변수.removeAllElements() : 모든 요소 삭제, 크기 0으로 만듦
    • 변수.elementAt(int 인덱스) : 인덱스 위치의 요소 리턴
    • 변수.get(int 인덱스) : 인덱스 위치의 요소 리턴
    • 변수.indexOf(Object 객체) : 객체와 같은 첫번째 요소의 인덱스 리턴 (없으면 -1)
    • 변수.contains(Object 객체) : 객체를 포함하고 있으면 true 리턴
    • 변수.isEmpty() : 벡터가 비어 있으면 true 리턴
    • 변수.toArray() : 벡터의 모든 요소를 포함하는 배열 리턴

🔷 ArrayList (java.util.ArrayList)

: 가변크기의 배열 구현한 클래스 (벡터 기능과 거의 동일)
  • 스레드 동기화 기능 x
    • 동시에 여러 스레드 작업 가능
    • 개발자가 명시적으로 동기화하는 코드를 추가해야함
  • ⇒ Vector 보다 ArrayList가 속도가 더 빠르고, ArrayList를 사용하는 것이 바람직!
  • ArrayList<타입매개변수> 변수 = new ArrayList<타입매개변수>(용량); : ArrayList객체 생성
  • 위의 벡터 메소드에서 capacity()와 removeAllElements()빼고 동일

🔷 Iterator (java.util.Iterator)

: 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 인터페이스
  • Vector, ArrayList, LinkedList 가 상속받는 인터페이스
  • Iterator<타입매개변수> 변수 = 컬렉션변수.iterator(); : Iterator객체 생성
    • 컬렉션변수는 Vertor/ArrayList/LinkedList 중 하나의 변수
  • 메소드
    • 변수.hasNext() : 다음 반복에서 사용될 요소 있으면 true 리턴
    • 변수.next() : 다음 요소 리턴
    • 변수.remove() : 마지막으로 리턴된 요소 제거
// 예제 : Iterator를 이용하여 정수 벡터 검색
Vertor<Integer> v = new Vector<Integer>(); // 정수 값만 다루는 제네릭 벡터 생성
v.add(5); // 요소 5 추가
v.add(4); // 요소 4 추가
v.add(-1); // 요소 -1 추가
v.add(2, 100); // 인덱스 2인 위치에 요소 100 추가

Iterator<Integer> it = v.iterator(); //Iterator 객체 얻기
while(it.hasNext()) { //다음 반복할 요소 있으면
		int n = it.next(); //다음 요소 리턴
		System.out.print(n + " "); 
} // 5 4 100 -1

🔷 HashMap<K,V> (java.util.HashMap)

: 키와 값의 쌍으로 구성되는 요소를 다루는 컬렉션
  • <K,V> : K에는 키로 사용할 요소타입, V에는 값으로 사용할 요소타입
  • 삽입/검색 빠름 : 삽입은 put(), 검색은 get() 메소드 사용
  • HashMap<key타입매개변수, value타입매개변수> 변수 = new HashMap<key타입매개변수, value타입매개변수>(); : 해시맵 객체 생성
  • 메소드
    • 변수.put(K 키, V 값) : key와 value를 매핑하여 저장
    • 변수.get(Object 키) : 키에 매핑되는 값 리턴 (매핑되는 값 없으면 null 반환)
    • 변수.remove(Object 키) : 키와 매핑되는 값을 삭제
    • 변수.clear() : 모든 요소 삭제
    • 변수.containsKey(Object 키) : 키를 포함하고 있으면 true 리턴
    • 변수.containsValue(Object 값) : 값에 매핑가능한 키가 있으면 true 리턴
    • 변수.isEmpty() : 비어 있으면 true 리턴
    • 변수.size() : 요소 개수 리턴
    • 변수.keySet() : 모든 키를 담은 Set 컬렉션 리턴

🔷 제네릭 생성

  • 타입 : T, E, K, V, N (타입 매개변수로 사용되는 관례적인 알파벳)
    • <T> : Type, 다양한 객체 타입을 나타내는 용도로 사용
    • <E> : Element, 주로 컬렉션의 요소(element)를 나타내는 용도로 사용
    • <K> : Key, 주로 맵(Map)에서 키(key)를 나타내는 용도로 사용
    • <V> : Value, 주로 맵(Map)에서 값(value)을 나타내는 용도로 사용
    • <N> : Number, 주로 숫자(Number) 타입을 나타내는 용도로 사용
      ⇒ 이러한 알파벳은 규약이며, 실제로 타입 매개변수의 이름을 정하는 것은 개발자의 선택에 달려있음
  • 제네릭 클래스 작성 : 클래스명 옆에 일반화된 타입 매개변수 추가
  • 구체화 = 제네릭 타입에 구체적인 타입을 지정하여 객체를 생성하는 것
    //예시 : 제네릭 클래스 생성, 제네릭 객체 생성
    public class MyClass<T> {
    		T val; //val변수의 타입은 T
    		void set(T a) { val = a; } //T타입의 a를 val변수에 저장
    		T get() { return val; } //T타입의 val값 리턴
    }
    
    public class Example {
    		public static void main(String[] args) {
    				MyClass<String> s = new MyClass<String>(); // T를 String으로 구체화
    				s.set("hello");
    				System.out.println(s.get()); // "hello" 출력
    
    				MyClass<Integer> n = new MyClass<Integer>(); // T를 Integer로 구체화
    				n.set(5);
    				System.out.println(n.get()); // 숫자5 출력
    		}
    }
profile
개발, 분석 배운 내용 정리하기!

0개의 댓글