국비 수업 3일차

김성수·2022년 10월 16일
0
post-thumbnail

1. 길이가 정해지지 않은 반복

무한 반복을 사용하여 입력을 받는 도중 어느 값이 들어오면 반복을 종료한다는 조건문을 넣어 아래와 같이 식을 구현할 수 있다.

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
public class Ex01 {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        // 1) 길이가 정해지지 않은 반복
        // 사용자에게 정수를 입력받아서 합계를 누적시킨다
        // 만약 0을 입력하면 '더 이상 더하지 않겠다' 라는 의미로 생각하여 반복을 중단한다
        
        int input, sum = 0;
        
        while(true) {
            System.out.print("정수 입력 : ");
            input = sc.nextInt();
            
            sum += input;
            if(input == 0) {
                break;
            }
        }
        // Unreachable code
        System.out.println("합계 : " + sum);
        
        sc.close();
    }
}
cs


Unreachable code

※ 도달할 수 없는 코드 (원인을 해결하기 위해선 이전의 코드를 잘 살펴본다)

예시) 무한반복이 탈출 불가능 할 경우 반복문 아래에 있는 모든 코드에 이 경고문이 나타난다



JVM

JVM은 자바 가상머신(Java Virtual Machine)의 약자이다.

JVM은 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class)을 실행할 수 있다. 또한 JVM은 플랫폼에 의존적이다. 즉 리눅스의 JVM과 윈도우즈의 JVM은 다르다. 단, 컴파일된 바이너리 코드는 어떤 JVM에서도 동작시킬 수 있다.

JVM은 다음과 같은 역할을 한다.

  • 바이너리 코드를 읽는다.
  • 바이너리 코드를 검증한다.
  • 바이너리 코드를 실행한다.
  • 실행환경(Runtime Environment)의 규격을 제공한다. (필요한 라이브러리 및 기타파일)



JRE

JRE는 자바 실행환경(Java Runtime Environment)의 약자이다.

JRE는 JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다. JRE는 JVM의 실행환경을 구현했다고 할 수 있다.

jdk



JDK

JDK는 자바 개발도구(Java Development Kit)의 약자이다.

JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.

jrd

2. 반복문 삼항 연산자 활용하기

※ if문을 써도 되긴 하지만 삼항연산자를 대신 사용하여 써본다.

문자도 정수를 쓸 수 있다는 걸 알면서도 잊지 않아야한다. 아래는 아스키코드를 활용한 알파벳 출력이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package day03;
 
public class Ex02 {
    public static void main(String[] args) {
        
        
        // 대문자 A부터 Z까지 한줄에 출력하세요
        // 각 글자는 ,로 구분하고 마지막에는 콤마가 없어야 합니다
 
        
        char alphabet = 65;
        String result;
        for(int i = 0; i < 26; i++) {
            
            result = i < 25 ? ", " : "";
            System.out.printf("%c%s",alphabet + i,result);
            
            /*
             * if(i < 25) System.out.printf("%c, ",alphabet + i); else
             * System.out.printf("%c",alphabet + i);
             */        
            
        }
cs


3. 반복문 코드의 흐름 분석해보기

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
package day03;
 
import java.util.Scanner;
 
public class Ex04 {
    public static void main(String[] args) throws Exception {
        // 아래 코드의 실행을 확인학, 코드의 흐름을 분석해보세요
 
        Scanner sc = new Scanner(System.in);
        int size = 100;
        int current;
 
        System.out.print("0 ~ 100 사이 입력 : ");
        current = sc.nextInt();
        current = current * 100 / size;
 
        System.out.print("[");
        for (int i = 0; i < 50; i++) {
            if (i == 25) {
                System.out.printf(" %3d%% ", current);
            }
            else if (i < current / 2) {
                System.out.print("#");
            } 
            else {
                System.out.print("_");
            }
            Thread.sleep(500); // CPU에게 0.5초만큼 기다리게 한다.
        }
        System.out.println("]");
 
        sc.close();
 
    }
}
 
cs

※ 위의 코드를 보고 코드의 흐름을 분석 및 이해한다.




4. 가장 가까운 엘리베이터를 호출하는 간단한 알고리즘

너무 복잡하게 생각하면 안되는 문제이다.
그냥 단순히 내가 있는 층에서 엘리베이터 1,2,3의 층수를 뺀 다음 만약 그 결과 값이 음수로 나오더라도 절대값으로 바꿔버린다면 내 현재층과 대상이 된 엘리베이터의 거리를 구할 수 있기 때문에 간단히 해결되는 문제다.

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
public class Quiz1 {
    public static void main(String[] args) {
        
        Random ran = new Random();
        Scanner sc = new Scanner(System.in);
        int n1 = ran.nextInt(15+ 1;
        int n2 = ran.nextInt(15+ 1;
        int n3 = ran.nextInt(15+ 1;
        int current;
        
        /*
         *         1층에서 15층 사이의 엘리베이터 3개가 있습니다
         *         사용자에게 현재 층을 입력받아서 가장 가까운 엘리베이터가 이동할수 있도록
         *         출력문을 만들어서 출력해주세요
         */
        // 가장 가까운 엘리베이터
        // 거리가 최소값인 엘리베이터
        // 절대값(현재 층-대상 층)중에서 최소값을 가지는 엘리베이터
        
        System.out.printf("%d, %d, %d\n", n1, n2, n3);
        System.out.print("현재 몇층입니까 : ");
        current = sc.nextInt();        // 현재 층수를 입력받는다
        
        int d1 = current - n1;        // 현재 층과 각 엘리베이터 층수의 [차이]를 구한다
        int d2 = current - n2;
        int d3 = current - n3;
        
        d1 = d1 < 0 ? -d1 : d1;        // 위 혹은 아래 방향에 상관없이 [거리]를 구하기 위해 [절대값] 처리한다
        d2 = d2 < 0 ? -d2 : d2;
        d3 = d3 < 0 ? -d3 : d3;
        
        int min = d1;                // [거리 중에서 최소값]을 찾아낸다
        if(min > d2)     min = d2;
        if(min > d3)     min = d3;
        
        // 최소값과 일치하는 요소가 이동하는 형식을 출력한다
        if(min == d1)      System.out.println("첫번째 엘리베이터가 움직입니다");    
        if(min == d2)      System.out.println("두번째 엘리베이터가 움직입니다");
        if(min == d3)      System.out.println("세번째 엘리베이터가 움직입니다");
        
        sc.close();
cs




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
public class Ex07 {
    public static void main(String[] args) {
        
        Random ran = new Random();
        Scanner sc = new Scanner(System.in);
        int current;
        
        Integer [] elevators = {    // 랜덤으로 정수를 3개 가지는 배열
            ran.nextInt(15+ 1,
            ran.nextInt(15+ 1,
            ran.nextInt(15+ 1,
        };
        
        List<Integer> el = Arrays.asList(elevators);    // 배열을 리스트로 변환 
        System.out.println(el);
        
        System.out.println("현재 층수를 입력 : ");
        current = sc.nextInt();
        
        int min = 15;        // 최소값을 저장할 변수
        int index = 0;        // 최소값은 몇번째 위치에 있는지 저장할 변수
        for(int i = 0; i < el.size(); i++) {
            int dist = Math.abs(current - el.get(i));    // 절대값을 구하여 거리를 만들어두고
            if(min > dist) {    // 거리의 최소값이 몇번째인지에 따라
                index = i;        // index변수에 i값을 저장
            }
        }
        System.out.printf("%d번째 엘리베이터가 움직입니다\n", index + 1);// index는 0부터 시작하므로 + 1
        sc.close();
    }
}
cs
profile
다들 잘하는데 나만 못해?

0개의 댓글