열심히 끝까지

디바이스 융합 자바(Java) day02 - 디버깅표,연산자,Scanner,유효성검사,제어문,교환알고리즘 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day02 - 디버깅표,연산자,Scanner,유효성검사,제어문,교환알고리즘

노유림 2022. 6. 8. 17:46

6/7 추가문제
       - 사이 띄우기
a       b       c
--------------------
5
4       4       0
5       3
                 1

1) 연산자의 개수파악
2) 연산자들의 우선순위를 파악

--a;
int b = a;

a - b => ?
int c = ?
a++
b--;

존재하는 연산자
 대입연산자, 후위증감연산자, 산술연산자, 후위증감연산자

>> 산술연산자 > 대입연산자 > 후위증감연산자 > 후위증감연산자 순으로 진행

 

package class01;

public class Test01 {

       public static void main(String[] args) {
              // static 객체와 무관
              int num = 10;
              num++; // num += 1; num = num + 1; ++num;
              num--; // num -= 1; num = num - 1; --num;

              int a = 5;
              int b = --a;
              int c = a++ - b--;

              System.out.println(a);
              System.out.println(b);
              System.out.println("c : " + c--);
              System.out.println("c : " + c);
       }

}

------------------------------


콘솔은 이제 다른 곳에서 쓰지 못하는 곳도 있음 그때 사용하는 것이  "디버깅표"


디버깅표
10 != 11 !(T) F



package class01;

public class Test02 {
       public static void main(String[] args) {
              // 주석 -> 가독성 => "유지보수"
              // 변수 3요소
              // : 공간 / 자료형 / 공간의 이름(식별자)
              // : 아스키코드, 형변환(명시적 형변환, 자동형변환)
              // 연산자 -> 우선순위 => "디버깅표"

              // 비교연산자(질문) : 크기비교연산자 (컴퓨터는 답변!)
              // "같다." ==
              // "같지 않다." != 
              // 등호는 크기비교연산자 뒤에 붙여서 사용
              System.out.println("비교연산자");
              System.out.println(10 != 11);  // 이산수학

              // 논리연산자
              // and ~~이고, ~~이면서 동시에, ~~하고 &&
              // or ~~이거나, 혹은, 또는 || (파이프라인)
              // not 부정 ! 

              // 스도코딩
              // 한국어 코딩
              System.out.println("논리연산자");
              System.out.println(10 <= 15 && 15 < 50);
              // System.out.println(15 <= x < 50); 사용 불가
              System.out.println(15 <= 5 || 5 < 50);

       }
}

 

- 주석을 달아 가독성을 높이고, "유지보수"를 가능하게 한다.

- 변수의 3요소 : 공간, 자료형, 공간의 이름(식별자)

- 형변환 종류 : 명시적 형변환(강제 형변환), 자동 형변환

- 연산자의 우선순위를 표로 나타내는 방법 >> 디버깅표

- 비교연산자(크기비교연산자) : ==(같다), !=(같지 않다)

       >> 등호는 크기비교연산자 뒤에 붙여서 사용

- 논리연산자 : && (and(~이고, ~~이면서 동시에, ~~하고)), || (or(~~이거나, 혹은, 또는),

                       ! (not(부정))

-조건연산자(삼항연산자)

                     : int num = 조건식 ? T : F;

                     : 조건식이 참이면 T, 거짓이면 F


------------------------------------
int a = 8, b = 15, c = 3;
a랑 b랑 비교 -> a
a랑 c랑 비교 -> c

package class02;

public class Test03 {
       public static void main(String[] args) {
              // 조건 연산자(삼항 연산자)
              // int num = 조건식 ? T : F;
              // int res = 10 < 5 ? 1 : 2;
              // System.out.println(res);

              // int a = 123, b = 60;
              // int max = a > b ? a: b;
              // System.out.println(a + "와 " + b + "중에서 더 큰 값은 " + max + "입니다.");

              // a, b, c 라는 정수 3개가 존재합니다.
              // a, b, c 값은 각자 다 다릅니다.
              // a, b, c 중에서 가장 작은 값은 __입니다.
              int a = 8, b = 15, c = 3;
              // int min = a < b ? a : b; // a와 b를 비교
              // min = min < c ? min : c; // 19번 라인의 결과와 c를 비교
              int min = a<b ? a<c ? a:c : b<c?b:c;
              System.out.println(a + ", " + b + ", " + c + "중에서 가장 작은 값은 " + min + "입니다.");
       }
}

int a < b? a , c : b , c

----------------------------------

 


[입력]
입력할 때 객체를 사용
Scanner               // 사람의 입력값을 전달하기 위한 객체

int a = 10; // 변수 초기화 (int a <= 변수 선언)
double b = 3.14;
String str = new String("apple"); 
// String 이름의 틀로 a라는 객체가 갖고싶다. 새로운 String 안에 재료를 넣는다. 
// String이란 붕어빵 틀로 a라는 붕어빵을 만들어 먹고싶다. 
// 그러면 (재료)가 들어간 String틀로 만든 빵을 새로 만듬
// new String("apple") 은 함수

// String이라는 클래스가 있습니다.
// 이를 통해 str이라는 이름의 객체를 생성하겠습니다.
// new 클래스(재료) << 행위를 통해서 객체를 생성할 수 있다!(rule)
String c = "apple"; // 객체라는건 클래스를 통해 생성되는구나!
String str = new String("apple"); // 기본적으로 제공되지만 Scanner는 제공되지 않는다.

a, b -> 변수
str, c -> 객체

 

-------------------------
블로그)
: 앞으로 만나는 Exception은 캡쳐해서 등록해 놓고 나중에 절대 띄우지 않겠다는 마인드로 할 것


Exception 분석
   1. 몇번 라인?
           Test04.java13
   2. 무슨 종류? 
           java.util.InputMismatchException

InputMismatchException : 지정한 변수 타입과 다른 타입을 입력받았을 때 발생하는 예외
출처: https://ande226.tistory.com/24 [안디스토리:티스토리] 

----------------------


1. 사용자의 액션
          -> 편의성 고려
2. 유효성 검사(예외처리)


---------

package class02;

import java.util.Scanner; // 자동 import

public class Test04 {
       public static void main(String[] args) {
              // [입력]
              Scanner scanner = new Scanner(System.in);
              // scanner 자리는 식별자이기 때문에 이름은 아무거나 넣어도 상관 없음
              // 사람의 입력값을 전달하기 위한 객체
              // ctrl + shift + O

              // ☆ 유효성 검사(예외처리) -> 총으로 아군을 쏘면 체력이 닳지 않게 코딩을 해야 함
              // System.out.print("정수입력 : "); // UI(넓은 의미로) 사용자의 편의성을 고려하자!
              // int num = scanner.nextInt();
              // System.out.print("실수입력 : ");
              // double d = scanner.nextDouble();

              // System.out.println("프로그램 종료 : " + num + " |  " + d);

              // □(빨간색) : 강제종료버튼
              System.out.print("정수 1 입력 : ");
              int a = scanner.nextInt(); // 정수 1 입력
              System.out.print("정수 2 입력 : ");
              int b = scanner.nextInt(); // 정수 2 입력

              System.out.println(a + "와 " + b + "중에서 더 큰 값은 " + (a > b ? a : b) + "입니다.");

       }
}

-------------
정수 1 입력 : 9
정수 2 입력 : 10
 // 두개의 값을 서로 다르게 입력해주세요!!
9와 10중에서 더 큰 값은 10입니다.

package class02;

import java.util.Scanner;

public class Test05 {
       public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);

              System.out.println("정수1 입력 : ");
              int n1 = scanner.nextInt();
              System.out.println("정수2 입력 : ");
              int n2 = scanner.nextInt();
              int res = n1 > n2 ? n1 : n2;

              System.out.println(n1 + "와 " + n2 + "중에서 더 큰 값은 " + res + "입니다.");
       }
}

---------------
package class02;

import java.util.Scanner;

public class Test05 {
       public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);

              /*
              System.out.print("정수1 입력 : ");
              int n1 = scanner.nextInt();
              System.out.print("정수2 입력 : ");
              int n2 = scanner.nextInt();
              int res = n1 > n2 ? n1 : n2;

              System.out.println(n1 + "와 " + n2 + "중에서 더 큰 값은 " + res + "입니다.");
              */

              System.out.print("정수 입력 : ");
              int num = scanner.nextInt();

              String res = num%2 == 0? "짝수" : "홀수";
              System.out.println(num + "는 " + res + "입니다.");
       }
}

---------------------
정수 1 : 50
정수 2 : 5      // 정수1 >= 정수 2
5은(는) 50의 약수입니다.

정수 1 : 50
정수 2 : 3
3은(는) 50의 약수가 아닙니다.
package class02;

import java.util.Scanner;

public class Test05 {
       public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);

              /*
              System.out.print("정수1 입력 : ");
              int n1 = scanner.nextInt();
              System.out.print("정수2 입력 : ");
              int n2 = scanner.nextInt();
              int res = n1 > n2 ? n1 : n2;

              System.out.println(n1 + "와 " + n2 + "중에서 더 큰 값은 " + res + "입니다.");
              */

              /*
              System.out.print("정수 입력 : ");
              int num = scanner.nextInt();

              String res = num%2 == 0? "짝수" : "홀수";
              System.out.println(num + "는 " + res + "입니다.");
              */

              System.out.print("정수 1 : ");
              int num1 = scanner.nextInt();
              System.out.print("정수 2(정수 1보다 작은 숫자) : ");
              int num2 = scanner.nextInt();

              String ans = num1%num2 == 0 ? "약수입니다." : "약수가 아닙니다.";
              System.out.println(num2 + "은(는) " + num1 + "의 " + ans );

       }
}

------------------------------------------------

 

빨간줄 : 문법상의 오류 -> 반드시 해결해야만 수행 가능!
노란줄 : 문제가 되지는 않으나 더 나은 방법이 있다고 컴퓨터가 제시해 줌
제어문
종류 : 조건문, 반복문

1. 조건문
   >> 할 때도 있고, 안할 때도 있을 때 사용
   : if, switch(switch로 가능한 것을 if도 다 가능하기 때문에 switch는 여기서 다루지 않을 것)
   : if는 괄호는 가지고 있지만 함수는 아님, 제어문!
   : 중괄호를 꼭 써야 하는 이유! - 가독성을 위해서! 
   if(조건식) {  
            조건식이 참일 때 수행할 문장;
   }
   : 조건식을 충족하지 못하면 중괄호를 통과하지 못하고
     조건식을 충족하면 중괄호를 통과한다.
   : else는 가장 가까운 if문을 짝꿍으로 생각한다.



디버깅표
(num이 10보다 작을 때)
num   num>10    num<=10
------------------------------
  5          F
                              T

20line
21line
22line
23line
->26line - 27line - 28line...
------------------------------------------
(num이 10보다 클 때)
num   num>10    num<=10
------------------------------
  11          T
                              F

20line
21line
22line
23line -> 24, 25
26
-> 29
------------------------------------------
else 시 디버깅표
(num이 10보다 작을 때)
num   num>10     
------------------------------
  5         F

20
21
22
23 -> 26, 27, 28
-----------------------------------------
else 시 디버깅표
(num이 10보다 클 때)
num   num>10     
------------------------------
 11         T

20
21
22-> 24, 25 -> 29


---------------------------------------
package class04;

import java.util.Scanner;

public class Test06 {
       public static void main(String[] args) {

              // 제어문
              // 종류 : 조건문, 반복문
              // 1. 조건문
              //  -> 할 때도 있고, 안할 때도 있을 때 사용
              //  : if, switch(이 수업에서는 switch 제외하고 수업)
              if(10 > 5) {
                     System.out.println("확"); 
              }
              // 빨간줄 : 문법상의 오류 -> 반드시 해결해야만 수행 가능!
              // 노란줄 : 문제는 없다(하지만 더 나은 방법이 있다는 의미) -> 더 나은 방향을 제시해 줌
              System.out.println("인");

              Scanner sc = new Scanner(System.in);
              System.out.print("정수 입력 : ");
              int num = sc.nextInt();
              if(num > 10) {
                     System.out.println("큰 수입니다.");
              }
              else { // 자신과 가장 가까운 if문을 짝꿍으로 생각
                     System.out.println("작은 수입니다.");
              }

              // 2. 반복문
              //  -> 2회 이상, N번, N회, 연속적으로, 계속, 무한하게, 여러번,...
              //  : while, for
       }
}
---------------------------------------
문제
1. 정수 1: 11
   정수 2: 12

11이(가) 크다.
12이(가) 크다.
두수가 같다.

2. 정수 입력
양수입니다.
음수입니다.
0입니다.

3. 정수 입력
홀수입니다.
짝수입니다.

--------------------------------------
나의 방법
              // 문제 1
              System.out.print("정수 1 : "); // 정수 1 입력
              int n1 = sc.nextInt();
              System.out.print("정수 2 : "); // 정수 2 입력
              int n2 = sc.nextInt();

              if(n1 > n2) { // 정수 1이 크다면
                     System.out.println(n1 + "이(가) 크다.");
              }else if(n1 < n2) { // 정수 2가 크다면
                     System.out.println(n2 + "이(가) 크다.");
              }else { // 둘이 같으면
                     System.out.println("두 수가 같다.");
              }
              System.out.println();

              // 문제 2
              System.out.print("정수 입력 : ");
              int number = sc.nextInt(); // 정수 입력

              if(number > 0) { // 0보다 크면
                     System.out.println(number + "은(는) 양수입니다.");
              }else if(number < 0) { // 0보다 작으면
                     System.out.println(number + "은(는) 음수입니다.");
              }else { // 0이면
                     System.out.println(number + "은(는) 0입니다.");
              }
              System.out.println();

              // 문제 3
              System.out.print("정수 입력 : ");
              int number1 = sc.nextInt();
              if(number1 % 2 == 0) {
                     System.out.println("짝수입니다.");
              }else {
                     System.out.println("홀수입니다.");
              }
--------------------------------------
강사님의 방법
              // 문제 1
              System.out.print("정수 1 : ");
              int num1 = sc.nextInt();
              System.out.print("정수 1 : ");
              int num2 = sc.nextInt();

              if(num1 != num2) {
                     // 크기 비교를 해야된다면의 경우
                     // int num = num1 > num2 ? num1 : num2;
                     // System.out.println(num + "이(가) 크다.");

                     // 중첩 if (가독성이 떨어진다.)
                     if(num1 > num2) {
                            System.out.println(num1 + "이(가) 크다.");
                     }else {
                            System.out.println(num2 + "이(가) 크다.");
                     }
              }
              else {
                     System.out.println("두 수가 같다.");
              }
              System.out.println();
--------------
              System.out.print("정수 1 : ");
              int num1 = sc.nextInt();
              System.out.print("정수 2 : ");
              int num2 = sc.nextInt();

              if(num1 > num2) {
                     System.out.println(num1);
              }else if(num1 < num2) {
                     System.out.println(num2);
              }
              else {
                     System.out.println("두 수가 같다.");
              }
              System.out.println();
-----------------------------------
              //문제 2
              System.out.print("정수 1 : ");
              int num1 = sc.nextInt();

              if(num1 > 0) {
                     System.out.println(num1);
              }else if(num1 < 0) {
                     System.out.println("음수");
              }
              else {
                     System.out.println("0");
              }
              System.out.println();

----------------------------------
              // 문제 3
              // 0도 추가하여 쓰기
              System.out.print("정수 : ");
              int num = sc.nextInt();

              if(num == 0) {
                     System.out.println("0입니다.");
              }else if(num%2 != 0) {
                     System.out.println("홀수");
              }
              else {
                     System.out.println("짝수");
              }
              System.out.println();

--------------------------------------
문제
1. 정수1: 100
   정수2: 50
 50은 100의 약수입니다.

   정수1: 50
   정수2: 100
 50은 100의 약수입니다.

  정수1: 11
  정수2: 2
 2은 11의 약수가아닙니다.

  정수1: 2
  정수2: 11
 2은 11의 약수가아닙니다.

2. 나이입력: 8
 무료입니다.

1이상~12이하,60이상~200이하
 무료입니다.
13이상~20미만
 1000원입니다.
20이상~60미만
 2000원입니다.
0이하,200초과
 잘못된 입력입니다.

-----------------------------------
나의 방법
              //다른 문제1
              System.out.print("정수 1 : ");
              int num1 = sc.nextInt();
              System.out.print("정수 2 : ");
              int num2 = sc.nextInt();

              if(num1 >= num2) {
                     String res = num1 % num2 == 0 ? "약수입니다." : "약수가 아닙니다.";
                     System.out.println(num2 + "은(는)" + num1 + "의 " + res);
              }else{
                     String res = num2 % num1 == 0 ? "약수입니다." : "약수가 아닙니다.";
                     System.out.println(num1 + "은(는)" + num2 + "의 " + res);
              }

              // 다른 문제2
              System.out.print("나이 입력 : ");
              int age = sc.nextInt();
              if((age>=1 && age<=12) || (age>=60 && age<=200)) {
                     System.out.println("무료입니다.");
              }else if(age >= 13 && age < 20) {
                     System.out.println("1000원입니다.");
              }else if(age >= 20 && age < 60) {
                     System.out.println("2000원입니다.");
              }else {
                     System.out.println("잘못된 입력입니다.");
              }
--------------------------------------
강사님(다른 학생들) 방법
package class05;

import java.util.Scanner;

public class Test08 {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);
              /*
              // 다른 문제1
              System.out.print("정수1 : ");
              int a = sc.nextInt();
              System.out.print("정수2 : ");
              int b = sc.nextInt();

              // [교환 알고리즘]
              // -> "임시저장변수" tmp
              if(a>b) {
                     int tmp = a;
                     a = b;
                     b = tmp;
              }
              // : a가 b보다 작다는 것이 보장될 수 있도록!
              String msg = b%2==0?"약수입니다." : "약수가 아닙니다.";
              System.out.println(a + "은(는) " + b + "의 " + msg );
              */

              // 다른 문제2
              System.out.print("나이 입력 : ");
              int age = sc.nextInt();

              // 유효성 검사
              // 0이하 200초과는 잘못된 입력이다. 
              // "유지보수" 200에서 500으로 쉽게 바꿀 수 있는 것(바꿀 수 밖에 없을 때) 
              if(age <= 0 || age > 200) { // 잘못된 입력 범위
                     System.out.println("잘못된 입력입니다.");
              }
              else {
                     // 가격을 측정할 수 있는 구간
                     if(age <= 12 || age >= 60) {
                            System.out.println("무료입니다.");
                     }
                     else if(age < 20) {
                            System.out.println("1000원입니다.");
                     }
                     else {
                            System.out.println("2000원입니다.");
                     }
              }

       }
}


--------------------------------------


[교환 알고리즘]
   -> "임시저장변수" tmp

a, b = b, a;
a=b;
b=a;
이렇게는 안되는 이유를 디버깅으로!
a          b
----------------
100     50
50       50
교환이 되지 않음!!

>> 이렇게 교환해야함
int tmp = a;
a = b;
b = tmp;
디버깅
a         b         tmp
---------------------
100     50        100
50       100  

    

-------------------------------------------
package class05;

import java.util.Scanner;

public class Test09 {
       public static void main(String[] args) {
              // 연산자 우선순위 -> 디버깅표
              // 비교, 논리, 조건(삼항) 연산자

              // 입력 Scanner

              // ☆ 유효성 검사 : 사용자 편의성을 고려하며 코딩한다!

              // 제어문 : 조건문/반복문
              // [교환 알고리즘] : 임시저장변수 tmp

              // 1~12 사이의 정수 :
              // 12 초과 숫자 -> 잘못된 입력입니다.
              // 9월은 가울입니다.
              // 3~5, 6~8, 9~11, 12~2
              Scanner sc = new Scanner(System.in);
              System.out.print("1~12사이의 정수 입력 : ");
              int month = sc.nextInt();

              if(month < 1 || month > 12) {
                     System.out.println("잘못된 입력입니다.");
              }
              else {
                     if(month <= 2 || month >= 12) {
                            System.out.println(month + "월은 겨울입니다.");
                     }
                     else if(month <= 5) {
                            System.out.println(month + "월은 봄입니다.");
                     }
                     else if(month <= 8) {
                            System.out.println(month + "월은 여름입니다.");
                     }
                     else {
                            System.out.println(month + "월은 가을입니다.");
                     }
              }
       }
}

--------------------------------------------

package class07;

import java.util.Scanner;

public class Test10 {
       public static void main(String[] args) {
              // 문자열 입력
              // -> 심화내용
              // => 웹 개발에 꼭 필요한 것은 아님
              // 디버깅표 작성, 주석달기, 우선순위 따지는 것은 무조건 제대로 익혀놓을 것

              Scanner sc = new Scanner(System.in);

              System.out.print("문자열입력 : ");
              String str = sc.nextLine();
              // next() >> 띄어쓰기를 구분할 수 없음!
              // nextLine() >> 띄어쓰기를 구분함(한 줄 단위로 진행)
              System.out.print("정수입력 : ");
              int i = sc.nextInt();

              System.out.println("문자열 : " + str);
              System.out.println("정수 : " + i);

       }
}
(문자열에 서울시 관악구 봉천동을 입력 시 발생)


17번 라인의 입력값 타입이 올바르지 않아서 발생한 문제!

----------------------------------------------------
package class07;

import java.util.Scanner;

public class Test10 {
       public static void main(String[] args) {
              // 문자열 입력
              // -> 심화내용
              // => 웹 개발에 꼭 필요한 것은 아님
              // 디버깅표 작성, 주석달기, 우선순위 따지는 것은 무조건 제대로 익혀놓을 것

              Scanner sc = new Scanner(System.in);

              System.out.print("정수입력 : ");
              int i = sc.nextInt();
              sc.nextLine(); // 버퍼공간에 남아있는 Enter값을 제거하는 용도
              System.out.print("문자열입력 : ");
              String str = sc.nextLine();
              // 정수 입력할 때 들어간 엔터가 버퍼에 남아있는 상태에서
              // 그 엔터를 보고 nextLine은 엔터를 찾아가는 애로
              // 버퍼에 남아있는 엔터를 보고 공백 입력받은 줄 알고 입력받지 않고 넘긴다.

              System.out.println("문자열 : " + str);
              System.out.println("정수 : " + i);

       }
}
---------------------------------
문제1
세개 중에 하나 빨강/노랑/초록
 -> 알 수 없는 단어에요!
 빨강 - 정지
 노랑 - 주의
 초록 - 출발!

package class07;

import java.util.Scanner;

public class Test11 {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);

              System.out.print("색 입력(빨강|노랑|초록) : ");
              String color = sc.next();


              if(color.equals("빨강")) {
                     System.out.println("정지");
              }
              else if(color.equals("노랑")) {
                     System.out.println("주의");
              }
              else if(color.equals("초록")) {
                     System.out.println("출발!");
              }
              else {
                     System.out.println("?????");
              }
       }
}

☆String은 원시타입이 아닙니다!
클래스입니다!
-> 객체 != 변수

☆연산자들의 대상
 : 변수
---------------------------------
1. 문제
1시간 넘어가면 문제가 존재..... 잘한다 하면 30분 미만(문제 30분 이상)
과제문제)
시간 입력 : 4 // 1~12시
분 입력 : 50 // 0~59분
/// 잘못된 입력 -> 종료

4시 50분의 1시간 20분 전 시간은
3시 30분 입니다.

3시 10분의 1시간 20분 전 시간은
1시 50분 입니다.

1시 10분의 1시간 20분 전 시간은
11시 50분 입니다.

풀어본 결과 6/9일자에 해설 올라감
package class08;

import java.util.Scanner;

public class Test12 {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);

              System.out.print("시간을 입력(1~12시) : ");
              int hour = sc.nextInt();

              if(hour < 1 || hour > 12 ){
                     System.out.println("종료");
              }
              else {
                     System.out.print("분을 입력(0~59분) : ");
                     int minute = sc.nextInt();

                     if( minute < 0 || minute > 59) {
                     System.out.println("종료");
                     }
                     else {

                            int time = (hour * 60) + minute;

                            if(time < 80) {
                                   time += 720;
                            }

                            int reshour = (time - 80)/60;
                            int resminute = (time - 80)%60;

                            System.out.println(hour + "시 " + minute + "분의 1시간 20분 전 시간은 " 

                                                          + reshour + "시 " + resminute + "분입니다.");
                     }
              }
       }
}