2주차 ( 컬렉션 프레임워크 , 제네릭, 열거형 , 어노테이션 )
2019. 7. 13. 14:11ㆍ카테고리 없음
컬렉션 프레임워크
- 컬렉션 - 다수의 데이터
- 프레임워크 - 표준화되는 프로그래밍 방식
기본 배열
- 타입 명시, 길이 명시
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이상)
- @Override
- Meta Annotation
- @Retention
- 어떤 시점까지 어노테이션이 영향을 미치는지 결정.
- @Documented
- 문서에도 어노테이션의 정보가 표현됨.
- @Target
- 어노테이션이 적용할 위치를 결정한다.
- @Inherited
- 이 어노테이션을 선언하면 자식클래스가 어노테이션을 상속 받을 수 있다.
- @Repeatable
- 반복적으로 어노테이션을 선언할 수 있게 한다.
- @Retention
- Custom Annotation ( ex_annotation.java)