국비 수업 1일차

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

국비 과정 필기 내용

※ 본문 들어가기 전 Hashcode란?

Hashcode는 객체를 식별하는 Integer 값입니다. 객체가 갖고 있는 데이터를 어떤 알고리즘에 적용하여 계산된 정수 값을 hashcode라고 할 수 있습니다.

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
package day01;
 
import java.util.Scanner;
 
// 자바의 소스코드는 클래스가 기본 구성 단위이다
// 자바에서 클래스를 제외한 나머지 요소는 모두 첫글자를 소문자로 시작한다
// (변수, 함수, 접근제한자, 패키지, 프로젝트...)
// 단, 클래스의 static final 멤버는 모든 글자를 대문자로 작성하며 _로 단어를 구분한다
// 변수 및 함수의 이름은 소문자, _ 로 시작할 수 있다. (숫자는 첫번째 글자가 될 수 없다)
 
/*
 *         dao.selectAll()        : 객체의 메서드를 호출
 *         DAO.getInstance()    : 클래스의 정적 메서드를 호출
 */
 
public class Ex01 {
    public static void main(String[] args) {
 
        // 자료형 (data type)
        /*
         * 1. primitive type (단순 자료형, 원시 자료형) 소문자로 시작하며 총 8개의 기초적인 자료형이 있다 복잡한 데이터가
         * 아니므로, 변수에 데이터를 직접 저장한다
         * 
         * ☆ boolean 1바이트 논리값 true, false byte 1바이트 정수(8비트) -128 ~ +127 short 2바이트
         * 정수(16비트) -32768 ~ +32767 char 2바이트 정수(글자) 0 ~ 65535 ☆ int 4바이트 정수(32비트) 약-21억
         * ~ 약+21억 long 8바이트 정수(64비트) -922조 ~ +922조 float 4바이트 실수 ☆ double 8바이트 실수
         * 
         * 
         * 2. Reference Type (참조 자료형)
         * 
         * - Array Type : 배열 - Class Type : 클래스, 인터페이스 등...
         * 
         */
 
        // 단일 데이터를 메모리에 저장하고 싶다 -> 크기에 맞는 변수
        // 같은 자료형의 데이터를 여러개 묶어서 저장하고 싶다 -> 배열
 
        // 서로 다른 자료형의 데이터를 묶어서 저장하려면 새로운 자료형을 정의해야 한다
 
        // 구조체 in C언어 변수만 묶어서 자료형을 만든다
        // 클래스 in Java(C++) 변수와 함수를 묶어서 자료형을 만든다
 
        Scanner sc = new Scanner(System.in);
        System.out.print("itbank라고 입력하세요 : ");
        String str1 = sc.nextLine();
 
        String str2 = "itbank";
        String str3 = new String("itbank");
        String str4 = "itbank";
 
        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
        System.out.println(str2 == str3);
        System.out.println(str2 == str4);
 
        sc.close();
 
    }
}
cs

자료형 변환

자료형과 자료형 변환

  • new가 붙으면 새로운 자료형이 생성되고, 값이 같아도 가르키는 위치는 다르다는 걸 명시해야한다.

  • 또한 대입 연산 시 좌변과 우변의 자료형은 반드시 같아야 하므로 넘어오는 값을 정확히 이해하고 사용해야한다. 그러나 때론 위의 int와 double 같이 암묵적 형변환이 발생하는 경우도 가끔은 존재한다.
  • 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
    package day01;
     
    public class Ex02 {
        public static void main(String[] args) {
            // 자료형 변환
            
            double pi = 3.14;
            int num = (int) pi;
            // Type mismatch: cannot convert from double to int
            // 대입 연산 시, 좌변과 우변의 자료형은 같아야 한다
            // 일시적으로 우변의 값을 원하는 자료형으로 변환환 이후 대입한다 (casting)
            
            int num2 = 1234;
            double db = num2;
            // num2는 정수이지만, 변수에 옮겨담으면서 암묵적으로 형변환이 발생한다
            // 암묵적 형변환, promotion
            
            System.out.println("pi : " + pi);
            System.out.println("num : " + num);
            
            System.out.println("num2 : " + num2);
            System.out.println("db : " + db);
        
        }
    }
     
    cs

    1. 위의 String 자료형을 비교했을때 str1은 Scanner로 받은 우리가 직접 입력한 문자열 이므로 당연히 같은 해시코드가 나오지 않는다.
    2. str3은 new 새로운 참조 자료형을 불러왔기 때문에 문자열이 같더라도 해시코드가 같을 수가 없다
    3. str2 , str4는 기본 저장 값을 불러왔기 때문에 서로 같다

    연산자

  • %(나머지 연산)으로 인한 뒷자리 분리를 정확히 이해하고 알고리즘에 능숙하게 사용할 수 있게 하자, 또한 다항연산자를 이용한 난수 보정을 기억해뒀다 필요할때 응용하도록 한다.
  • 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
    67
    68
    69
    70
    71
    72
    package day01;
     
    import java.util.Random;
     
    public class Ex03 {
        public static void main(String[] args) {
            // 연산자 (operator) : 데이터를 연산하기 위해 사용하는 기호 혹은 단어
            /*        
             *    단항 연산자 : 하나의 변수 혹은 값에 대하여 연산을 처리한다 (i++)
             *  이항 연산자 : 두개의 값을 이용하여 연산을 수행한다 (num1 + num2)
             *  삼항 연산자 : 세개의 값을 이용하여 연산을 수행 (login ? "로그인" : "로그아웃")
             *    
              *    
              *    산술 연산       : +, -, /, %
              *    증감 연산       : ++, --
              *    대입 연산       : =
              *    복합 대입 연산  : +=, -=, *=, /=, %=
              *    비교 연산       : >, <, >=, <=, ==, !=
             *    논리 연산       : &&, ||, !
             *  비트 연산       : <<, >>, |, &
             *    최우선 연산자   : ., [], instanceof(), ()
             *
             *
             *
             */
            
            
            
            // 산술 연산, 각 항의 자료형에 따라 결과의 자료형이 달라질 수 있다
            // 정수와 정수는 정수가 나온다. 실수와 정수는 실수가 나온다. 실수와 실수는 실수가 나온다.
            double d1 = 100 / 3;            // 정수로 계산하여 몫을 구한다
            double d2 = (double)100 / 3;    // 실수로 계산하여 정확한 값을 구한다
            double d3 = 100 / (double3;
            double d4 = 100 / 3.0;
            
            System.out.println(d1);
            System.out.println(d2);
            System.out.println(d3);
            System.out.println(d4);
            
            // 어떤 수를 0으로 나누면 안된다
            // int test = 3 / 0;    예외 처리문을 반드시 써줘야한다
            
            
            // 나머지 연산의 활용 (%)
            // 1) 홀수 , 짝수 (약수, 배수)를 구분할 때 사용할 수 있다  (알고리즘 문제 풀때)
            
            // 2) 어떤 수를 10의 제곱수로 나누면 0의 개수 만큼 뒷자리를 분리할 수 있다.
            int idNum = 930516;
            int date = idNum % 10;    // 0의 개수만큼(2개) 뒷자리를 분리한다
            idNum /= 100;
            int month = idNum % 100;
            int year = idNum / 100;
            
            System.out.printf("%d년 %d월 %d일\n", year, month, date);
            
            // 3) 난수의 범위를 제한한다
            Random random = new Random();
            
            int r = random.nextInt();
            System.out.println("r : " + r);
            r = r % 10 + 1;                    // 범위 제한
            System.out.println("r : " + r);
            r = r > 0 ? r : -r;                // 부호 보정
            System.out.println("r : " + r);
            
            int r2 = random.nextInt(45+ 1;
            System.out.println("r2 : " + r2);
             
        }
    }
     
    cs



    논리 연산의 완전한 이해

  • and의 동작을 완전히 이해해야한다 조건의 앞이 false면 뒤의 조건은 비교하지도 않고 무조건 false를 출력한다
  • 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
    package day01;
     
    public class Ex04 {
        public static void main(String[] args) {
            // 논리 연산에 의한 연산 미수행
            int n1 = -1, n2 = 0, n3 = 1, n4 = 2;
            
            System.out.printf("%d, %d, %d, %d\n", n1, n2, n3, n4);
        
            boolean flag1 = n1++ + ++n2 < 0 && n3-- * ++n4 == 0;
                                        // and 조건은 앞이 false면 뒤에 조건을 보지도 않고 false를 내보낸다
            //     n1은 후위 연산자라 -1 + n2는 1 false &&     만약 앞이 true였다면  n3은 후위 연산 1 n4는 3  1 * 3 == 0이 아니니 false로 계산 할 수 있겠지만     
            // 결과적으로 flag1 은 false  n1 = 0  n2 = 1 그러나 n3, n4 는 and의 false 조건으로 연산을 수행하지 않는다 n3 = 1  n4 = 2
                            
            System.out.println(flag1);
            System.out.printf("%d, %d, %d, %d\n", n1, n2, n3, n4);
            
            
            // 두 조건 중 첫번째 조건만으로 전체결과가 확정된다면
            // 두번째 조건은 연산을 수행하지 않는다
            
        }
     
    }
     
    cs



    조건식 if

  • 알고리즘 문제를 보았을때 머릿속으로 대충 어떤 방식으로 구현할지 생각을 한 후 프로그램 작성을 시작한다. 생각이 되있지 않다면 문법은 아무짝에도 쓸모가 없다.

  • 컴파일러와 인터프리터의 차이 : 컴파일러 처음부터 끝까지 다 읽어보고 통째로 번역하지만 인 터프리터는 한번 실행에 한 문장씩 번역한다 효율은 좋을지 언정 컴파일러보다 압도적으로 느리다
  • 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
    package day01;
     
    import java.util.Random;
     
    public class Ex05 {
        
        private static int min(int n1, int n2, int n3) {
            if(n1 > n2) n1 = n2;
            if(n1 > n3) n1 = n3;
            
            return n1;
        }
        
        
        public static void main(String[] args) {
            // 제어문 (control statement)
            // 프로그램의 진행 흐름을 제어하는 구문 (진행이 일률적이지 않다)
            
            
            Random random = new Random();
            
            int n1 = random.nextInt(10+ 1;
            int n2 = random.nextInt(10+ 1;
            int n3 = random.nextInt(10+ 1;
            int min;
            
            System.out.printf("%d, %d, %d\n", n1, n2, n3);
            // 아래에 코드를 작성하여 3개의 정수중 가장 작은 수를 화면에 출력하세요
            
            min = min(n1, n2, n3);
            
            System.out.println("min : " + min);
            
            
        }
     
     
     
     
     
    }
     
    cs




    무한 반복을 사용하여 숫자 up!! down!! 간편 게임 만들어보기

  • 필요한 요인을 잘 파악하고 변수를 선언 한 뒤 작성해보자
  • 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
    package day01;
     
    import java.util.Random;
    import java.util.Scanner;
     
    public class Ex06 {
        public static void main(String[] args) {
            // updown game 만들기
            
            // 0) 코드 실행에 필요한 요인을 찾아서 변수로 선언한다
            // 반복 횟수를 체크할 변수도 같이 선언한다 (초기값은 0)
            // 필요하다면, 초기값을 지정한다
            
            // 1) 컴퓨터가 랜덤값을 하나 뽑게 하고, 사용자에게 반복하여 정수를 입력받는다.
            
            // 2) 입력받은 정수가 컴퓨터가 뽑은 값과 일치하는지 판별한다
            // 반복을 수행할 때마다, 시도한 횟수를 1씩 증가시킨다
            // 2-1) 일치하면 반복문을 중단한다
            // 2-2) 정답보다 크면 down을 출력한다
            // 2-3) 정답보다 작으면 up을 출력한다
            
            // 3) 반복이 중단되면 정답을 출력하고 마무리 이후 종료한다
            
            Random random = new Random();
            int com, user, count = 0;
            Scanner sc = new Scanner(System.in);
            com = random.nextInt(100+ 1;
            
     
            
            while(true) {
                System.out.print("정답을 맞춰보세요 (1 ~ 100) : ");
                user = sc.nextInt();
                
                count++;
                if(user == com) break
                else if (user > com) System.out.println("down!!");
                else System.out.println("up!!");
            }
             System.out.printf("정답입니다!! %d회 만에 정답을 맞췄습니다!!\n",count);
            
            
            sc.close();
            
            
            
            
            
            
            
            
            
        }
    }
     
    cs




    퀴즈1. (자료형의 중요성)

  • Python Tutor를 활용하여 검산해보고 어디서 문제가 터졌는지 확인해보자
  • 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
    package day01;
     
    public class Quiz1 {
        public static void main(String[] args) {
            
            // 첫날에 은행에 돈을 10원 준비하여 입금한다
            // 둘째날에는 이전날의 두배인 20원을 준비하여 입금한다
            // 셋째날에는 이전날의 두배인 40원을 준비하여 입금한다
            // 이런 식으로 30일 동안 은행에 돈을 입금하면
            // 30일 이후 은행 계좌에 입금된 금액의 총액은 얼마인가?
            // (단, 은행계좌에는 처음에 돈이 없었던 것으로 가정한다)
            
            long final_Money = 0;
            long save_Money = 10;
            
            for(int i = 1; i <= 30; i++) {
                
     
                final_Money += save_Money;
                save_Money *= 2;
            }
            
            //System.out.println("계좌 총액 : " + final_Money);
            System.out.printf("계좌 총액 : %,d원\n", final_Money);
            
        
            
            
        }
     
    }
     
    cs




    퀴즈2. (조건식의 활용)

  • 문제의 의도를 파악하고, 최종 결과물이 실제 쓰임새와 비교했을때 어색하지 않은지 확인해보고 문제가 있다면 고쳐주자
  • 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 day01;
     
    import java.util.Scanner;
     
    public class Quiz2 {
        public static void main(String[] args) {
            // 버스 한 정거장 이동하는데 약 3분의 시간이 소요된다고 가정한다
            // 사용자에게 이동한 정거장 수를 입력받아서 걸린 시간을 출력하세요
            // 단, 시간이 60분을 초과하면 시간과 분을 나누어서 출력하세요
            
            Scanner sc = new Scanner(System.in);
            
            System.out.print("몇 정거장을 거쳐가나요? : ");
            int station = sc.nextInt();
            int minute = 3;                // 버스 이동 시간
            
            int result_minute = 0;        // 결과 시간, 분
            int result_time = 0;
            
            result_minute = minute * station;    // 총 경과 분 계산 귀찮으니 변수 재활용
        
            if(result_minute / 60 != 0 && result_minute % 60 != 0) { // 시간과 나머지 분 계산 &&는 60분을 나타내기 위함
                result_time = result_minute / 60;
                result_minute %= 60;
                System.out.printf("총 걸린 시간 : %d시간 %d분\n",result_time,result_minute);
            }
            else System.out.printf("총 걸린 시간 : %d분\n",result_minute);
            
            sc.close();
            
        }
    }
     
    cs

    profile
    다들 잘하는데 나만 못해?
    post-custom-banner

    0개의 댓글