- 컬렉션: List, Set, Map
1. Set
- HashSet과 TreeSet
- 공통적으로 중복이 불가하며 HashSet은 순서도 없다.
- Set 사용
Set<String> hs = new HashSet<>();
Set<String> ts = new TreeSet<>();
hs2.add("one"); // add: 추가
hs2.add("one");
hs2.add("one");
hs2.add("one"); // 여러번 추가해도 결과적으로는 "one" 하나만 추가된다.
hs2.add("two");
hs2.add("three");
hs2.add("four");
hs2.remove("two"); // remove: 삭제
- HashSet은 순서가 없기 때문에 순서를 지정해줄 수 있는 반복자 Iterator을 활용
Iterator<String> it = hs2.iterator();
- 전체보기
While(it.hasNext()) { // hasNext(): 다음 값이 존재하는가? True | false
System.out.println(it.next()); // Next(): 다음 값을 리턴한다
}
2. List
- 삽입과 제거 등 수정이 간단하여 배열을 대체한다.
- ArrayList 사용
ArrayList<Integer> arr = new ArrayList<>();
- 값 대입
arr.add(1); // 방을 만들면서 값을 대입 (0번방에 1 대입)
arr.add(2); // (1번방에 2 대입)
arr.add(3);
- 값 수정
arr.set(1, 22); // 1번방의 값을 22로 수정
- 값들 사이에 새로운 값 삽입
arr.add(2, 123); // 기존 2번방에 있던 값을 뒤로 밀어내고 2번방에 새로운 값을 삽입
- 값 삭제
arr.remove(1); // 1번방에 있는 값을 삭제하고 뒤의 값들을 앞으로 당김
- 값 리턴
arr.get(1); // 1번방에 있는 값을 받는다.
- 전체보기
for(int i=0; i<arr1.size(); i++) {
System.out.println(arr.get(i));
}
3. Map
- 순서를 단어로 지정 (key)
- Map 사용하기
HashMap<String, Integer> hm = new HashMap<>();
<key의 변수형, 값의 변수형>
- 값 대입
hm.put("아메리카노", 1500); // "아메리카노"방에 있는 값 1500
- 제거
hm.remove("아메리카노");
- 값 리턴
hm.get("아메리카노");
- 전체보기
- Map은 순서가 아닌 key에 값을 저장하므로 우선 keySet()메서드를 사용하여 key만 Set형태로 만든다.
Set<String> keyset = hm.keySet(); - Set형태로 만들어진 keyset에 순서를 부여하기 위해 Iterator를 사용한다.
Iterator<String> it = keyset.iterator(); - 그 후 Set을 전체보기 할때와 마찬가지로 While문을 통해 출력한다.
While(it.hasNext()) {
String key = it.next();
System.out.println(key + ":" + hm.get(key));
} - 결과 : 아메리카노:1500
4. Thread
- 프로그램: 운영체제에 설치된 처리방법과 순서가 기술된 명령문의 집합체 (ex 실행파일)
- 프로세스: 실행중인 프로그램 (프로그램이 프로세스에 등록됨)
- Thread: 프로세스 내에서 실제로 작업을 수행하는 주체
보통 한 프로세스 내에서 한 가지의 일을 수행하지만, 쓰레드를 이용하면 두가지 이상의 일을 동시에 작동시킬 수 있다.
- main(): 주 thread. 어떤 클래스를 만들고 메서드를 만들어도 실행되는 메서드는 main뿐이다.
thread가 main에만 있기 때문
- 따라서 Thread를 추가하고 싶다면 Thead를 상속받아야 한다. 그리고 Thread의 코드는 오버라이딩 된 run()에 구현한다.
- 추가한 쓰레드는 start()로 시작 (run에 적을 코드는 start()로 실행)
public class Thread1 {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
class MyThread extends Thread {
@Override
public void run() {
for(int i=0; i<10; i++) {
System.out.println(i);
try { // sleep애 오류가 날 수 있으므로 try / catch를 둘러준다
sleep(1000); // sleep는 ms단위로 쓰레드를 중지시켰다가 실행한다.
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- 쓰레드의 우선순위를 정하는 방법 2가지
- join(): 지금 실행중인 쓰레드 외에 전부 대기시킴
mt5.start();
try {mt5.join();} // join(): 나 말고 대기
catch (Exception e) {}
mt5ex.start(); // 얘 대기
mt5ex2.start(); // 얘 대기
- setPriority(): 우선순위를 정하여 실행한다.
- 같은 객체를 공유하는 쓰레드들은 setPriorty를 통해 우선순위를 정해준다.
- 1~10의 숫자를 적어 우선순위를 표시할 수 있으며 숫자가 높을수록 우선적으로 수행하게 되며 숫자를 대신하여 MAX_PRIORITy, MIN_PRIORITY, NORM_PRIORITY를 사용하기도 한다. 각각 10, 5, 1의 숫자와 같은 의미이다
public class Thread6 {
public static void main(String[] args) {
MyThread mt = new MyThread("first");
MyThread mt2 = new MyThread("second");
mt.setPriority(Thread.MAX_PRIORITY); // 최고 우선순위 쓰레드
mt2.setPriority(Thread.MIN_PRIORITY); // 최저 우선순위 쓰레드
mt.start();
mt2.start();
5. Runnable
- Thread를 생성하는 또다른 방법
- Java는 다중상속이 불가능하다. 따라서 해당 클래스가 다른 클래스를 상속받고 있으면 Thread 상속이 불가능해진다.
- 이때는 Interface형태의 Runnable을 상속받아 Thread를 대신한다.
class ex1{}
class MyRunnable1 extends ex1 implements Runnable {
@Override
public void run() {
for(int i=0; i<10; i++) {
System.out.print(i+" ");
try {Thread.sleep(100);} catch (Exception e) {}
} // Runnable은 인터페이스기 때문에 sleep메서드가 없음
}
}
댓글