💻 set / map
📌 set
- 데이터에 순번이 없음
- 반복문 못씀(=순번데이터가 없으니까..)
- for문 사용 불가 / for-each문 사용 가능
- set에 들어가는 데이터는 관리가 매우 어려우므로 잘 사용하지 않음(리스트에 있는 데이터 중 중복을 제거할 때?)
- Treeset : 오름차순 정렬
public class Set01 {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("java");
set.add("python");
set.add("c++");
set.add("c++");
for(String e : set){
System.out.println(e);
}
}
📌 map
public class Map01 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "김길동");
map.put(2, "이길동");
map.put(3, "박길동");
map.put(4, "박길동");
map.put(2, "최길동");
System.out.println(map.get(2)); //키는 중복이 불가, 중복된 키는 마지막 키의 밸류로 덮어써짐
}
📌 컬렉션 예제 풀이
예제 1.
- 사원 관리 프로그램을 만들어보자.
사원을 클래스로 만들어야 하고, 사원은 사번(정수), 이름, 부서명, 연락처, 월급의 데이터가 있다. EmpService라는 클래스를 만들고, 아래의 문제를 해결하기 위한 메소드는 스스로 판단하여 만들어보자.
- 1) 사원 프로그램에 로그인하는 메소드를 구현하여라. 메소드를 호출하면 아래와 같은 결과가 나와야한다.

- 2) 키보드로 입력받은 받은 부서의 월급 정보를 출력하는 메소드를 구현하여라.(부서명을 잘못 입력 받는 경우는 없다고 가정한다)

- 3) 키보드로 입력받은 받은 부서의 월급 정보를 출력하는 메소드를 구현하여라.(부서명을 잘못 입력 받는 경우는 없다고 가정한다)

- 4) 각 부서의 월급 소계와 사원 전체의 월급 총계를 출력하는 메소드를 구현하라.

- 풀이
public class Emp {
private int empNo;
private String name;
private String dept;
private String tel;//010-1111-1111
private int salary;
//생성자
public Emp(int empNo, String name, String dept, String tel, int salary) {
this.empNo = empNo;
this.name = name;
this.dept = dept;
this.tel = tel;
this.salary = salary;
}
//getter
public int getEmpNo(){
return empNo;
}
public String getPw(){
return tel.substring(9);
}
public String getName(){
return name;
}
public String getDept(){
return dept;
}
public int getSalary(){
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "EMP{" +
"empNo=" + empNo +
", name='" + name + '\'' +
", dept='" + dept + '\'' +
", tel='" + tel + '\'' +
", salary=" + salary +
'}';
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class EmpService {
private ArrayList<Emp> empList;
private Scanner scan; //스캐너 변수 선언-생성은 생성자 내부에서!
public EmpService(){
scan = new Scanner(System.in);
empList = new ArrayList<>();
empList.add(new Emp(1001, "김자바", "개발부", "010-1111-1111", 1000));
empList.add(new Emp(1002, "이자바", "개발부", "010-1111-2222", 1500));
empList.add(new Emp(1003, "박자바", "영업부", "010-1111-3333", 2000));
empList.add(new Emp(1004, "황자바", "인사부", "010-1111-4444", 2500));
empList.add(new Emp(1005, "성자바", "영업부", "010-1111-5555", 3000));
empList.add(new Emp(1006, "곽자바", "인사부", "010-1111-6666", 3500));
}
//1.
//로그인하는 메소드
public void login(){
boolean isFind = false; //일치하는 정보 찾았는지 일치 여부
while (!isFind){ //일치하지 않는 경우 일치할 때까지 무한반복 - while문
System.out.println("사번 : ");
int empNo = scan.nextInt();
System.out.println("비밀번호(연락처의 마지막 4자리) : ");
String pw = scan.next();
for(Emp e : empList){
if(e.getEmpNo() == empNo && e.getPw().equals(pw)){
System.out.println("로그인 하였습니다.");
System.out.println(e.getName() + " 님 반갑습니다.");
isFind = !isFind;
}
}
if(!isFind){
System.out.println("사번 혹은 비밀번호가 일치하지 않습니다.");
}
}
}
//2. 월급정보 출력
public void getSalaryInfoPerDept(){
System.out.println("부서명 : ");
String dept = scan.next();
System.out.println("== " + dept + "월급 현황 ==");
int sum = 0;
int cnt = 0;
for(Emp e : empList){
if(e.getDept().equals(dept)){
System.out.println(e);
sum = sum + e.getSalary();
cnt++;
}
}
System.out.println(dept + "서의 월급 총액은 " + sum + "원이며 평균 급여는 " + (sum / (double)cnt) + "원 입니다.");
}
//3. 월급인상
public void salaryrise() {
System.out.println("부서명 : ");
String dept = scan.next();
System.out.println("인상급여 : ");
int salary = scan.nextInt();
System.out.println(dept + " 각 사원의 급여가 각각 " + salary + "원 씩 인상됩니다.");
System.out.println(" == 월급 인상 후" + dept + " 월급 현황 ==");
for(int i = 0; i < empList.size(); i++){
if(empList.get(i).getDept().equals(dept)){
empList.get(i).setSalary(empList.get(i).getSalary() + salary); //원래 월급+변경월급으로 계산
System.out.println(empList.get(i)); //toString 사용
}
}
//4.
public void getData(){
//개발부 사원들이 저장될 통
ArrayList<Emp> devList = new ArrayList<>();
ArrayList<Emp> humanList = new ArrayList<>();
ArrayList<Emp> saleList = new ArrayList<>();
for(Emp e : empList){
if (e.getDept().equals("개발부")){
devList.add(e);
}
else if(e.getDept().equals("인사부")){
humanList.add(e);
}
else if(e.getDept().equals("영업부")){
saleList.add(e);
}
}
System.out.println(" == 모든 사원의 월급 현황 ==");
int sum1 = getDeptInfo(humanList, "인사부");
int sum2 = getDeptInfo(saleList, "영업부");
int sum3 = getDeptInfo(devList, "개발부");
System.out.println("모든 사원의 급여 합 : " + (sum1 + sum2 + sum3));
//인사부
// int sum1 = 0;
// for (Emp e : humanList){
// System.out.println(e);
// sum1 = sum1 + e.getSalary();
// }
// System.out.println("인사부 월급 소계 : " + sum1);
//영업부
// int sum2 = 0;
// for (Emp e : saleList){
// System.out.println(e);
// sum2 = sum2 + e.getSalary();
// }
// System.out.println("영업부 월급 소계 : " + sum2);
//개발부
// int sum3 = 0;
// for (Emp e : devList){
// System.out.println(e);
// sum3 = sum3 + e.getSalary();
// }
// System.out.println("개발부 월급 소계 : " + sum3);
//
// getDeptInfo(devList, "개발부");
}
//소계
public int getDeptInfo(List<Emp> list, String dept){
int sum1 = 0;
for (Emp e : list){
System.out.println(e);
sum1 = sum1 + e.getSalary();
}
System.out.println(dept + "월급 소계 : " + sum1);
return sum1;
}
}
public class EmpTest {
public static void main(String[] args) {
EmpService service = new EmpService();
service.login();
service.getSalaryInfoPerDept();
service.salaryrise();
//service.getDeptInfo();
}
}
예제 2.
- 학교 클래스는 다수의 교실을 가지고 있으며, 각 교실에는 다수의 학생 데이터를 가진다.
학교 클래스에 3개의 교실을 생성하고, 각 교실에 3명씩 학생을 생성한다. 한 명의 담당교사가 여러 교실을 담당할 수도 있다. 아래는 각 클래스마다 필요한 매개변수 및 메소드들이다. 필요시 아래에서 제시된 메소드 외의 메소드는 추가해도 된다.
필요 클래스 : Student(학생), StudyClass(교실), School(학교)
- 학생 클래스
- 맴버 변수 : 이름, 나이, 점수
- 메소드 : 매개변수로 모든 맴버 변수를 세팅하는 생성자, getter, setter, toString
- 교실 클래스
- 맴버 변수 : 학생 다수(List를 사용할 것), 반이름, 담담교사명
- 메소드
1) 해당 반의 모든 학생의 모든 정보를 출력하는 기능
2) 해당 반의 평균 성적을 리턴하는 기능
3) 해당 반에서 최고 성적을 지닌 학생을 리턴하는 기능
- 학교 클래스
- 맴버변수 : 교실 다수(List를 사용할 것)
- 메소드
1) 매개변수로 담당교사명을 받아, 해당 담당교사가 맡고 있는 모든 반의 학생 정보를 출력
2) 각 반별로 반별 평균 점수 및 전체 학급에 대한 평균 점수를 출력
3) 모든 반에서 최고 성적을 가진 학생의 이름과 점수를 출력
4) 매개변수로 반 이름을 받아, 해당 반의 평균을 리턴하는 기능
- 학생 클래스
public class Student {
private String name;
private int age;
private int score;
public Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
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;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
public class StudyClass {
//반이름, 담당교사명, 학생들
private String className;
private String teacherName;
private List<Student> stuList;
//private Student stu; //교실에 학생 한 명
public StudyClass(String className, String teacherName, List<Student> stuList) {
this.className = className;
this.teacherName = teacherName;
this.stuList = stuList;
}
public int getStuCnt(){
return stuList.size();
}
public void setStuList(List<Student> stuList) {
this.stuList = stuList;
}
public String getTeacherName(){
return teacherName;
}
public String getClassName(){
return className;
}
//1. 해당 반의 모든 학생의 모든 정보를 출력하는 기능
public void printStuInfo() {
for (Student s : stuList) {
System.out.println(s);
}
}
//2. 해당 반의 평균 성적을 리턴하는 기능
public double getAvg(){
int sum = 0;
int avg = 0;
for (Student s : stuList) {
sum = sum + s.getScore();
}
return sum / (double)stuList.size();
}
//3. 해당 반에서 최고 성적을 지닌 학생을 리턴하는 기능
public Student getHighScoreStu(){
Student maxScoreStu= stuList.get(0);
for(int i = 1; i < stuList.size(); i++ ){
if(maxScoreStu.getScore() < stuList.get(i).getScore()){
maxScoreStu = stuList.get(i);
}
}
return maxScoreStu;
}
}
public class School {
private List<StudyClass> classList;
public School(List<StudyClass> classList){
this.classList = classList;
}
// 1) 매개변수로 담당교사명을 받아, 해당 담당교사가 맡고 있는 모든 반의 학생 정보를 출력
public void printsStuInfoPerTecher(String teacherName){
for(StudyClass e : classList){
if(e.getTeacherName().equals(teacherName)){
e.printStuInfo();
}
}
}
// 2) 각 반별로 반별 평균 점수 및 전체 학급에 대한 평균 점수를 출력
public void printAvgPerClass(){
for(StudyClass e : classList){ //
e.getClassName();
e.getAvg(); //학급의 평균 리턴
System.out.println(e.getClassName() + "의 평균 = " + e.getAvg());
}
double sum = 0.0;
int totalStuCnt = 0;
for(StudyClass e : classList){
sum = sum + (e.getAvg() * e.getStuCnt()); //1개 학급의 총점
totalStuCnt = totalStuCnt + e.getStuCnt();
}
System.out.println("전체 학생의 평균 : " + (sum / totalStuCnt));
}
// 3) 모든 반에서 최고 성적을 가진 학생의 이름과 점수를 출력
public void getFirst(){
for(StudyClass e : classList){
System.out.println(e.getHighScoreStu());
}
}
// 4) 매개변수로 반 이름을 받아, 해당 반의 평균을 리턴하는 기능
public double getAvg2(String className){
double result = 0.0;
for(StudyClass e : classList){
if(e.getClassName().equals(className)){
result = e.getAvg();
}
}
return result;
}
}
public class Test {
public static void main(String[] args) {
Student s1 = new Student("김자바", 20, 80);
Student s2 = new Student("박자바", 25, 87);
Student s3 = new Student("정자바", 30, 90);
List<Student> stuList1 = new ArrayList<>();
stuList1.add(s1);
stuList1.add(s2);
stuList1.add(s3);
StudyClass c1 = new StudyClass("자바반", "자바강사", stuList1);
List<Student> stuList2 = new ArrayList<>();
Student s4 = new Student("김캐드", 23, 75);
Student s5 = new Student("박캐드", 26, 83);
Student s6 = new Student("이캐드", 33, 99);
stuList2.add(s4);
stuList2.add(s5);
stuList2.add(s6);
StudyClass c2 = new StudyClass("캐드반", "캐드강사", stuList2);
List<Student> stuList3 = new ArrayList<>();
Student s7 = new Student("김회계", 25, 75);
Student s8 = new Student("박회계", 35, 85);
Student s9 = new Student("이회계", 40, 95);
stuList3.add(s7);
stuList3.add(s8);
stuList3.add(s9);
StudyClass c3 = new StudyClass("회계반", "회계강사", stuList3);
List<StudyClass> classList = new ArrayList<>();
classList.add(c1);
classList.add(c2);
classList.add(c3);
School school = new School(classList);
school.printsStuInfoPerTecher("캐드강사");
school.printAvgPerClass();
school.getFirst();
}
}