Coding History

국비 지원 IT(웹앱개발) 취업반 강의 12일차

BlackBirdIT 2024. 6. 21. 23:02

오늘은 개인적인 사정으로 인해서 출석을 하지 못했다. 9시에 레슨을 끝내고 밖에서 강사님이 올려주신 글과 영상을 보며 뭘 배웠는지 기록하려고 한다. 문제 풀이도 혼자서 진행하고 올리도록 해보겠다.

문제 풀이 부터 시작했던 것 같다.

  • 인력사무소 문제
class Main {
    public static void main(String[] args) {
        사람인력관리소 a사람인력관리소 = new 사람인력관리소();

        a사람인력관리소.add사람("홍길순", 33);
        // 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
        a사람인력관리소.add사람("홍길동", 20);
        // 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
        a사람인력관리소.add사람("임꺽정", 30);
        // 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.

        사람 a사람1 = a사람인력관리소.get사람(1);
        a사람1.자기소개();
        // 저는 1번, 홍길순, 33살 입니다.

        사람 a사람2 = a사람인력관리소.get사람(2);
        a사람2.자기소개();
        // 저는 2번, 홍길동, 20살 입니다.

        사람 a사람3 = a사람인력관리소.get사람(3);
        a사람3.자기소개();
        // 저는 3번, 임꺽정, 30살 입니다.
    }
}
class 사람인력관리소 {
    사람 a사람0;
    사람 a사람1;
    사람 a사람2;
    사람 a사람3;

    int 마지막_사람의_번호 = 0;

    void add사람(String 이름, int 나이) {
        int 번호 = 마지막_사람의_번호 + 1;
        사람 a사람 = new 사람();
        a사람.번호 = 번호;
        a사람.이름 = 이름;
        a사람.나이 = 나이;

        if (번호 == 1) {
            a사람0 = a사람;
        } else if (번호 == 2) {
            a사람1 = a사람;
        } else if (번호 == 3) {
            a사람2 = a사람;
        } else if (번호 == 4) {
            a사람3 = a사람;
        }

        System.out.printf("나이가 %d살인 %d번째 사람(%s)이 추가되었습니다.\n", 나이, 번호, 이름);
        마지막_사람의_번호++;
    }

    사람 get사람(int 번호) {
        if (번호 == 1) {
            return a사람0;
        } else if (번호 == 2) {
            return a사람1;
        } else if (번호 == 3) {
            return a사람2;
        } else if (번호 == 4) {
            return a사람3;
        }
        return null;
    }
}

class 사람 {
    int 번호;
    String 이름;
    int 나이;

    void 자기소개() {
        System.out.printf("저는 %d번, %s, %d살 입니다.\n", this.번호, this.이름, this.나이);
    }
}

이렇게 풀면 비효율적이기 때문에 더 콤팩트하게 바꿀 필요가 있다. 그 방법중 하나가 배열을 사용하는 것이다.

// 문제 : 아래가 실행되도록 해주세요.

class Main {
    public static void main(String[] args) {
        사람인력관리소 a사람인력관리소 = new 사람인력관리소();

        a사람인력관리소.add사람("홍길순", 33);
        // 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
        a사람인력관리소.add사람("홍길동", 20);
        // 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
        a사람인력관리소.add사람("임꺽정", 30);
        // 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.

        사람 a사람1 = a사람인력관리소.get사람(1);
        a사람1.자기소개();
        // 저는 1번, 홍길순, 33살 입니다.

        사람 a사람2 = a사람인력관리소.get사람(2);
        a사람2.자기소개();
        // 저는 2번, 홍길동, 20살 입니다.

        사람 a사람3 = a사람인력관리소.get사람(3);
        a사람3.자기소개();
        // 저는 3번, 임꺽정, 30살 입니다.
    }


}

class 사람인력관리소 {
    사람[] 사람들 = new 사람[5];
//    사람 a사람0;
//    사람 a사람1;
//    사람 a사람2;
//    사람 a사람3;

    int 마지막_사람의_번호 = 0;

    void add사람(String 이름, int 나이) {
        int 번호 = 마지막_사람의_번호 + 1;
        사람 a사람 = new 사람();
        a사람.번호 = 번호;
        a사람.이름 = 이름;
        a사람.나이 = 나이;

        사람들[번호 - 1] = a사람;

//        if (번호 == 1) {
//            a사람0 = a사람;
//        } else if (번호 == 2) {
//            a사람1 = a사람;
//        } else if (번호 == 3) {
//            a사람2 = a사람;
//        } else if (번호 == 4) {
//            a사람3 = a사람;
//        }

        System.out.printf("나이가 %d살인 %d번째 사람(%s)이 추가되었습니다.\n", 나이, 번호, 이름);
        마지막_사람의_번호++;
    }

    사람 get사람(int 번호) {
//        if (번호 == 1) {
//            return a사람0;
//        } else if (번호 == 2) {
//            return a사람1;
//        } else if (번호 == 3) {
//            return a사람2;
//        } else if (번호 == 4) {
//            return a사람3;
//        }
        return 사람들[번호 -1];
    }
}

class 사람 {
    int 번호;
    String 이름;
    int 나이;

    void 자기소개() {
        System.out.printf("저는 %d번, %s, %d살 입니다.\n", this.번호, this.이름, this.나이);
    }
}

각주 처리된 부분이 없다고 생각하면 더 콤팩트하다. 하지만 문제가 있다. 인력사무소에 사람이 새로 들어오거나 나가게 된다면 우리는 다시 코드를 수정해야한다. 완벽한 자동화는 아니라는 소리이다. 이 때 우리가 어제 배웠던 ArrayList를 사용한다.

package org.example2;

// 문제 : 아래가 실행되도록 해주세요.

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

class Main2 {
    public static void main(String[] args) {
        사람인력관리소 a사람인력관리소 = new 사람인력관리소();

        a사람인력관리소.add사람("홍길순", 33);
        // 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
        a사람인력관리소.add사람("홍길동", 20);
        // 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
        a사람인력관리소.add사람("임꺽정", 30);
        // 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.

        사람 a사람1 = a사람인력관리소.get사람(1);
        a사람1.자기소개();
        // 저는 1번, 홍길순, 33살 입니다.

        사람 a사람2 = a사람인력관리소.get사람(2);
        a사람2.자기소개();
        // 저는 2번, 홍길동, 20살 입니다.

        사람 a사람3 = a사람인력관리소.get사람(3);
        a사람3.자기소개();
        // 저는 3번, 임꺽정, 30살 입니다.
    }


}

class 사람인력관리소 {
    //    사람[] 사람들 = new 사람[5];
    List<사람> 사람들 = new ArrayList<>();


    int 마지막_사람의_번호 = 0;

    void add사람(String 이름, int 나이) {
        int 번호 = 마지막_사람의_번호 + 1;
        사람 a사람 = new 사람();
        a사람.번호 = 번호;
        a사람.이름 = 이름;
        a사람.나이 = 나이;

//        사람들[번호 - 1] = a사람;
        사람들.add(a사람);


        System.out.printf("나이가 %d살인 %d번째 사람(%s)이 추가되었습니다.\n", 나이, 번호, 이름);
        마지막_사람의_번호++;
    }

    사람 get사람(int 번호) {

//        return 사람들[번호 -1];
        return 사람들.get(번호 - 1);
    }
}

class 사람 {
    int 번호;
    String 이름;
    int 나이;

    void 자기소개() {
        System.out.printf("저는 %d번, %s, %d살 입니다.\n", this.번호, this.이름, this.나이);
    }
}

코드가 더 줄지는 않았지만 코드 관리면에서는 훨씬 편해진다.

HashMap도 데이터를 관리하는데 편리하지 않을까? 그럼 한번 사용해보면 된다.

package org.example2;

// 문제 : 아래가 실행되도록 해주세요.

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

class Main2 {
    public static void main(String[] args) {
        사람인력관리소 a사람인력관리소 = new 사람인력관리소();

        a사람인력관리소.add사람("홍길순", 33);
        // 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
        a사람인력관리소.add사람("홍길동", 20);
        // 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
        a사람인력관리소.add사람("임꺽정", 30);
        // 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.

        사람 a사람1 = a사람인력관리소.get사람(1);
        a사람1.자기소개();
        // 저는 1번, 홍길순, 33살 입니다.

        사람 a사람2 = a사람인력관리소.get사람(2);
        a사람2.자기소개();
        // 저는 2번, 홍길동, 20살 입니다.

        사람 a사람3 = a사람인력관리소.get사람(3);
        a사람3.자기소개();
        // 저는 3번, 임꺽정, 30살 입니다.
    }


}

class 사람인력관리소 {
    //    사람[] 사람들 = new 사람[5];
    List<사람> 사람들 = new ArrayList<>();


    int 마지막_사람의_번호 = 0;

    void add사람(String 이름, int 나이) {
        int 번호 = 마지막_사람의_번호 + 1;
        사람 a사람 = new 사람();
        a사람.번호 = 번호;
        a사람.이름 = 이름;
        a사람.나이 = 나이;

//        사람들[번호 - 1] = a사람;
        사람들.add(a사람);


        System.out.printf("나이가 %d살인 %d번째 사람(%s)이 추가되었습니다.\n", 나이, 번호, 이름);
        마지막_사람의_번호++;
    }

    사람 get사람(int 번호) {

//        return 사람들[번호 -1];
        return 사람들.get(번호 - 1);
    }
}

class 사람 {
    int 번호;
    String 이름;
    int 나이;

    void 자기소개() {
        System.out.printf("저는 %d번, %s, %d살 입니다.\n", this.번호, this.이름, this.나이);
    }
}

이런 모양이 된다.

어떤게 효율적인가는 모른다. 해봐야지 안다. 다양하게 코드를 사용하는 연습을 해보는게 좋을 것 같다. 아마 강사님도 그런 의도로 이걸 풀게 하셨으리라.

다음은 스캐너로 넘어간다.

  • Scanner
  1. 기본적인 데이터 타입들을 Scanner 의 메소드를 사용하여 입력받을 수 있다.

    예로 들어 100을 입력하고자 할 때, String(문자열)로 입력받고 싶으면 next() 나 nextLine() 을, int(정수)로 입력받고 싶다면 nextInt() 를 사용하여 입력받으면 알아서 해당 타입으로 입력된다.

  1. Scanner 을 사용할 시 util 패키지를 경로의 Scanner 클래스를 호출해야 한다.

    자바에서 쓰이는 대부분의 클래스는 lang 패키지가 아니라면 import 을 통해 호출해주어야 한다.
    Scanner 의 경우는 java.util 패키지에 있다.

  1. 공백(띄어쓰기) 또는 개행(줄 바꿈)을 기준으로 읽는다.

    Scanner 의 입력 메소드들은 대부분 공백과 개행(' ', '\t', '\r', '\n' 등등..)을 기준으로 읽는다.
    이 덕분에 사용자의 편의에 따라 쉽게 입력을 받을 수 있다.

사실 스캐너는 백준을 풀 때랑 그냥 문제 풀이할 때도 재미로 몇번 써봐서 그렇게 어렵게 느껴지지 않았다. 역시 조금 갖고 놀아봐야지 익숙해지나보다.

import java.util.Scanner; //import해야 스캐너 사용가능

class Main2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 스캐너

        System.out.print("숫자: ");

        int n = sc.nextInt(); // int값을 입력받아서 변수 n에 넣겠다.

        System.out.printf("입력된 숫자 : %d", n); // 입력된 숫자 출력.

        sc.close(); // 스캐너 객체 연결을 끊음
    }
}

이런 구조로 작동하는 것이 스캐너이다.

import java.util.InputMismatchException;
import java.util.Scanner;

class Main2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = 0;

        while (true) {
            System.out.print("숫자: ");
            try {
                n = sc.nextInt();  // 대기, 숫자를 똑바로 입력할 때 까지
                sc.nextLine(); //버퍼를 지운다.
                break;
            } catch (InputMismatchException e) {
                System.out.println("숫자를 똑바로 입력해.");
                sc.nextLine(); //버퍼를 지운다.
            }
        }

        System.out.printf("입력된 숫자 : %d", n);

        sc.close();
    }
}

예전부터 nextInt 사용할 때 다른걸 입력하면 실행이 중지되는게 어떻게 해결해야될지 궁금했는데 이런식으로 해결하면 된다. 저기 버퍼를 지운다 부분이 없으면 숫자를 똑바로 입력해. 가 무한증식된다. 키보드를 통해 입력된 값을 받은 변수를 초기화 시켜주는 저 코드가 없으면 안된다.

다음은 백준 사이트 문제 푸는 법이랑 문제 풀이인 것 같다.

내일은 문제 풀이와 기초 다시 복습하려고 한다.