[STUDY] 231218 | Java | set, map, 컬렉션 프레임워크 예제 풀이

Nimgnos·2023년 12월 25일
0

👾 STUDY

목록 보기
21/40
post-thumbnail

💻 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

  • for문, for-each문 둘 다 못 씀
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();
    }
}
profile
먹고 기도하고 코딩하라

0개의 댓글