// enum 열거형 이름 { 상수명1, 상수명2, ...}
enum Seasons { SPRING, SUMMER, FALL, WINTER }
// 자동적으로 0부터 시작되는 정수값이 할당됨.
enum으로 정의한 상수는 switch문에서도 사용이 가능
//열거형이름.상수명
System.out.println(Seasons.SUMMER); // SUMMER
열거형에서 사용할 수 있는 메서드
name()
- 열거 객체가 가지고 있는 문자열 리턴 상수 이름과 동일
ordinal()
int형 - 열거 객체의 순번(0부터시작)을 리턴
compareTo(비교값)
int형 - 주어진 매개값과 비교해서 순번 차이를 리턴
valueOf(Stringname)
- 주어진 문자열의 열거 객체를 리턴
values()
- 모든 열거 객체들을 배열로 리턴
- 래퍼 클래스 : 기본 자료타입을 객체로 다루기 위해 사용하는 클래스
<>
안에 바꿔줄 타입을 넣을 때 래퍼 클래스 사용
제네릭이 사용된 클래스 = 제네릭 클래스
class Basket<T> { // 타입 매개변수 T 선언
private T item; // 임의의 타입으로 사용 가능
}
T
- Type K
- Key V
- Value
E
- Element N
- Number R
- Result
- 주의할 점
static이 붙는 클래스 변수에는 타입 매개변수 사용할 수 없음class Basket<T> { private T item1; // O static T item2; // X }
Basket<String> basket1 = new Basket<>("Java");
Basket<Integer> basket2 = new Basket<>(5);
Basket<Double> basket3 = new Basket<>(2.24);
&
사용 (클래스가 인터페이스보다 앞에 위치)class Basket<T> { // 클래스에서 선언한 타입 매개변수 T와
...
public <T> void add(T element) { // 메서드에서 선언한 T는 서로 다르다.
...
}
}
Basket<String> basket = new Basket<>(); // 객체의 T가 String으로 지정
basket.<Integer> add(5); // 메서드의 T가 Integer로 지정
basket.add(5); // 타입 지정 생략 가능
static
메서드에도 선언 가능length()
와 같은 String 클래스의 메서드는 제네릭 메서드를 정의하는 시점에 사용 불가Object
클래스의 메서드는 사용 가능class Basket {
public <T> void print(T item) {
System.out.println(item.length()); // 사용 불가
// System.out.println(item.equals("Hello")); 사용 가능
}
}
?
기호로 사용extends
와 super
키워드 조합 사용<? extends T> // 상한제한 T와 T를 상속받은 하위 클래스 타입만 타입 파라미터로 받을 수 있도록 지정
<? super T> // 하한제한 T와 T의 상위 클래스만 타입 파라미터로 받도록 함.
에러에 대응할 수 있는 코드를 미리 사전에 작성하여 비정상적인 종료를 방지
컴파일 에러 / 런타임 에러
- 컴파일 에러
컴파일 할 때 발생하는 에러 ( ;생략, 오탈자, 잘못된 자료형, 잘못된 포맷 등)
문법적인 문제를 가리키는 신택스(syntax) 에러
- 런타임 에러
런타임 시에 발생하는 에러 (프로그램 실행 시)
컴퓨터가 수행할 수 없는 특정한 작업 요청시 발생
모든 예외의 최고 상위클래스 Exception
클래스
- 일반 예외 클래스(Exception)
주로 잘못된 클래스명이나 데이터 형식checked 예외
- 실행 예외 클래스(Runtime Exception)
런타임 시 발생하는 클래스와 그 하위클래스
개발자의 실수에 의해 발생unchecked 예외
try {
//예외가 발생할 가능성이 있는 코드
}
catch (ExceptionType1 e1) {
//ExceptionType1 유형의 예외 발생 시 실행할 코드
}
catch (ExceptionType2 e2) {
//ExceptionType2 유형의 예외 발생 시 실행할 코드
}
finally {
//finally 블럭은 옵션
//예외 발생 여부와 상관없이 항상 실행됨
}
예제
예외 전가
예외를 호출한 곳으로 다시 예외를 떠넘기는 방법 throws
사용
반환타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ...{
...
}
의도적인 예외 발생시키기 throw
사용
데이터들의 집합 컬렉션, 컬렉션을 다루는 데에 편리한 메서드들을 미리 정의해놓은 것
- List
- 데이터의 순서가 유지, 중복 저장 가능
- ArrayList, Vector, Stack, LinkedList 등이 List 인터페이스를 구현
- Set
- 데이터의 순서 유지x, 중복 저장 불가
- HashSet, TreeSet 등이 Set 인터페이스를 구현
- Map
- 키(key)와 값(value)의 쌍으로 데이터를 저장하는 컬렉션을 구현하는데 사용
- 데이터의 순서 유지x, 키는 중복 저장 불가, 값은 중복 저장 가능
- HashMap, HashTable, TreeMap, Properties 등
List 컬렉션에서 공통적으로 사용 가능한 주요 메소드
ArrayList
List 인터페이스를 구현한 클래스 가장 많이 사용
데이터가 연속적으로 존재하며, 자동으로 저장용량이 늘어난다.
저장할 객체 타입을 제네릭으로 표기하고 기본 생성자 호출
List<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장용량); List<String> container1 = new ArrayList<String>(); // String 타입의 객체를 저장하는 ArrayList 생성 // 초기 용량을 정해주지 않으면 기본적으로 10으로 지정됨. List<String> container = new ArrayList<String>(30); // String 타입의 객체를 저장하는 ArrayList 생성 // 초기 용량을 30으로 지정함.
특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 1씩 당겨짐.
- LinkedList
데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용
불연속적으로 존재, 데이터는 서로 연결되어 있음.- 데이터를 삭제하거나 추가하려면 링크를 끊거나 이어주는 방식.
ArrayList의 장점
- 데이터를 순차적으로 추가하거나 삭제하는 경우
- 데이터를 읽어들이는 경우
LinkedList의 장점
- 중간에 위치하는 데이터를 추가하거나 삭제하는 경우
(Prev와 Next의 주소값만 변경하면 됨.)데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않으면 ArrayList를 사용
iterator()
를 호출하면 iterator 타입의 인스턴스 반환
- Iterator 인터페이스에 정의된 메서드
hasNext()
- 읽어올 객체가 남아있으면 true, 없으면 false 리턴
next()
- 컬렉션에서 하나의 객체를 읽어옴.
(호출 전 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인)
remove()
- next()를 통해 읽어온 객체 삭제
(호출 전 next() 먼저 호출)List<String> list = ...; Iterator<String> iterator = list.iterator(); While(iterator.hasNext()){ //다음 객체가 있다면 String str = iterator.next(); // 객체를 읽어오고 if(str.equals("str과 같은 단어")) { // 조건에 부합한다면 iterator.remove(); // 해당 객체를 컬렉션에서 제거한다. } }
HashSet
TreeSet
이 있다.
- HashSet
- 대표적인 Set 인터페이스 구현 클래스로 중복 x, 순서 유지 x
값 추가 시 중복된 값 판단 과정
add(Object o)
를 통해 객체를 추가하고자 한다.- 저장하고자 하는 객체의 해시코드를
hashCode()
메서드로 얻기- Set이 저장하고 있는 모든 객체들의 해시코드를
hashCode()
로 얻기- 해시코드를 서로 비교하여 같은 해시코드가 있는지 검사
a. 같은 해시코드를 가진 객체가 존재하면 5번으로
b. 존재하지 않으면 객체가 추가되며 `add(Object o) 메서드가 true 리턴equals()
메서드로 객체 비교
- TreeSet
이진 탐색 트리 형태로 데이터 저장
하나의 부모 노드가 최대 두개의 자식 노드와 연결되는 이진 트리
정렬과 검색에 특화
- 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 오른쪽 자식의 값은 크다.
- 데이터를 추가할 때 정렬을 실시
- HashMap
많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능Entry 객체는 Map인터페이스의 내부 인터페이스인 Entry 인터페이스를 구현
- Map.Entry 인터페이스의 메서드
HashMap 생성
HashMap<String, Integer> hashmap = new HashMap<>();
저번 클래스 파트부터 뭔가 정리가 잘 되지 않는 느낌이다ㅠㅠ 컨텐츠 학습 외 따로 공부를 많이 하고 실습을 하면서 정리를 해야 할 것 같은데 자꾸 모르니까 더 하기싫고 밀리는 기분,, 내일 컬렉션 연습문제 풀어야 하는데 걱정이 된다ㅠㅠ