Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

스포츠마케터의 초보 개발자 도전기

JAVA study 16 본문

develop/JAVA

JAVA study 16

teammate brothers 2024. 3. 19. 14:49

1. collection framework

컬렉션은 다수의 요소를 하나의 그룹으로 묶어서 효율적으로 관리할 수 있는 기능을 제공하는 클래스(인터페이스)

 

<컬렉션의 특징>

1) 가변적인 크기를 갖는다

2) 테이터의 추가, 검색, 정렬 등 편리한 기능들을 다수 보유하고 있다

 

<컬렉션 프레임워크의 종류>

1) Set

2) Map

3) List

 

1) Set : 값의 중복을 허용하지 않음

package ex1_set;

import java.util.HashSet;
import java.util.Set;

public class Ex1_Set {

	public static void main(String[] args) {

		// 컬렉션 (collection framework) 프레임 워크
		// 컬렉션은 다수의 요소를 하나의 그룹으로 묶어서 효율적으로 관리할 수 있는 기능을 제공하는 클래스(인터페이스)
		// 컬렉션의 특징
		// 1. 가변적인 크기를 갖는다
		// 2. 데이터의 추가, 검색, 정렬 등 편리한 기능들을 다수 보유하고 있다

		// 컬렉션 프레임워크의 종류
		// 1. Set
		// 2. Map
		// 3. List

		// Set : 값의 중복을 허용하지 않는다
		// HashSet<Integer> hs = new HashSet<Integer>(); 으로 사용하면 속도적으로 차이가 있음
		Set<Integer> hs = new HashSet<Integer>(); // 부모를 통해 자식을 생성하는 구조. 실무적으로는 속도때문에 이 방식을 더 많이 씀
		hs.add(100);
		hs.add(50);
		hs.add(150);
		hs.add(100); // 값의 중복을 허용하지 않음

		// 50이 포함되어 있는 메모리 할당 공간을 제거
		hs.remove(50);
		hs.remove(50); // 위에 이미 삭제된 값을 다시 지워도 문제는 발생하지 않음

		hs.add(120);

		System.out.println(hs.size()); // 배열의 length처럼 size로 그 크기를 볼 수 있음
		System.out.println(hs); // 값의 크기나 범위에 따라 순서대로 나오거나 하진 않음 (주소값에 따라 순서 다름)

		// set자체에는 인덱스가 없기때문에 특정 값만을 출력하려면 set자체를 배열로 바꿔서 출력해야할 수 있다
		// set -> 배열
		// 배열의 크기를 0으로 지정하면, 자동으로 배열의 크기가 설정 됨
		Integer[] arr = hs.toArray(new Integer[0]);

		for (int n : arr) {
			System.out.println(n + " ");
		}

	}// main

}

--

package ex1_set;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class Ex2_Set {

	public static void main(String[] args) {

		Set<String> hs = new HashSet<String>();
		hs.add("홍길동");
		hs.add("박길동");
		hs.add("김순자");
		hs.add("홍길동"); // 중복값은 안나옴

		System.out.println(hs.size());
		System.out.println(hs);

		String[] arr = hs.toArray(new String[0]);
		System.out.println(arr[2]);

		System.out.println("--------------------------");

		// TreeSet : 중복값 제거는 물론 오름차순 정리(숫자, 문자, 문자열)도 자동으로 됨
		Set<Integer> ts1 = new TreeSet<Integer>();
		ts1.add(45);
		ts1.add(100);
		ts1.add(1);
		ts1.add(15);
		ts1.add(15); // 중복값은 안나옴

		System.out.println(ts1);

		System.out.println("--------------------------");

		Set<String> ts2 = new TreeSet<String>();
		ts2.add("바나나");
		ts2.add("사과");
		ts2.add("옥수수");
		ts2.add("수박");

		System.out.println(ts2);

	}// main

}

--

package ex1_set;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

public class Ex3_Set {
	public static void main(String[] args) {

		// HashSet을 이용하여 Lotto번호 생성하기
		Random rnd = new Random();

		Set<Integer> lotto = new HashSet<Integer>();

		while (true) {
			int n = rnd.nextInt(45) + 1;
			lotto.add(n);

			if (lotto.size() == 6) {
				System.out.println(lotto);
				break;
			}

		} // while

		System.out.println("------------------");

		Set<Integer> ab = new TreeSet<Integer>();

		while (true) {
			int a = rnd.nextInt(45) + 1;
			ab.add(a);

			if (ab.size() == 6) {
				System.out.println(ab);
				break;
			}
		}

	}// main
}

 

2) Map

package ex2_map;

import java.util.HashMap;
import java.util.Map;

public class Ex1_Map {
	public static void main(String[] args) {

		// Map : 키(key)와 값(value)을 묶어서 하나의 데이터로 저장
		// 키를 통해 값을 얻어내는 구조이므로, 많은 양의 데이터를 검색하는데 매우 뛰어난 성능
		// Map은 키의 중복을 허용하지 않는다
		Map<Integer, Character> map = new HashMap<Integer, Character>();
		map.put(0, 'C'); // JAVA에서 Map만 put으로 값을 입력, 더한다
		map.put(1, 'A');
		map.put(2, 'B');
		map.put(0, 'D'); // 같은 키값에 중복된 값이 들어가 있으면 어던 값을 가져올지 몰라 키값의 중복을 허용하지 않는다. 출력값은 중복되도 상관 없다.

		// 지우고 싶은 키값에 해당하는 영역을 삭제
		map.remove(2);

		System.out.println(map.size());
		System.out.println(map);

		// 인덱스가 없어도 원하는 값을 가져오는데(get) 문제가 없다.
		char res = map.get(0);
		System.out.println(res);

		// 가지고 있는 키값 확인
		if (map.containsKey(0)) { // map.containsKey(0) == true
			System.out.println("0이라는 이름의 key가 있음");
		}

		// 가지고 있는 출력값 확인
		if (map.containsValue('A')) { // map.containsValue('A') ==true
			System.out.println("A가 map안에 있음");
		}

	}// main
}

--

package ex2_map;

import java.util.HashMap;
import java.util.Map;

public class Ex2_Map {

	public static void main(String[] args) {

		Map<String, String> map = new HashMap<String, String>();
		map.put("k1", "안녕하세요");
		map.put("k2", "반가워요");
		map.put("k3", "또 만나요");

		String result = map.get("k1");

	}// main
}

--

package ex2_map;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Ex3_Map {
	public static void main(String[] args) {

		// id : kim
		// pw : 2222
		// 비밀번호 불일치

		// id : lim
		// pw : 1234
		// 존재하지 않는 id

		// id : lee
		// pw : 2222
		// lee 님 환영합니다.

		Scanner sc = new Scanner(System.in);

		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("kim", 1111);
		map.put("lee", 2222);
		map.put("park", 3333);

		System.out.print("id 입력 : ");
		String id = sc.next();

		System.out.print("pw 입력 : ");
		int pw = sc.nextInt();

		if (!map.containsKey(id)) {
			System.out.println("존재하지 않는 id");

		} else {
			// 아이디가 존재하는 경우 비밀번호 체크
			if (map.get(id) == pw) {
				System.out.printf("%s님 환영합니다.", id);

			} else {
				System.out.println("비밀번호 불일치");
			}

		}

	}// main
}

 

3) List

package ex3_list;

import java.util.ArrayList;
import java.util.List;

public class Ex1_List {
	public static void main(String[] args) {

		// List구조
		// 인덱스로 특정 데이터에 접근할 수 있다
		// 인덱스의 제한이 없어 원하는 만큼 값을 넣고 줄일 수 있다
		// 속도는 느리고 중복값 제거 기능은 없으나 인덱스 접근 기능으로 많이 쓰임
		List<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(15);
		list.add(10);
		list.add(11);

		// 1번 index에 100을 추가
		list.add(1, 100);

		// 0번 index의 값을 20으로 수정
		list.set(0, 20);

		// 2번 index의 값을 제거
		list.remove(2);

		System.out.println(list.size());
		System.out.println(list);

		System.out.println(list.get(2)); // 0번부터 시작되는 인덱스중 지정값만 볼 수 있음

		// ArrayList는 for문으로 출력도 가능
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i));
		}

	}// main
}

--

package ex3_list;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Ex2_List {

	public static void main(String[] args) {

		// arr에 1~30 사이의 난수 5개를 추가
		// arr에 담겨진 값 중 가장 큰 값을 출력
		List<Integer> arr = new ArrayList<Integer>();
		Random rnd = new Random();

		for (int i = 0; i < 5; i++) {

			arr.add(rnd.nextInt(30) + 1);
		}
		System.out.println(arr);

		// 비교
		int max = arr.get(0);

		for (int num : arr) {
			if (num > max) {
				max = num;
			} // if

		} // for
		System.out.println("가장큰값 : " + max);

	}// main

}

--

package ex3_list;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Ex3_List {

	public static void main(String[] args) {

		// 아이디 생성 : aaa
		// [aaa]
		// 아이디 생성 : bbb
		// [aaa, bbb]
		// 아이디 생성 : aaa
		// 중복된 아이디
		// 아이디 생성 : exit
		// 종료

		Scanner sc = new Scanner(System.in);
		List<String> arr = new ArrayList<String>();

		outer: while (true) {
			System.out.println("아이디 생성 : ");
			String id = sc.next();
			for (int i = 0; i < arr.size(); i++) {
				if (id.equalsIgnoreCase(arr.get(i))) {
					System.out.println("중복된 아이디");
					continue outer;
				} // if

				if (id.equalsIgnoreCase("exit")) {
					System.out.println("종료");
					break;
				} // if

			} // for
			arr.add(id);
			System.out.println(arr);

		} // while

	}// main

}

 

과제 )

package ex4_work;

import java.util.Scanner;

public class Ex1_Work {

	public static void main(String[] args) throws InterruptedException {

		// String[] str = {"apple", "grape", "orange", " pineapple", ... }
		// 3초 간격으로 배열의 값중 하나를 랜덤으로 골라내서 ArrayList에 추가
		// ArrayList의 값을 화면에 보여주고
		// 사용자가 입력한 값이 ArrayList에 포함되었다면 제거

		WorkThread q = new WorkThread();
		q.start();
		Thread.sleep(100);
		q.startGame();

	}// main

}

--

package ex4_work;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class WorkThread extends Thread {

	private String[] str = { "apple", "grape", "orange", "pineapple" };
	private String answer;
	private boolean isCheck = true;
	private Scanner sc = new Scanner(System.in);
	private Random rnd = new Random();
	int num = 0;

	List<String> list = new ArrayList<String>();

	public void startGame() {
		System.out.println(list); // 첫번째 단어 출력 (출력에는 시간이 필요하니 start와 startGame사이에 쉴 간격 필요)

		while (isCheck) {
			System.out.print(">> ");
			answer = sc.next();

			for (int i = 0; i < list.size(); i++) {
				if (answer.equals(list.get(i))) {
					list.remove(i);
					System.out.println(list);
					break;
				}

			} // for
			if (list.size() == 0) {
				isCheck = false;
			} // if

		} // while
		System.out.println("클리어");
	}// startGame

	@Override
	public void run() {
		while (isCheck) {

			int num = rnd.nextInt(4);
			list.add(str[num]);

			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} // while
	}
}

----------

tCode

package ex4_work;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class WordGame extends Thread {

	private List<String> arr; // main (1)에서 부모 객체까지 다 받으므로 ArrayList가 아닌 List로 보내야함
	private String[] data = { "apple", "grape", "orange", "banana" };
	private boolean playing = true;
	private Random rnd;

	// playing의 값을 바꾸는 세터
	public void setPlaying(boolean playing) {
		this.playing = playing;
	}

	// 생성자에서 data, Random 등을 쓰면 더 좋음
	public WordGame(List<String> arr) { // main (1)에서 부모 객체까지 다 받으므로 ArrayList가 아닌 List로 보내야함
		this.arr = arr;
		rnd = new Random();
	}

	@Override
	public void run() {
		while (playing) {

			try {
				int random = rnd.nextInt(data.length);
				arr.add(data[random]);

				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		} // while

	}

}

--

package ex4_work;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class WordGameMain {
	public static void main(String[] args) {

		List<String> arr = new ArrayList<String>(); // WordGame에 arr에 추가된 값이 이곳 arr에도 반영

		WordGame wg = new WordGame(arr); // (1)

		wg.start();
		// Thread.sleep을 사용해도 되나 아래처럼 스레드에게 먼저 일할 시간을 부여해도 됨
		Scanner sc = new Scanner(System.in);

		while (true) {
			// 게임 종료
			if (arr.size() == 0) {
				System.out.println("클리어");
				wg.setPlaying(false);
				break;
			}
			System.out.println(arr);
			System.out.print(">>");
			String in = sc.next();

			// 사용자가 입력한 단어와 일치하는 값을 arr에서 찾는다
			for (int i = 0; i < arr.size(); i++) {
				if (in.equals(arr.get(i))) {
					arr.remove(i);
					break;
				}
			} // for

		} // while

	}// main
}

 

예제)

package ex5_list;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Ex1_List {
	public static void main(String[] args) {

		// 다섯개의 문장을 입력받아 ArrayList에 담는다
		// 담겨진 값들 중 가장 긴 문자열을 출력

		Scanner sc = new Scanner(System.in);

		List<String> arr = new ArrayList<String>();

		for (int i = 0; i < 5; i++) {

			System.out.print("입력 : ");
			arr.add(sc.next());

		}
		String sLonger = "";
		for (String str : arr) {
			if (str.length() > sLonger.length()) {
				sLonger = str;
			}
		} // for

		System.out.println("가장 긴 문장 : " + sLonger);

	}// main
}

 

예제)

package ex5_list;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Ex2_list {
	public static void main(String[] args) {

		// ArrayList에 정수 3개를 입력받고, 두배로 곱해진 결과를 출력

		Scanner sc = new Scanner(System.in);
		List<Integer> num = new ArrayList<Integer>();

		for (int i = 0; i < 3; i++) {
			System.out.print("정수입력 : ");
			num.add(sc.nextInt() * 2);
		} // for

		System.out.println(num);

	}// main
}

 

'develop > JAVA' 카테고리의 다른 글

JAVA study 18  (0) 2024.03.21
JAVA study 17  (0) 2024.03.20
JAVA study 15  (0) 2024.03.18
JAVA study 14  (0) 2024.03.15
JAVA study 13  (0) 2024.03.14