오늘 공부한 내용
강의노트
비트캠프 엄진영 강사님의 수업을 들으며 정리하였습니다.
자바 문법 몸소 체험하기
1. 낱개의 변수를 사용하여 여러 회원 정보 처리하기
낱개의 변수를 사용할 수는 있겠지만.. 5명이 아니라 1000명의 데이터를 입력받는다고 생각해보자.
클래스의 패키지 정보 선언하기
1
import java.util.Scanner;
위와 같이 클래스의 패키지 정보를 미리 선언하여 컴파일러에게 알려줄 수 있다. 위의 코드에서 Scanner가 java.util에 있는 Scanner라는 것을 먼저 알려주면 Scanner를 사용할 때 일일이 명시하지 않아도 된다!
1
2
3
4
//import를 하지 않았을 때
java.util.Scanner keyInput = new java.util.Scanner(System.in);
//import를 해줬을 때
Scanner keyInput = new Scanner(System.in)
2. 조건문을 사용하여 입출력 제어하기
조건문을 사용하지 않은 1번에서는 정해진 인원(5명)만큼만 데이터를 입력받을 수 있었다. 조건문을 사용하여 필요한 만큼만 입력 받고 출력할 수 있게 되었다.
3. 배열을 사용하여 여러 개의 값을 다루기
배열을 사용하면 간단하게 여러 개의 변수를 선언할 수 있다.
1
2
3
4
5
6
int no1 = 0, no2 = 0, no3 = 0, no4 = 0, no5 = 0;
String name1 = "", name2 = "", name3 = "", name4 = "", name5 = "";
// 배열 사용
int[] no = new int[5];
String[] name = new String[5];
낱개의 변수를 사용할 경우 변수 선언 뿐만 아니라 값을 일일이 초기화해주어야 한다. 배열을 사용할 경우 각 인덱스 값은 0으로 초기화되기 때문에 값을 초기화할 필요가 없다.
4. 반복문을 사용하여 여러 개의 값을 다루기
반복문을 사용하면 같은 코드를 중복해서 작성할 필요가 없다. 특히 배열은 인덱스 값을 이용하여 반복문을 사용하기 용이하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 반복문을 사용하지 않았을 때
System.out.printf("%d, %s, %s, %s, %s\n", no[0], name[0], email[0], tel[0], now[0].toString());
if(count > 1) {
System.out.printf("%d, %s, %s, %s, %s\n", no[1], name[1], email[1], tel[1], now[1].toString());
if(count > 2) {
System.out.printf("%d, %s, %s, %s, %s\n", no[2], name[2], email[2], tel[2], now[2].toString());
if(count > 3) {
System.out.printf("%d, %s, %s, %s, %s\n", no[3], name[3], email[3], tel[3], now[3].toString());
if(count > 4) {
System.out.printf("%d, %s, %s, %s, %s\n", no[4], name[4], email[4], tel[4], now[4].toString());
}
}
}
}
// 반복문을 사용했을 때
for (int i = 0; i < count; i++) {
System.out.printf("%d, %s, %s, %s, %s\n",
no[i], name[i], email[i], tel[i], now[i].toString());
}
배열 개수를 변수에서 관리하기
변수의 값만 바꾸면 배열 개수를 바로 변경할 수 있어 편하다. 이는 유지보수에 용이하다.
1
2
3
4
5
6
7
8
9
// 배열 개수를 관리하는 변수가 없을 때
int[] no = new int[5];
String[] name = new String[5];
// 배열 개수를 관리하는 변수를 선언했을 때
int maxLength = 5;
int[] no = new int[maxLength];
String[] name = new String[maxLength];
상수를 사용하여 초기 값을 변경하지 못하게 막기
변수는 중간에 값을 바꿀 수 있기 때문에 값을 바꾸지 말아야 하는 경우 상수로 선언한다. 앞에 final
을 붙이면 이 뒤에 값을 재할당할 시 문법오류가 발생한다. 이때 상수는 대문자+언더바를 사용하여 변수와 다름을 표시하자.
1
2
3
4
5
// 변수 선언
int maxLength = 5;
// 상수 선언
final int MAX_LENGTH = 5;
매서드를 사용하여 코드를 분리하기
매서드를 사용하면 기능별로 코드를 별도의 블럭으로 분리할 수 있다. 이처럼 작은 단위로 코드가 분리되면 관리하기 쉽다.
이전에는 main 매서드에서 모든 기능을 넣었지만, main, inputMembers(), printMembers() 매서드로 기능에 따라 코드를 분리하였다.
각 메소드에서 공통으로 사용하는 변수 및 상수는 메소드 밖 클래스에 선언하고, 같은 static 그룹으로 표시하면 static 메소드에서 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class App_g {
static int count = 0;
static final int MAX_LENGTH = 5;
static int[] no = new int[MAX_LENGTH];
//(...)
public static void main(String[] args){
inputMembers();
printMembers();
}
static void inputMembers() {
Scanner keyInput = new Scanner(System.in);
long currentMillis = 0;
for (int i = 0; i < MAX_LENGTH; i++){
count ++;
System.out.print("번호? ");
no[i] = keyInput.nextInt();
keyInput.nextLine();
//(...)
currentMillis = System.currentTimeMillis();
now[i] = new Date(currentMillis);
System.out.println("");
System.out.println("계속 입력하시겠습니까?(y/N) ");
String response = keyInput.nextLine();
if (response.equalsIgnoreCase("y") == false) {
break;
}
}
keyInput.close();
}
static void printMembers() {
for (int i = 0; i < count; i++) {
System.out.printf("%d, %s, %s, %s, %s\n",
no[i], name[i], email[i], tel[i], now[i].toString());
}
}
클래스를 사용하여 데이터를 담을 메모리를 정의한다.
번호, 이름, 이메일 등 각각의 데이터를 낱개로 다루는 것보다 하나의 데이터로 묶어서 다루면 값을 다루기가 편하다. 메소드가 식판이라면 클래스는 여러개의 식판을 담는 배급차와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class App_h {
static class Member {
int no;
String name;
String email;
String password;
String photo;
String tel;
Date now;
}
static int count = 0;
static final int MAX_LENGTH = 5;
static Member[] members = new Member[MAX_LENGTH];
public static void main(String[] args) {
System.out.println("[회원]");
inputMembers(); // 별도의 블럭으로 분리한 코드를 실행하기
System.out.println("--------------------------");
printMembers();
}
static void inputMembers() {
Scanner keyInput = new Scanner(System.in);
long currentMillis = 0;
for (int i = 0; i < MAX_LENGTH; i++) {
count ++;
Member m = new Member();
// 식판에 음식물을 담는다.
System.out.print("번호? ");
m.no = keyInput.nextInt();
keyInput.nextLine();
// (...)
//식판을 배선카에 꼽는다.
members[i] = m;
System.out.println("계속 입력하시겠습니까?(y/N) ");
String response = keyInput.nextLine();
if (response.equalsIgnoreCase("y") == false) {
break;
}
}
keyInput.close();
}
static void printMembers() {
for (int i = 0; i < count; i++) {
Member m = members[i];
System.out.printf("%d, %s, %s, %s, %s\n",
m.no, m.name, m.email, m.tel, m.now.toString());
}
}