작년에 자바를 친구한테 잠깐 배우고 나서 처음 듣는 자바 강의...!
c에 익숙해져 있어 자바는 아직 조금 버겁다. 그래도 새로운 언어를 배울 때는 나름의 재미가 있는 것 같다.
자바는 모든 것이 오브젝트(object)이다.
- 오브젝트는 클래스의 인스턴스이다.
Animal (class name) cat (object name) = new Animal();
- 클래스는 메소드(methods)를 포함한다.
- main 메소드는 프로그램의 엔트리 포인트(시작하는 포인트)이다.
Primitive Types
- Integer types : byte, short, int, long
- Char type
- Boolean type : C와 다르게 1과 0이 아니라 true, false 이다.
- 타입이 서로 달라도 덧셈이 가능하다. (메모리 상에서는 number로 저장, print 할 때만 상이)
Exercises
Level 1
- "Hello, Java"와 그 다음줄에 자신의 이름을 출력하도록 자바 프로그램을 작성하라.
1
2
3
4
5
6
7
8
9
10
11
12
|
package cse3040;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello, World!");
System.out.println("Jung Won Lee");
}
}
|
Level 2
- 사용자의 이름을 입력받아 Hello, (사용자의 이름) 을 출력하도록 자바 프로그램을 작성하라.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package cse3040;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("What is your name?");
String name = in.nextLine();
System.out.println("Hello, " + name + "!");
}
}
|
# Scanner class는 java.util.Scanner을 import했을 때 사용할 수 있다. nextLine, next, nextInt, nextDouble 등이 존재한다.
Level 3
- 두 숫자를 입력받아 두 숫자의 합을 출력하도록 자바 프로그램을 작성하라.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package cse3040;
package cse3040;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("Enter first number: ");
double a = in.nextDouble();
System.out.println("Enter second number: ");
double b = in.nextDouble();
double result = a + b;
System.out.print("The sum of two numbers is: " + result);
}
}
|
# System.out.println 과 System.out.print의 차이는 무엇일까? 전자는 내용을 출력하고 다음줄로 넘어가지만, 후자는 그렇지 않다.
# 정수형으로 입력받았을 때(nextInt), 정수가 아닌 실수를 입력받을 경우 에러가 발생하는 것에 주의할 것!
Level 4
- 사용자에게 알파벳 한 글자를 입력받아 ASCII 코드를 출력하도록 자바 프로그램을 작성하라.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package cse3040;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("ASCII code teller. Enter a letter: ");
String c = in.nextLine();
char letter = c.charAt(0);
System.out.printf("The ASCII code of %c is %d.", letter, (int)letter);
}
}
|
# charAt() 함수는 string의 문자 위치에 따라서 하나의 캐릭터로 저장할 수 있는 함수이다. charAt(3)라고 하면 문자열의 3번째 인덱스의 문자를 변수에 저장한다는 뜻이다.
Level 5
- 1부터 100사이의 난수를 생성해 사용자에게 그 숫자를 맞히도록 자바 프로그램을 작성하라.
- 난수보다 작은 수를 입력했을 경우 "Too small!"을 출력하고 다시 사용자에게 묻는다.
- 난수보다 큰 수를 입력했을 경우 "Too large!"을 출력하고 다시 사용자에게 묻는다.
- 난수와 같은 수를 입력했을 경우 "Correct!"을 출력하고 끝낸다.
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
|
package cse3040;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
Random generator = new Random();
int r = generator.nextInt(100) + 1;
while(true)
{
System.out.println("Guess a number (1-100): ");
int i = in.nextInt();
if(i == r) {
System.out.println("Correct!");
break;
}
else if(i > r) {
System.out.println("Too large!");
}
else {
System.out.println("Too small!");
}
}
}
}
|
# C에서 했던 것처럼 while(1)을 아무렇지 않게 썼다가 에러가 났다. C와 달리 자바에서는 1이 true와 같지 않기 때문에 while(true)라고 써 줘야 한다.
# 난수 생성을 위해 java.util.Random을 import한다.
Level 5+
- 사용자가 몇 번 입력했는지 숫자를 세고, 잘못된 답을 입력한 후에는 숫자의 범위를 업데이트하여 다음 프롬프트에 출력한다.
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
|
package cse3040;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
Random generator = new Random();
int r = generator.nextInt(100) + 1;
int start = 1;
int end = 100;
int count = 1;
while(true)
{
System.out.printf("[%d] Guess a number (%d-%d): ", count, start, end);
int i = in.nextInt();
if(i == r) {
System.out.println("Correct!");
break;
}
else if(i > r) {
System.out.println("Too large!");
end = i - 1;
}
else {
System.out.println("Too small!");
start = i + 1;
}
count++;
}
}
}
|
# 난수를 생성할 때 nextInt(100)일 경우 0부터 99까지의 난수를 생성한다는 의미이다. 이 문제에서는 1이상 100이하의 범위이므로 1을 더하였다.
Level 6
- 프로그램이 시작할 때, 1부터 45까지 중복되지 않는 난수들을 생성한다.
- 사용자에게 6개의 숫자를 하나씩 입력받는다.
- 사용자에게 입력받은 숫자와 처음에 생성한 난수들을 비교하여 몇 개가 같은지 비교하여 결과를 출력한다.
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
|
package cse3040;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
Random generator = new Random();
int lotto[] = new int[6];
int count, number = 0;
for(int k = 0; k < 6; k++) {
lotto[k] = generator.nextInt(45) + 1;
for(int j = 0; j < k; j++) {
if(lotto[k] == lotto[j]) k--;
}
}
for(count = 0; count < 6; count++)
{
System.out.printf("[Lotto] Enter a number #%d (1-45): ", count + 1);
int i = in.nextInt();
for(int x = 0; x < 6; x++) {
if(i == lotto[x]) number++;
}
}
System.out.print("This week's lotto numbers: ");
for(int x = 0; x < 6; x++) System.out.printf("%d ", lotto[x]);
System.out.print("\n");
System.out.printf("You matched %d numbers.", number);
}
}
|
# 난수를 생성할 때 6개의 숫자가 중복되지 않도록 생성한 난수와 이전에 생성한 난수들을 비교하여 같은 난수일 경우 인덱스 하나를 줄여 다시 생성하게 만들었다. 조금 더 짧게 만들 수 있을 것 같은데 귀찮아서 걍 이렇게 했다.
# 역시 출력문에 숫자가 꼈을 경우 println보다 printf가 편하다. C에서처럼 %d를 활용하여 숫자를 출력할 수 있다.
이 코드들은 깃허브에도 올렸다! 주소는 https://github.com/gartuaden/JAVA
gartuaden/JAVA
CSE3040. Contribute to gartuaden/JAVA development by creating an account on GitHub.
github.com
드디어 9월 첫째 주에 정리한 것들을 모두 올렸다! 나머지 과목들은 수업을 안 하거나 정리할 것이 없어서 올리지 않았다.
자바는 그냥 안 올리려고 했는데 깃허브 말고도 블로그에서도 정리해서 올리니까 뭔가 더 정리한 느낌이고 뿌듯하고 그렇다.
근데 이 짓을 앞으로도 꾸준히 할지 걱정된다. (한 70% 안 할 거라 확신)
자바 작년에 설치하고 이번에 업데이트하면서 버전이 달라 처음에 JNI 에러가 떴었다.
환경 변수 설정을 해도 안 되고, 경로를 바꿔도 안 되고, path의 첫 번째 경로를 없애도 안 되고...
구글링을 해 보니 프로젝트 폴더(우클릭)-속성-자바 컴파일러에서 compiler compliance level을 9에서 1.8로 바꾸니 잘 실행되었다.
이거 처음에 헷갈려서 컴퓨터에서 프로젝트 폴더 속성을 들어갔었는데 (지금 생각해 보니 개멍청하다)
알고 보니 이클립스 실행한 창에서 프로젝트 폴더를 말한 거였다. ;; (이렇게 해서 1시간은 날렸다)
난 사소한 에러에도 멍청해서 사서 고생하는 타입인 듯하다.