본문 바로가기

study

JAVA | 오브젝트, Primitive types, Scanner, 난수 (9월 첫째 주 & Exercises)

작년에 자바를 친구한테 잠깐 배우고 나서 처음 듣는 자바 강의...!

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;
 
import java.util.Scanner;
 
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;
 
import java.util.Scanner;
 
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.printlnSystem.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;
 
import java.util.Scanner;
 
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;
 
import java.util.Scanner;
import java.util.Random;
 
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+

  • 사용자가 몇 번 입력했는지 숫자를 세고, 잘못된 답을 입력한 후에는 숫자의 범위를 업데이트하여 다음 프롬프트에 출력한다.

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;
 
import java.util.Scanner;
import java.util.Random;
 
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개의 숫자를 하나씩 입력받는다. 
  • 사용자에게 입력받은 숫자와 처음에 생성한 난수들을 비교하여 몇 개가 같은지 비교하여 결과를 출력한다.

Level 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;
 
import java.util.Scanner;
import java.util.Random;
 
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시간은 날렸다)

난 사소한 에러에도 멍청해서 사서 고생하는 타입인 듯하다.