반응형
본 포스팅은 프로그래머스 자바 중급 강의에 기반하여 작성되었습니다.
자바 강의의 모든 내용이 적힌것이 아닌 복습시 놓쳤던 부분을 하나하나 정리한 내용입니다.
순서 java.util 패키지, 컬렉션 프레임워크, Generic, Set, List, Map
java.util패키지는 유용한 클래스들을 많이 가지고 있는 패키지
- 날짜와 관련된 클래스인 Date, Calendar클래스
- 자료구조와 관련된 컬렉션 프레임워크와 관련된 인터페이스와 클래스
- deprecated란 더이상 지원하지 않으니 사용하지 않는 것이 좋다란 의미다.
- Date클래스는 지역화를 지원하지 않는다. 지역화란 국가별로 현재 날짜와 시간은 다를 수 있는데, 그 부분을 지원하지 못한다.
- 이런 문제를 해결하기 위하여 나온 클래스가 Calendar클래스. Calendar클래스는 자바 1.1에 등장하였다.
- 지역화와 관련된 클래스들은 Locale로 시작되는 이름을 가진 클래스들입니다. 역시 1.1 이후에 등장한다.
- List, Set, Collection, Map은 자료구조 즉 컬렉션 프레임워크와 관련된 인터페이스
컬렉션 프레임워크
java.util패키지에는 자료를 다룰 수 있는 자료구조 클래스가 다수 존재합니다.
자료구조 클래스들을 컬렉션 프레임워크라고 한다.
- 자료구조란? 자료를 저장할 수 있는 구조
- 책을 보관하기 위해서 책장을 이용하는 것처럼 다양한 자료들을 다양한 방식으로 관리하기 위한 방법이 필요한데, 이러한 방법을 제공하는 것을 자료구조, 컬렉션 프레임워크 라고한다.
- 컬렉션 프레임워크에서 가장 기본이 되는 interface는 Collection인터페이스
- Collection인터페이스는 여기에 자료가 있다라는 것을 표현.
- 중복도 허용하고, 자료가 저장된 순서도 기억하지 못하는 것이 Collection인터페이스.
- Collection이 가지고 있는 대표적인 메소드는 add(), size(), iterator() 메소드
- Collection은 저장된 순서를 기억하지 못하기 때문에 "첫번째 자료를 달라, 두번째 자료를 달라"와 같은 기능을 가질 수 없다. *
- * Collection은 저장된 자료를 하나씩 하나씩 꺼낼 수 있는 Iterator라는 인터페이스를 반환한다.
- Iterator는 꺼낼것이 있는지 없는지 살펴보는 hasNext()메소드와
- 하나씩 자료를 꺼낼때 사용하는 next()메소드를 가지고 있다.
- Set자료구조는 중복을 허용하지 않는 자료구조를 표현하는 인터페이스
- Collection인터페이스를 상속받는다.
- Set인터페이스가 가지고 있는 add메소드는 같은 자료가 있으면 false,
- 없으면 true를 반환하는 add메소드를 가지고 있다.
- List자료구조는 중복은 허용하면서 순서를 기억하는 자료구조를 표현.
- Set인터페이스와 마찬가지로 Collection인터페이스를 상속받고 있다.
- List는 순서를 기억하고 있기 때문에 0번째 1번째 n번째의 자료를 꺼낼 수 있는 get(int)메소드를 가지고 있다.
- Map자료구조는 Key와 Value를 가지는 자료구조이다.
- 저장할 때 put()메소드를 이용하여 key와 value를 함께 저장한다.
- 원하는 값을 꺼낼때는 key를 매개변수로 받아들이는 get()메소드를 이용하여 값을 꺼낸다.
- Map에 저장되어 있는 모든 Key들은 중복된 값을 가지면 안된다.
- Key의 이런 특징 때문에 Map은 자신이 가지고 있는 모든 Key들에 대한 정보를 읽어들일 수 있는 Set을 반환하는 keySet()메소드를 가지고 있다.
- Collection FrameWork
※ Generic
Box 클래스
public class Box {
private Object obj;
public void setObj(Object obj){
this.obj = obj;
}
public Object getObj(){
return obj;
}
}
Box를 사용하는 BoxExam 클래스
public class BoxExam {
public static void main(String[] args) {
Box box = new Box();
box.setObj(new Object());
Object obj = box.getObj();
box.setObj("hello");
String str = (String)box.getObj();
System.out.println(str);
box.setObj(1);
int value = (int)box.getObj();
System.out.println(value);
}
}
- Box는 매개변수로 Object를 하나 받아들이고, Object를 반환한다.
- Object를 받아들일 수 있다는 것은 Object의 후손이라면 무엇이든 받아들일 수 있다는 것이다.
- Object는 최상위 클래스이기 때문
Java5에는 Generic이라는 문법이 사용됨으로써 인스턴스를 만들때 사용하는 타입을 지정하는 문법이 추가
Generic을 이용하여 Box 클래스 수정
public class Box<E> {
private E obj;
public void setObj(E obj){
this.obj = obj;
}
public E getObj(){
return obj;
}
}
- 클래스 이름 뒤에 <E>가 제네릭을 적용한 것이다. Box는 가상의 클래스 E를 사용한다는 의미.
- Object를 받아들이고, 리턴하던 부분이 E로 변경. E는 실제로 존재하는 클래스는 아니다.
Generic을 이용하여 수정한 Box를 이용하는 BoxExam클래스
public class BoxExam {
public static void main(String[] args) {
Box<Object> box = new Box<>();
box.setObj(new Object());
Object obj = box.getObj();
Box<String> box2 = new Box<>();
box2.setObj("hello");
String str = box2.getObj();
System.out.println(str);
Box<Integer> box3 = new Box<>();
box3.setObj(1);
int value = (int)box3.getObj();
System.out.println(value);
}
}
- 참조타입에 <Object> , <String>, <Integer>가 있는 것을 볼 수 있다.
- 첫번째는 Object를 사용하는 Box를 인스턴스로 만들겠다는 의미
- 두번째는 String을 사용하는 Box인스턴스를 만들겠다는 의미
- 세번째는 Integer를 사용하는 Box인스턴스를 만든다는 의미, (1)은 오토박싱으로 Integer가 됨
Generic을 사용함으로써 선언할때는 가상의 타입으로 선언하고, 사용시에는 구체적인 타입을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들 수 있습니다. Generic을 사용하는 대표적인 클래스는 컬렉션 프레임워크와 관련된 클래스입니다.
Set
set은 중복이 없고, 순서도 없는 자료구조. Hashset과 TreeSet이 있다.
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetExam {
public static void main(String[] args) {
Set<String> set1 = new HashSet<>(); // Generic으로 String값만 받는다
// Set은 인터페이스이기 때문에 인스턴스 생성이 불가능하다
// Set을 구현한 클래스인 HashSet을 이용하여 생성
boolean flag1 = set1.add("kim"); // add()는 boolean타입 리턴
boolean flag2 = set1.add("lee");
boolean flag3 = set1.add("kim");
System.out.println(set1.size()); // 저장된 크기를 출력합니다. 3개를 저장하였지만,
// 이미 같은 값이 있었기 때문에 2개가 출력
System.out.println(flag1); // 저장할때 리턴했던 boolean값 출력 true
System.out.println(flag2); // true
System.out.println(flag3); // false
// 하나씩 값을 꺼내기위해서 Iterator 인터페이스를 사용
Iterator<String> iter = set1.iterator();
// Iterator는 인터페이스 이기때문에 생성자를 못만듬
// 만들려면 Collection의 iterator()메소드 사용
while (iter.hasNext()) { // 꺼낼 것이 있다면 true 리턴.
String str = iter.next(); // next()메소드는 하나를 꺼낸다.
// 하나를 꺼내면 자동으로 다음것을 참조한다.
System.out.println(str);
}
}
}
List
list는 데이터의 중복이 있을 수 있고, 순서도 있다.
List는 저장공간이 필요에 따라 자유롭게 늘어난다.
배열은 한번 생성하면 크기 변경이 불가능하다.
ListExam
import java.util.ArrayList;
import java.util.List;
public class ListExam {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// List도 인터페이스이기 때문에 List를 구현하고 있는 ArrayList 클래스 사용
// list에 3개의 문자열을 저장합니다.
list.add("kim");
list.add("lee");
list.add("kim");
System.out.println(list.size()); // list에 저장된 자료의 수를 출력 (중복을 허용하므로 3 출력)
for(int i = 0; i < list.size(); i++){ // 순서가 있기 때문에 인덱스로 꺼내오기 가능
String str = list.get(i);
System.out.println(str);
}
}
}
Map
Map은 key와 value를 쌍으로 저장하는 자료구조 키는 중복될 수 없고, 값은 중복될 수 있다.
키를 이용해서 value를 찾을 수 있게 설계되었기 때문에 키는 중복이 불가하다.
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapExam {
public static void main(String[] args) {
// Key, Value가 모두 String 타입인 HashMap인스턴스를 만듭니다.
Map<String, String> map = new HashMap<>();
// key와 value값을 put으로 저장합니다.
map.put("001", "kim");
map.put("002", "lee");
map.put("003", "choi");
// 같은 key가 2개 있을 수 없습니다. 첫번째로 저장했던 001, kim은 001, kang으로 바뀐다.
map.put("001", "kang");
// map에 저장된 자료의 수를 출력합니다. 3이 출력됩니다.
System.out.println(map.size());
// 키가 001, 002, 003인 값을 꺼내 출력합니다.
System.out.println(map.get("001")); // kang
System.out.println(map.get("002")); // lee
System.out.println(map.get("003")); // choi
// map에 저장된 모든 key들을 Set자료구조로 꺼냅니다.
Set<String> keys = map.keySet();
// Set자료구조에 있는 모든 key를 꺼내기 위하여 Iterator를 구합니다.
Iterator<String> iter = keys.iterator();
while (iter.hasNext()) {
// key를 꺼냅니다.
String key = iter.next();
// key에 해당하는 value를 꺼냅니다.
String value = map.get(key);
// key와 value를 출력합니다.
System.out.println(key + " : " + value);
// 001 : kang
// 002 : lee
// 003 : choi
}
}
}
반응형
'프로그래밍 공부 > JAVA' 카테고리의 다른 글
JAVA 중급강의 정리 자바IO 입력과 출력 (0) | 2021.08.18 |
---|---|
JAVA 중급강의 정리 Date, Calendar, java.time패키지 (0) | 2021.08.11 |
JAVA 중급 강의정리 Object클래스 ~ java.lang 패키지 (0) | 2021.08.10 |
JAVA 입문 강의정리 예외 Exception, throws (0) | 2021.07.25 |
JAVA 입문 강의정리 인터페이스 (0) | 2021.07.22 |