오늘은 개인적인 사정으로 인해서 출석을 하지 못했다. 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
기본적인 데이터 타입들을 Scanner 의 메소드를 사용하여 입력받을 수 있다.
예로 들어 100을 입력하고자 할 때, String(문자열)로 입력받고 싶으면 next() 나 nextLine() 을, int(정수)로 입력받고 싶다면 nextInt() 를 사용하여 입력받으면 알아서 해당 타입으로 입력된다.
Scanner 을 사용할 시 util 패키지를 경로의 Scanner 클래스를 호출해야 한다.
자바에서 쓰이는 대부분의 클래스는 lang 패키지가 아니라면 import 을 통해 호출해주어야 한다.
Scanner 의 경우는 java.util 패키지에 있다.
공백(띄어쓰기) 또는 개행(줄 바꿈)을 기준으로 읽는다.
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 사용할 때 다른걸 입력하면 실행이 중지되는게 어떻게 해결해야될지 궁금했는데 이런식으로 해결하면 된다. 저기 버퍼를 지운다 부분이 없으면 숫자를 똑바로 입력해. 가 무한증식된다. 키보드를 통해 입력된 값을 받은 변수를 초기화 시켜주는 저 코드가 없으면 안된다.
다음은 백준 사이트 문제 푸는 법이랑 문제 풀이인 것 같다.
내일은 문제 풀이와 기초 다시 복습하려고 한다.
'Coding History' 카테고리의 다른 글
2024. 06. 24 문제풀이 (0) | 2024.06.24 |
---|---|
국비 지원 IT(웹앱개발) 취업반 강의 13일차 (0) | 2024.06.24 |
국비 지원 IT(웹앱개발) 취업반 강의 11일차 (0) | 2024.06.20 |
국비 지원 IT(웹앱개발) 취업반 강의 10일차 (0) | 2024.06.19 |
국비 지원 IT(웹앱개발) 취업반 강의 9일차 (0) | 2024.06.18 |