2주차 ( 컬렉션 프레임워크 , 제네릭, 열거형 , 어노테이션 )

2019. 5. 16. 19:43Java

컬렉션 프레임워크

  • 컬렉션 - 다수의 데이터
  • 프레임워크 - 표준화되는 프로그래밍 방식

기본 배열

  • 타입 명시, 길이 명시

기본배열 Collapse source

int[] nums1 = new int[3];

 

nums1[0] = 100;

nums1[1] = 200;

nums1[2] = 300;

 

for(int i=0; i<nums1.length; i++) {

    System.out.println(nums1[i]);

}

핵심 인터페이스

JDK1.2 이전 > Vector, Hashtable

  • List
    • 순서가 있는 데이터 집합
    • 데이터 중복을 허용
    • Vector,  ArrayList, LinkedList, Stack
  • Set
    • 순서를 유지하지 않는 데이터의 집합
    • 데이터의 중복을 허용하지 않는다.
    • HashSet, TreeSet
  • Map
    • 키와 값의 쌍으로 이루어지는 데이터의 집합
    • 순서는 유지되지 않음
    • 키는 중복을 허용하지 않지만, 값은 중복을 허용한다
    • HashMap, Hashtable, TreeMap

List

<List https://docs.oracle.com/javase/8/docs/api/java/util/List.html >

  • Vector vs ArrayList (ex_arrayList.java) 
    • 공통점
      • List 인터페이스를 구현
      • 저장 순서가 유지되고 중복을 허용
      • 데이터의 저장 공간으로 배열을 사용한다.
    • 차이점
      • Vector는 멀티쓰레드에 대한 동기화가 되어 있고, ArrayList는 그렇지 않다
  • LinkedList (ex_linkedList.java)
    • 다음 요소의 접근성
    • 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있음.
    • 요소의 추가/삭제 작업 시 비용 발생이 저렴하다 ↔ ArrayList의 반대
    • 모든 컬렉션 중 요소에 대한 접근 속도가 느리다. ↔ ArrayList의 반대 
  • doubleLinkedList
    • 다음, 이전 요소의 접근성
    • 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있음.
  • doubly-LinkedList
    • 다음, 이전, 시작과 끝 접근성
    • 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있음.
  • Stack (ex_stackqueue.java
    • LIFO(Last In First Out)
    • ArrayList
  • Queue (ex_stackqueue.java)
    • FIFO(First In First Out)
    • LinkedList

 

Set

<Set https://docs.oracle.com/javase/7/docs/api/java/util/Set.html >

  • HashSet (ex_hashSet.java)
  • TreeSet (ex_treeSet.java)

 

Map

<Map https://docs.oracle.com/javase/7/docs/api/java/util/Map.html >

  • HashMap (ex_map.java)
    • key값 가져오기 keySet
    • key, value값 가져오기 entrySet
  • TreeMap (ex_map.java
    • 이진검색트리의 형태로 키와 값의 쌍으로 이루어지는 데이터를 저장
    • 범위검색 및 정렬이 필요한 경우 사용
    • 방번호 X

 

컬렉션 접근 (ex_iterator.java)

< API https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html >

  • 컬렉션 클래스에 저장된 데이터를 접근하는데 사용되는 인터페이스.

 

  • Enumaration
    • Iterator 구버전
  • Iterator
    • List, Set 계열에 구현
    • 주로 읽기 전용으로 사용됨
    • 컬렉션 클래스에 저장된 요소들을 나열하는 방법을 제공
    • 컬렉션 클래스의 iterator()를 호출해서 Iterator를 구현한 객체를 얻음.
  • ListIterator
    • Iterator의 기능을 상속
    • Iterator의 접근성을 향상시킨 것이 ListIterator(단방향 > 양방향)
    • listIterator()를 통해서 얻음.
    • List 계열만 지원
    • 속도가 느림

 

컬렉션 정렬

  • Comparable, compareTo()  (ex_comparable.java)
    • java.lang.Comparable 
    • 기본 정렬 기준을 구현하는데 사용
  • Comparator, compare()        (ex_comparator.java)
    • java.util.Comparator 
    • 기본 정렬기준 외에 다른 기준으로 정렬하고자 할떄 사용

 

제네릭 (ex_generic.java)

  • 타입 체크
  • 클래스 내부에서 사용할 데이터 타입을 나중에 인스턴스를 생성할 때 확정 짓는것
  • 타입 안정성.
  • 코드 간결화
  • 제네릭 <T>
  • 복수 제네릭<T,S>

 

  • E - Element
  • K - Key
  • N - Number
  • T - Type
  • V - Value

 

  • <?> : 모든 객체 자료형, 내부적으로는 Object로 인식
  • <? super 객체자료형> : 명시된 객체자료형의 상위 객체, 내부적으로는 Object로 인식
  • <? extends 객체자료형> : 명시된 객체 자료형을 상속한 하위객체, 내부적으로는 명시된 객체 자료형으로 인식

 

<출처: http://palpit.tistory.com/668>

  • Test<?>
  • Test은 모든 타입(Person, Worker, Student, HighStudent>이 될 수 있습니다.
  • Test<? extends Student>
  • Test은 Student와 HighStudent만 될 수 있습니다.
  • Test<? super Worker>
  • Test은 Worker와 Person만 될 수 있습니다.

 

열거형 (ex_enum.java)

 

  • 클래스의 일종.
  • 서로 관련 있는 상수들을 모아 집합으로 정의함. 즉 정해진 값만 사용할 수 있도록 제한됨.
  • 자료형이 없음.
  • 새로운 열거형을 선언하면, 내부적으로 Enum 클래스형 기반의 새로운 클래스형이 만들어짐
  • 열거된 순서에 따라 0부터 순서값을 가짐, 차례대로 증가함
  • enum 열거형으로 지정된 상수는 대문자 사용.
  • 마지막 끝에 세미콜론을 붙이지 않음.

 

  • enum생성자는 왜 private일까?
    • < 참고 http://www.nextree.co.kr/p11686/ >
    • public과 protected로 설정하게 되면 에러가 발생한다. enum 타입은 고정된 상수들의 집합으로 런타임이 아닌 컴파일 타임에 모든 값을 알고 있어야한다. 즉 다른 패키지나 클래스에서 enum 타입에 접근해서 동적으로 어떤 값을 정해줄 수 없다. 따라서 컴파일시에 타입 안정성이 보장됨. 해당 enum클래스 내에서 까지도 new 키워드로 인스턴스 생성이 불가능하다

 

 

어노테이션(Annotation)

<참고 http://www.nextree.co.kr/p5864/ >

  • Java 5부터 추가된 기능
  • 클래스나 메소드 위에 붙여 사용
  • 소스코드에 메타코드를 주는 것 *메타코드 = 추가정보
  • 사용자 정의가능 > 커스텀 어노테이션 - 정의 - 사용 - 실행
  • new > Annotation
  • @Entite
  • Build-in Annotation
    • @Override 
      • 메소드가 오버라이드 됐는지 검증한다.
      • 만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 발생.
    • @Deprecated
      • 메소드를 사용하지 말도록 유도한다. 만약 사용한다면 컴파일 경고를 일으킨다.
    • @SuppressWarnings
      • 컴파일 경고를 무시하도록 합니다.
    • @SafeVarargs
      • 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다. (자바7 이상)
    • @FunctionalInterface
      • 람다 함수등을 위한 인터페이스를 지정함. 메소드가 없거나 두개 이상 되면 컴파일 오류 발생. (자바 8이상)
  • Meta Annotation
    • @Retention
      • 어떤 시점까지 어노테이션이 영향을 미치는지 결정.
    • @Documented 
      • 문서에도 어노테이션의 정보가 표현됨.
    • @Target 
      • 어노테이션이 적용할 위치를 결정한다.
    • @Inherited 
      • 이 어노테이션을 선언하면 자식클래스가 어노테이션을 상속 받을 수 있다.
    • @Repeatable 
      • 반복적으로 어노테이션을 선언할 수 있게 한다.
  • Custom Annotation ( ex_annotation.java )

'Java' 카테고리의 다른 글

4주차 익셉션, 생명주기  (0) 2019.06.16
4주차 ( 람다식 , 입출력 )  (0) 2019.05.11