스포츠마케터의 초보 개발자 도전기
JAVA study 16 본문
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 |