본문 바로가기
Programming Language/Java

[국비] Java 내용정리 Day17

by tpleehan 2021. 11. 29.
package collection.list;

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

public class ListDelete {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		List<String> kakao = new ArrayList<>();
		Collections.addAll(kakao, "무지", "네오", "어치피", "라이언", "제이지");
		System.out.println("현재 저장된 카카오 친구들: " + kakao);
		System.out.print("삭제할 친구를 입력하세요: ");
		String name = sc.next();
		
		if (kakao.contains(name)) {
			kakao.remove(name);
			System.out.println("삭제 후 정보: " + kakao);
		} else {
			System.out.println(name + "은(는) 없는 이름입니다.");
		}
		
		sc.close();
		
	}

}

List Quiz

1. User 클래스를 은닉된 변수 name, age로 선언해서
   구현 User클래스의 생성자는 모든 필드값을 받는 생성자 1개.
2. User 객체를 모음저장할 수 있는 ArrayList를 선언. (main method)
3. User 객체를 3개 생성해서 리스트에 추가 (main method)
4. 리스트에 저장된 모든 이름, 나이를 for문으로 출력 (향상 for문)
5. 리스트 내부 객체 중 이름이 "홍길동" 이 있다면 그 객체를 삭제(일반 for문)
package collection.list;

public class User {

	private String name;
	private int age;
	
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "이름: " + this.name + ", 나이: " + this.age + "세";
	}
	
}​
package collection.list;

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

public class ListQuiz02 {

	public static void main(String[] args) {

		List<User> userList = new ArrayList<>();
		
		userList.add(new User("홍길동", 20));
		userList.add(new User("김철수", 23));
		userList.add(new User("박영희", 25));

		for (User user : userList) {
//			System.out.printf("이름: %s, 나이: %d세\n", user.getName(), user.getAge());
			System.out.println(user);
		}
				
		for (int i = 0; i < userList.size(); i++) {
			if (userList.get(i).getName().equals("홍길동")) {
				userList.remove(i);
			}
		}
		System.out.println(userList);

	}

}​
package collection.list;

import java.util.LinkedList;

public class LinkedListExample {

	public static void main(String[] args) {
		
		LinkedList<String> list = new LinkedList<>();
		
		// 추가
		list.add("홍길동");
		list.add("김철수");
		list.add("박영희");
		
		list.addFirst("맨 앞");
		list.addLast("맨 뒤");
		System.out.println(list);

		System.out.println(list.get(3));
		System.out.println(list.getFirst());
		System.out.println(list.getLast());
		
		list.remove(0);
		System.out.println(list);
		
		// LIFO -> last in first out -> stack
		// push, pop, peek
		list.push("김뽀삐"); // 앞에서부터 추가
		System.out.println(list);
		
		System.out.println(list.pop()); // 삭제하면서 읽기
		System.out.println(list);
		
		System.out.println(list.peek()); // 삭제하지 않으면서 읽기
		System.out.println(list);
		
		// FIFO -> first in first out -> Queue
		// offer, poll, peek
		list.offer("a");
		list.offer("b");
		list.offer("c");
		System.out.println(list);
		
		System.out.println(list.poll());
		System.out.println(list);
		
		System.out.println(list.peek()); // 삭제하지 않고 읽기
		System.out.println(list);

	}

}

Generic

  • 제네릭을 사용하면, 객체로 생성할 때 사용할 타입을 지정할 수 있고 다양한 값을 저장할 수 있도록 생성할 수 있다.
  • 제네릭에는 기본 데이터 타입을 지정할 수 없다.
    • Primitive Type이 아닌 Wrapper Class로 지정해야 한다.

Bad Example

package generic.bad;

public class Person {

}
package generic.bad;

public class Box {

	private Object obj;
	
	public Object getObj() {
		return obj;
	}
	
	public void setObj(Object obj) {
		this.obj = obj;
	}
	
}
package generic.bad;

public class MainClass {

	public static void main(String[] args) {
		
		Box box = new Box();
		box.setObj("홍길동");
		String name = (String) box.getObj();
		
		Box p = new Box();
		p.setObj(new Person());
		Person name2 = (Person) p.getObj();
		
		System.out.println(name);
		System.out.println(name2);
		
	}

}
  • Object타입으로 선언하면 무엇이든 저장할 수 있지만 반대로 저장했던 값을 꺼내올 때는 타입별로 형변환을 해야 하는 문제가 발생한다.
  • 잘못된 형 변환 했을 시에는 예외가 발생할 수도 있다.

Basic Example01

package generic.basic;

public class Person {

}
package generic.basic;

public class Box<T> { // 제네릭 클래스로 선언

	private T t;

	public void setT(T t) {
		this.t = t;
	}
	
	public T getT() {
		return t;
	}
	
}
package generic.basic;

public class MainClass {

	public static void main(String[] args) {
		
		Box<String> box = new Box<>();
		box.setT("홍길동");
		String name = box.getT();
		System.out.println(name);

//		Box<int> intBox = new Box<int>(); (x)
		Box<Integer> intBox = new Box<>();
		intBox.setT(2);
		int num = intBox.getT();
		System.out.println(num);
		
		Box<Person> pBox = new Box<>();
		pBox.setT(new Person());
		pBox.getT();
		
	}

}

Basic Example02

package generic.basic02;

// 멀티 제네릭 (key, value)
public class Basic<K, V> {

	private K key;
	private V value;
	
	public void put(K key, V value) { // setter 대용
		this.key = key;
		this.value = value;
		
	}
	
	public V get(K key) {
		return value;
		
	}
	
	@Override
	public String toString() {
		return "{" + key + "=" + value + "}";
		
	}

}
package generic.basic02;

public class MainClass {

	public static void main(String[] args) {
		Basic<Integer, String> b = new Basic<>();
		b.put(1, "홍길동");
		String name = b.get(1);
		System.out.println(name);
	}

}

 학생 성정 관리 프로그램

package collection.list;

import java.util.Scanner;

public class Student {

	private String stuId;
	private String name;
	private int kor;
	private int eng;
	private int math;
	private int total;
	private double average;
	private String grade;

	private static Scanner sc = new Scanner(System.in);
	
	public Student() {
		inpuetStuInfo();
		calcTotAvgGrade();
	}

	// 학생 정보를 받아서 객체화 시킬 메서드
	public void inpuetStuInfo() {
		System.out.println("# 성적 정보 입력을 시작합니다.");
		System.out.print("- 학번: ");
		this.stuId = sc.next();
		System.out.print("- 이름: ");
		this.name = sc.next();

		while (true) {
			try {
				System.out.print("- 국어점수: ");
				this.kor = sc.nextInt();
				System.out.print("- 영어점수: ");
				this.eng = sc.nextInt();
				System.out.print("- 수학점수: ");
				this.math = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("점수는 숫자로 입력해주세요.");
				sc.nextLine();
			}

		}

	}

	// 총점, 평균, 학점을 계산하는 메서드
	public void calcTotAvgGrade() {
		this.total = this.kor + this.eng + this.math;
		this.average = this.total / 3.0;
		
		if (this.average >= 90) {
			this.grade = "A";
		
		} else if (this.average >= 80) {
			this.grade = "B";
		
		} else if (this.average >= 70) {
			this.grade = "C";
		
		} else if (this.average >= 60) {
			this.grade = "D";
		
		} else {
			this.grade = "F";
		}

	}

	//학생의 성적 정보를 출력하는 메서드
	public void outputStuInfo() {
		System.out.printf("%4s %6s %6d점 %5d점 %7d점 %7d점 %7.2f점 %6s\n"
		, this.stuId, this.name, this.kor, this.eng, 
		this.math, this.total, this.average, this.grade);
	}

	public String getStuId() {
		return stuId;
	}

	public void setStuId(String stuId) {
		this.stuId = stuId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public double getAverage() {
		return average;
	}

	public void setAverage(double average) {
		this.average = average;
	}

	public String getGrade() {
		return grade;
	}

	public void setGrade(String grade) {
		this.grade = grade;
	}
	
	public static void close() {
		sc.close();
	}
	
}
package collection.list;

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

public class MainClass {

	public static void main(String[] args) {
		
		List<Student> sList = new ArrayList<>();
		
		Point p = new Point();
		
		while (true) {
			int menu = p.menuInfo();
			
			switch (menu) {
			case 1:
				p.inputPoints(sList);
				break;
			case 2:
				if (sList.isEmpty()) {
					System.out.println("등록된 학생이 없습니다. 등록을 먼저 하세요.");
				} else {
					p.showAllPoints(sList);
				}
			case 3:
				p.searchPoint(sList);
				break;
			case 4:
				p.modifyPoint(sList);
				break;
			case 5:
				p.deletePoint(sList);
				break;
			case 6:
				System.out.println("프로그램을 종료합니다.");
				Student.close();
				p.close();
				System.exit(0); // 프로그램 강제 종료 메서드

			default:
				System.out.println("메뉴를 잘 못 입력했습니다.");
				break;
			}
			
		}
		
	}

}
package collection.list;

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

// 프로그램의 기능들을 메서드화 시킨 클래스
public class Point {

	private Scanner sc = new Scanner(System.in);
	
	// 점수 입력창 틀 메서드.
	public void showPointUI() {
		System.out.println("================================================================");
		System.out.printf("%4s%6s%7s%8s%8s%8s%8s%8s\n"
			, "학번", "이름", "국어", "영어", "수학", "총점", "평균", "학점");
			System.out.println("================================================================");
	}
	
	//프로그램 메뉴 정보를 보여줄 메서드
	public int menuInfo() {
		System.out.println("*** 성적 관리 프로그램 ***");
		System.out.println("# 1. 성적 정보 입력");
		System.out.println("# 2. 전체 성적 조회");
		System.out.println("# 3. 개별 성적 조회");
		System.out.println("# 4. 성적 정보 수정");
		System.out.println("# 5. 성적 정보 삭제");
		System.out.println("# 6. 프로그램 종료");
		System.out.println("------------------------");
		System.out.print("# 메뉴를 입력하세요: ");
		int menu = sc.nextInt();
		return menu;
	}

	// 1. 학생의 성적 정보를 입력할 메서드
	public void inputPoints(List<Student> students) {		
		Student stu = new Student();
		students.add(stu);
//		stu.inpuetStuInfo();
//		stu.calcTotAvgGrade();
		
		System.out.println(stu.getName() + "님의 성적 정보가 정상적으로 입력되었습니다.");
		
	}
	
	// 2. 전체 학생들의 성적 정보를 출력할 메서드
	public void showAllPoints(List<Student> students) { // 학생 객체들이 들어있는 리스트
		
		double totalAvg = 0.0;
		
		showPointUI();
		
		for (Student stu : students) {
			stu.outputStuInfo();
			totalAvg += stu.getAverage();
		}
		System.out.println("--------------------------------------------");
		System.out.printf("\t\t\t\t\t우리반 전체 평균: %.2f점\n", totalAvg / students.size());
		
	}
	
	// 3. 개별 성적 조회 로직을 처리할 메서드
	public void searchPoint(List<Student> students) {
		System.out.println("성적을 조회할 학생의 학번을 입력하세요.");
		System.out.print("> ");
		String stuNum = sc.next();
		
		boolean flag = false;
		for (Student stu : students) {
			if (stuNum.equals(stu.getStuId())) {
				System.out.printf("%s님의 성적 정보를 출력합니다.\n", stu.getName());
				showPointUI();
				stu.outputStuInfo();
				flag = true;
				break;
			} 
			
		}
		
		if (!flag) {
			System.out.println("입력한 학번과 일치하는 학생 정보가 존재하지 않습니다.");
		}
	}
	
	// 4. 학생의 개인 성적 정보를 수정하는 메서드
	public void modifyPoint(List<Student> students) {
		System.out.println("성적을 수정할 학생의 학번을 입력하세요.");
		System.out.print("> ");
		String stuNum = sc.next();
		
		boolean flag = false;
		for (Student stu : students) {
			if (stuNum.equals(stu.getStuId())) {
				System.out.println(stu.getName() + "님의 성적 정보를 수정합니다.");
				
				while (true) {
					
					try {
						System.out.print("수정할 국어점수: ");
						stu.setKor(sc.nextInt());
						
						System.out.print("수정할 영어점수: ");
						stu.setEng(sc.nextInt());
						
						System.out.print("수정할 수학점수: ");
						stu.setMath(sc.nextInt());
						break; // while true break;
						
					} catch (Exception e) {
						System.out.println("정수로만 입력하세요.");
						sc.nextLine();
					}
					
				}
				stu.calcTotAvgGrade();
				System.out.println("성적 수정이 정상 처리 되었습니다.");
				flag = true;
				break; // 학생 검색하는 for문 break
				
			}
		}
		
		if (!flag) {
			System.out.println("입력한 학번과 일치하는 학생 정보가 존재하지 않습니다.");
		}
	}
	
	// 5. 학생 정보를 삭제하는 메서드
	public void deletePoint(List<Student> students) {	
		System.out.println("정보를 삭제할 학생의 학번을 입력하세요.");
		System.out.print("> ");
		String stuNum = sc.next();
		
		boolean flag = false;
		for (Student stu : students) {
			if (stuNum.equals(stu.getStuId())) {
				System.out.println(stu.getName() + "님의 정보를 삭제하시겠습니까? [Y / N]");
				System.out.print("> ");
				String answer = sc.next();
				
				if (answer.toLowerCase().equals("y") || answer.equals("ㅛ")) {
					students.remove(stu);
					System.out.println("삭제가 정상 처리 되었습니다.");
				} else if (answer.toLowerCase().equals("n") || answer.equals("ㅜ")) {
					return;
					
				} else {
					System.out.println("제대로 입력해주세요.");
					sc.nextLine();
				}
				flag = true;
				break;
			}
		}
		
		if (!flag) {
			System.out.println("입력한 학번과 일치하는 학생 정보가 존재하지 않습니다.");
		}
	}
	
	
	public void close() {
		sc.close();
	}

}

Set 컬렉션

  • Set 컬렉션은 List와 달리 저장 순서가 유지되지 않고 중복저장을 허용하지 않는다.
  • Set 컬렉션은 수학의 집합과 유사하며, 합집합을 하면 중복 숫자가 배제되는 것과 비슷하다.
  • 큰 주머니에 비유될 수 있고, 순서가 유지되지 않기 때문에 처음 들어간 물건을 꺼내게 될 때 바로 처음에 나오지 않을 수 있다.
  • Set 인터페이스의 대표적인 구현 클래스는 HashSet, TreeSet, HashTable이 있다.
  • Set은 인덱스가 없다.
  • Hash
    • 어떤 값을 넣었을 때 전혀 예측하지 못할 값이 생성되어야 하는 알고리즘
    • 예측할 수 없는 값을 이용하기 때문에 정렬이 불가능
    • 생성된 값으로 원래 값을 찾는 것도 불가능에 가깝다.
    • 다시 원래 값으로 돌아갈 수 없는 단방향성 알고리즘
    • 속도가 빠르고 보안성이 뛰어난 알고리즘

package collection.set;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetExample {

	public static void main(String[] args) {

		Set<String> set = new HashSet<>();
		
		// 객체를 저장: add(객체)
		set.add("JAVA");
		set.add("JSP");
		set.add("Spring");
		set.add("Oracle");
		Collections.addAll(set, "Mysql", "JAVA");
		System.out.println(set); // set은 중복 저장을 허용하지 않는다.
		
		// set의 크기 확인: size()
		System.out.println("set의 크기: " + set.size());

		Iterator<String> iter = set.iterator();
		String str = iter.next();
		System.out.println(str);
		String str2 = iter.next();
		System.out.println(str2);
		
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
		
		System.out.println("---------------------------------");
		
		for (String s : set) {
			System.out.println(s);
		}
		
		System.out.println("---------------------------------");
		
		for (String s : set) {
			if (s.equals("Spring"));
			System.out.println(s);
		}
		
		// set에서 객체를 삭제: remove()
		set.remove("JSP");
		System.out.println(set);
		
		set.clear();
		System.out.println(set);
		
	}

}
package collection.set;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

public class LottoCreate {

	public static void main(String[] args) {
		
		Set<Integer> lotto = new HashSet<>();
		Random r = new Random();
		
		while (lotto.size() < 6) {
			int num = r.nextInt(45) + 1;
			lotto.add(num);
		}
		System.out.println(lotto);
		
		List<Integer> list = new ArrayList<>(lotto);
		Collections.sort(list);
		System.out.println(list);
	}
	
}

Map 컬렉션

  • Map 컬렉션은 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다.
  • 키와 값은 모두 객체이다.
  • 키는 중복 저장할 수 없지만 값은 중복 저장이 가능하다.
  • 만약 동일 키로 다른 값을 저장하면 해당 키의 값이 수정된다.
  • Map 인터페이스의 대표적인 구현 클래스는 HashMap, TreeMap, HashTable, Properties가 있다.

package collection.map;

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

public class HashMapExample {

	public static void main(String[] args) {

		// Map은 Key, Value 쌍을 이루기 때문에 멀티 제네릭을 작성
		Map<String, String> map = new HashMap<>();
		
		// Map에 데이터를 추가하는 메서드: put(key, value)
		map.put("댕댕이", "김철수");
		map.put("냥냥이", "홍길동");
		map.put("삐약이", "박영희");
		System.out.println(map);
		
		// Map은 Key의 중복 저장을 허용하지 않는다.
		// 만약 중복 Key를 사용하여 put을 호출하면 Value만 수정된다.
		map.put("댕댕이", "김뽀삐");
		map.put("어흥이", "홍길동");
		System.out.println(map);
		
		// Map 내부에 key의 존재 유무를 확인하는 메서드: ContainsKey(key)
		System.out.println(map.containsKey("댕댕이"));
		
		// Map 내부의 값을 참조하는 법: get(key)
		String name = "어흥이";
		if (map.containsKey(name)) {
			System.out.printf("%s의 주인 이름은 %s입니다.\n", name, map.get(name));
		} else {
			System.out.println("찾고자 하는 동물이 없습니다.");
		}
		
		// Map의 크기를 확인하는 메서드: size()
		System.out.println("map의 크기: " + map.size());
		
		// Map에서 key만 추출하는 메서드: keySet()
		// 모든 key를 Set에 담아 반환한다.
		Set<String> keys = map.keySet();
		for (String k : keys) {
			System.out.println(k + " : " + map.get(k));
		}
		
		// Map의 객체를 삭제: remove(key)
		// key를 주면 value도 함께 제거된다.
		map.remove("냥냥이");
		System.out.println(map);
		map.clear();
		
	}

}

Map Quiz

1. engKor이라는 이름으로 Map을 생성하고, Map에 key는 영단어, value는 한글 뜻을 삽입한다.
2. 사용자에게 영단어를 입력받아서 이미 Map에 존재하는 단어라면 다시 입력 받는다.
    (이미 존재한다는 메세지 출력) 영단어 입력창에 '그만' 이라고 입력하면 입력을 종료
3. 영단어 입력 후에는 한글 뜻을 입력받아서 Map에 삽입한다.
4. 입력이 종료되면 반복문을 이용해서 예시와 같이 출력한다.
    예시)
    영단어 : 뜻
    영단어 : 뜻
    영단어 : 뜻
     .... 형태로 입력받은 영단어와 뜻을 모두 출력
package collection.map;

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

public class MapQuiz {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		Map<String, String> engKor = new HashMap<>();

		System.out.println("*** 영어 단어장 만들기 ***");
		
		while (true) {
			System.out.print("입력할 영단어: ");
			String eng = sc.next();
			if (eng.equals("그만")) {
				System.out.println("입력을 종료합니다.");
				break;
			} else if (engKor.containsKey(eng)) {
				System.out.println(eng + "(은)는 이미 등록된 단어 입니다.");
				continue;
			}
			
			System.out.print("입력할 한글뜻: ");
			String kor = sc.next();
			
			engKor.put(eng, kor);
			System.out.println("영단어 등록 완료\n");
		}
		System.out.println("\n***오늘 공부한 단어 ***");
		Set<String> engs = engKor.keySet();
		for (String s : engs) {
			System.out.println(s + " : " + engKor.get(s));		
		}
		
		sc.close();	

	}

}​

 

'Programming Language > Java' 카테고리의 다른 글

[국비] Java 내용정리 Day19  (0) 2021.12.02
[국비] Java 내용정리 Day18  (0) 2021.12.01
[국비] Java 내용정리 Day16  (0) 2021.11.28
[국비] Java 내용정리 Day15  (0) 2021.11.25
[국비] Java 내용정리 Day14  (0) 2021.11.24

댓글