본문 바로가기
혼자 공부하는 자바

혼자 공부하는 자바 (13강 ~ 19강)

by moca7 2024. 5. 24.

13강. 변수와 시스템 입출력(1) - 모니터로 변수값 출력하기

14강. 변수와 시스템 입출력(2) - 키보드에서 입력된 내용을 변수에 저장하기

15강. 연산자와 연산식

16강. 연산자의 종류(1) - 단항 연산자, 이항 연산자

17강. 연산자의 종류(2) - 이항 연산자, 삼항 연산자

18강. 조건문 - if문, switch문

19강. 반복문 - for문, while문, do-while문

 

 

 

 

13강. 변수와 시스템 입출력(1) 모니터로 변수값 출력하기

 

 

ㅁ 프로그래밍 언어에는 시스템 표준 출력 장치와 표준 입력 장치가 있음.

- 자바에서 표준 출력 장치 모니터를 말하고, 표준 입력 장치키보드를 말함.

 

 

ㅁ println() 메소드

- 괄호 안에 리터럴 넣으면 그대로 출력, 변수 넣으면 저장된 값 출력

 

 

ㅁ 다양한 출력 메소드

- println(내용);          //      괄호 안의 내용을 출력하고 행을 바꿔라

- print(내용);            //       괄호 안의 내용을 출력만 해라

- printf("형식 문자열", 값1, 값2, ...);           //    괄호 안의 첫 번째 문자열 형식대로 내용을 출력해라

 

 

ㅁ printf() 메소드

- 개발자가 원하는 형식화된 문자열(format string) 출력.      //   전체 출력 자리수 설정, 소수 자릿수를 제한 등

- printf("형식 문자열", 값1, 값2, ...);   

 

%     [argument_index$]     [flag]      [width]      [.precision]      conversion

               값의 순번              -, 0    전체자릿수  소수자릿수    변환문자(d, f, s 등)

         

형식 문자열에서 %와 conversion 외에는 모두 생략 가능.

 

System.out.printf("이름: %s", "가나다");           //       이름: 가나다

System.out.printf("나이: %d", 25);                //     나이: 25

 

- 형식 문자열에 포함될 값이 2개 이상인 경우 값의 순번(argument_index$) 표시해야 함.

 

   System.out.printf("이름: %1$s, 나이: %2$d", "가나다", 25);         //        이름: 가나다, 나이: 25

 

값의 순번은 "가나다", 25 등의 값이 몇번째에 들어가야 하는지. 첫번째 값이 가나다고 두번째 값이 25다.

 

 

ㅁ 다양한 형식 문자열

 

 

 

 

14강. 변수와 시스템 입출력(2) 키보드에서 입력된 내용을 변수에 저장하기

 

 

키코드

- 키보드의 키를 숫자로 매핑한 걸 말함. (예를 들면 알파벳 A는 65로 매핑이 되어 있음.)

(키보드에서 알파벳 A를 입력하면 프로그램에서는 65라는 값을 읽을 수 있음.)

 

- 키보드에서 키를 입력할 때 프로그램에서 숫자로 된 키코드를 읽음.

- System.in의 read() 사용

- 얻은 키코드는 대입 연산자를 사용하여 int 변수에 저장

 

 

- A누르고 엔터치면 65, 13, 10이 읽혀짐.

 

 

ㅁ 예제

 

public static void main(String[] args) throws Exception  {



       int keyCode;



       keyCode = System.in.read();       System.out.println("keyCode: " + keyCode);

 

}

 

- read() 메소드를 사용하면 키보드로부터 키코드를 읽는데 에러가 날 수 있음.

그래서 자바에서는 예외처리를 할 수 있도록 throws Exception(예외 처리 코드)을 제공함.

에러( =예외)가 나게 된다면 throws Exception을 붙여주면 그 예외를 그냥 모니터에 출력하고 끝내라는 뜻.

 

- 이걸 실행하면 콘솔창에 커서가 깜박 거리고 빨간색 정지 버튼이 활성화 됨. 

프로그램이 실행중이라는 뜻.

프로그램이 아직 종료되지 않고 키보드로부터 입력이 될 때까지 기다리는 중.

 

- [실행결과]        //        A 입력 후 엔터.

키코드: 65

 

 

ㅁ 예제 변형

 

public static void main(String[] args) throws Exception {



       int keyCode;



       keyCode = System.in.read();

 

       System.out.println("keyCode: " + keyCode);



       keyCode = System.in.read();

 

       System.out.println("keyCode: " + keyCode);

 

 

- [실행결과]         //         (A 입력 후 엔터)  키코드: 65  키코드: 13 

 

- keyCode를 한번 더 복사해서 추가하면 65, 13, 10이 나옴.

 

 

ㅁ 예제2

 

public static void main(String[] args) throws Exception {



       int keyCode;



       while(true) {

 

           keyCode = System.in.read();

 

           System.out.println("keyCode: " + keyCode);     }}

 

- 이건 A누르고 엔터치면 65, 13, 10 나오고 프로그램이 안꺼진 상태로 계속 있음. 다음 입력값을 계속 기다림.

- 프로그램을 종료하고 싶다면 빨간버튼을 강제로 눌러야 함. 

 

 

ㅁ 예제2 변형

 

public static void main(String[] args) throws Exception {



       int keyCode;



       while(true) {

 

           keyCode = System.in.read();

 

           System.out.println("keyCode: " + keyCode);

 

           if(keyCode == 81)

 

               { break; }       }

 

       System.out.println("종료");

 

}

 

- Q를 입력하면 종료되게끔 만든 버전.

- [실행결과]          //          Q 입력시

keyCode: 81
종료

 

 

ㅁ System.in.read()의 단점

- 2개 이상 키가 조합된 한글 읽을 수 없음.        //     '한' (ㅎ, ㅏ, ㄴ의 키 입력 3번이 읽어나는데 read()는 한번에 읽지 못함.)

- 키보드로 입력된 내용을 통문자열로 읽을 수 없음.          //     "우리나라", "ABCD"

 

- System.in.read()를 사용한 위의 예제에서 'ㄱ'을 입력시 아래와 같이 출력됨.

 

키코드: 164

 

키코드: 161

 

키코드: 13

 

키코드: 10

 

이유는 한글은 2바이트로 이루어진 유니코드인데, System.in.read() 메서드는 유니코드 문자의 각 바이트를 개별적으로 읽기 때문에, 한글 문자 'ㄱ'의 경우 두 개의 바이트 값을 읽게 됩니다.

 

 

Scanner로 해결

- 자바가 제공하는 Scanner 클래스를 이용하면 입력된 통문자열을 읽을 수 있음.   //    한글도 읽을 수 있고.

 

 

 

- new라는 객체 생성 연산자로 객체를 만듦.

- Scanner 클래스는 사용자 입력을 받기 위해 사용됩니다.

nextLine() 메소드는 사용자가 엔터를 입력할 때까지의 모든 문자열을 읽어들입니다.

 

 

ㅁ 기본 타입의 값 비교와 문자열 비교

 

(1) 기본 타입               //         byte, short, int, long + char + float, double + boolean

 

- 기본 타입의 값 비교는 ==를 사용

 

      int x = 6;      boolean resujlt = (x == 6);    //    true 

 

 

(2) 문자열

 

- 문자열의 비교는 equals() 메소드 사용

 

       boolean result = InputData.eqauls("비교문자열");

                               저장된 문자열

 

String a = "java";

boolean r1 = a.equals("java");            //   true

boolean r2 = a.equals("Java");           //   false

 

 

ㅁ Scanner 예제

 

import java.util.Scanner ;

 

public class ScannerExample {

         public static void main(String[] args) {

 

                  Scanner a = new Scanner(System.in);

                  String inputData;

 

                  while(true)

                  {

                            inputData = a.nextLine();

                            System.out.println("입력된 문자열: \"" + inputData + "\"");       

 

                            if( inputData.equals("Q") )

                                   { break; }     

                    }

 

                  System.out.println("종료");

         }

}

 

- Scanner를 쓸 때는 꼭 import java.util.Scanner;를 써줘야 함.

 

 

ㅁ Scanner 클래스의 생성자       

-

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#Scanner-java.io.File-

 

public Scanner(InputStream source)

 

- 매개변수 source에 입력값이 들어감. 

 

 

ㅁ Scanner.nextLine() 메서드

-

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#Scanner-java.io.File-

 

public String nextLine()                    //       String 반환

 

 

현재 행을 지나서 이 스캐너를 전진시키고 건너뛴 입력을 반환합니다.

이 메서드는 끝 부분의 줄 구분 기호를 제외하고 현재 줄의 나머지 부분을 반환합니다.

위치는 다음 줄의 시작 부분으로 설정됩니다.

 

 

예외:

NoSuchElementException - 행이 발견되지 않은 경우

IllegalStateException - 이 스캐너가 닫힌 경우

 

 

 

 

15강. 연산자와 연산식

 

 

프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(Operation)이라고 한다.

- 연산자(Operator): 연산에 사용되는 표시나 기호

- 피연산자(Operand): 연산자와 함께 연산되는 데이터

- 연산식(Expression): 연산자와 피연산자를 사용하여 연산 과정을 기술한 것.

 

 

ㅁ 연산식은 반드시 하나의 값을 산출한다.

- 그래서 하나의 값이 오는 모든 자리에 연산식을 사용할 수 있다.

 

     int result = x + y;

     boolean result = (x + y) < 5;

 

 

복합적으로 구성된 연산식의 연산

- 우선순위에 따라 수행된다.

- 우선순위가 같은 연산자는 왼쪽에서 오른쪽 방향으로 수행된다.

단, 대입 연산자반대.          //         a = b = c = 5;

 

- 단항 -> 이항 -> 삼항

- 산술 -> 비교 -> 논리 -> 대입

 

- 괄호를 사용해 먼저 처리할 연산식을 묶을 수 있기 때문에 연산자의 우선순위를 외울 필요는 없다. 

 

 

 

 

16강. 연산자의 종류(1) 단항 연산자, 이항 연산자

 

 

ㅁ 연산자의 종류

 

 

- 자바에서 삼항 연산자는 조건 연산자밖에 없음.

 

 

ㅁ 논리 부정 연산자

- ! boolean형 피연산자        //       true면 false로, false면 true로.     

- not이라고 읽음.

 

 

ㅁ 산술 연산자

 

 

- 두 피연산자 중 하나가 long 타입이면 long 타입으로 변환.

- int와 double, float과 double이 연산되면 int와 float이 double형이 됨.

 

 

ㅁ 리터럴과의 산술연산, 변수와의 산술연산의 차이점.

 

(1) char c1 = 'A' + 1;

(2) char c2 = 'A';

(3) char c3 = c2 + 1;        //     컴파일 에러

 

- (1) 자바 컴파일러는 리터럴이 두 개 있는걸 확인하고 연산을 함. 

바이트 코드에는 66이 들어감. ('A' + 1이 아니라)

 

- (3) 그런데 이와 같이 변수가 산술연산에 사용되면 자바 컴파일러가 연산하지 않음. 

c2 + 1 이대로 바이트코드를 만들고, 나중에 JVM이 c2 + 1 연산을 함.

 

JVM이 이 연산을 하게 되면 두 피연산자가 int 타입 이하일 경우에는 int 타입으로 변환을 해서 연산을 하고,

연산의 결과도 int가 됨. 

 

int가 char보다 크므로 이대로 넣을 수 없어서 컴파일 에러가 발생함.

(c3을 int형으로 바꾸든지 아니면 (char)로 명시적 형변환)

 

 

 

 

17강. 연산자의 종류(2) 이항 연산자, 삼항 연산자

 

ㅁ 비교 연산자

- 동등 비교 연산자( ==, != )는 모든 타입에 사용 가능.

- 크기 비교 연산자( <, <=, >, >= )는 boolean 외 모든 기본 타입에 사용 가능.

 

ㅁ 논리 연산자

- boolean 타입에만 사용 가능

- &와 |비트 연산자로도 쓰이고, 논리 연산자로도 쓰인다.

short-circuit evaluation를 하지 않는게 &&, ||와의 차이점이다. 

 

 

 

 

18강. 조건문 - if문, switch문

 

 

 

ㅁ if문을 사용한 임의의 주사위 눈을 출력하는 예제

 

- Math.random() 메소드는 0 이상 1 미만의 임의의 실수를 리턴을 함.

 

- Math.random() * 6          //           0.0  <=  ~  <  6.0

 

- (int) (Math.random() * 6)         //        0, 1, 2, 3, 4, 5

 

- (int) (Math.random() * 6) + 1         //       1, 2, 3, 4, 5, 6

 

- System.out.println((int) (Math.random() * 6) + 1 );       //     1, 2, 3, 4, 5, 6이 랜덤으로 출력됨.

 

 

-

public static void main(String[] args) {

        int num = (int) (Math.random() * 6) + 1 ;

        if(num == 1)
             { System.out.println( "1번 입니다.");  }
        else if(num == 2)
             { System.out.println( "2번 입니다.");  }
        else if(num == 3)
             { System.out.println( "3번 입니다.");  }
        else if(num == 4)
             { System.out.println( "4번 입니다.");  }
        else if(num == 5)
             { System.out.println( "5번 입니다.");  }
        else
             { System.out.println( "6번 입니다.");  }
}

 

 

ㅁswitch문을 사용한 임의의 주사위 눈을 출력하는 예제

 

public static void main(String[] args) {

        int num = (int) (Math.random() * 6) + 1 ;

        switch(num) {

             case 1:
                  { System.out.println( "1번 입니다."); break; }
             case 2:
                  { System.out.println( "2번 입니다."); break; }
             case 3:
                  { System.out.println( "3번 입니다."); break; }
             case 4:
                  { System.out.println( "4번 입니다."); break; }
             case 5:
                  { System.out.println( "5번 입니다."); break; }
             case 6:                                                                        //     "case 6:" 대신 "default:"도 가능.
                  { System.out.println( "6번 입니다."); break; }         //      "break;" 없어도 됨.

        }
}

 

 

ㅁ switch(n)

- n에는 int형의 값 뿐아니라 byte, short + char + enum + String 의 값들도 올 수 있다.       //       모두 정수타입으로 취급.

- long, float, double, boolean은 올 수 없다.

 

 

char grade = 'B';

 

switch(grade) {

 

     case 'A': 

         System.out.println(grade + " 학점입니다.");

         break;

     case 'B':

         System.out.println(grade + " 학점입니다.");

         break;

     default:

         System.out.println("C학점 이하입니다.");

}

 

 

-

String position = "과장";

 

switch(position) {

 

     case "부장": 

         System.out.println(" 부장입니다. ");

         break;

     case "과장":

         System.out.println(" 과장입니다.");

         break;

     default:

         System.out.println("부장도 과장도 아닙니다.");

}

 

 

- case:default: 뒤에 실행문이 여러개 와도 중괄호를 넣지 않을 수 있다.

 

 

 

 

19강. 반복문 - for문, while문, do-while문

 

 

ㅁ 반복문에는 for문, while문, do-while문이 있다. 

 

 

ㅁ 반복문이 중첩되어 있는 경우 모든 반복문을 빠져나가는 방법

 

(1) break 문을 사용한 방법

 

- break 문은 가장 안쪽에 있는 반복문 하나만 종료합니다. 

- 중첩된 반복문을 한꺼번에 종료하려면 레이블(label)을 사용할 수 있습니다.

- 레이블을 사용한 break 레이블을 사용하면 특정 레이블이 붙은 반복문을 종료할 수 있습니다.

- 레이블은 식별자 뒤에 콜론(:)을 붙여 선언합니다. 

 

 

public class BreakWithLabel {

      public static void main(String[] args) {

 

            outerLoop:                 //          레이블 선언

                   for (int i = 0; i < 5; i++) { 

                         for (int j = 0; j < 5; j++) {

                                 if (i * j > 6)

                                      {   break outerLoop;     // outerLoop 레이블이 붙은 반복문 종료  }  

                                System.out.println("i: " + i + ", j: " + j);

                         }

                   }

 

            System.out.println("반복문 종료");

       }

}

 

 

(2) return 문을 사용한 방법

 

- 메서드 내에서 중첩된 반복문을 모두 빠져나가고자 할 때 return 문을 사용할 수 있습니다.

- return 문을 사용하면 현재 메서드의 실행을 종료합니다.

 

public class ReturnExample { 

      public static void main(String[] args) {

 

               for (int i = 0; i < 5; i++) {

                      for (int j = 0; j < 5; j++) {

                              if (i * j > 6) { return; // 메서드 종료 }

                              System.out.println("i: " + i + ", j: " + j);

                              }

                }

 

               System.out.println("이 문장은 출력되지 않습니다.");

       }

}

 

 

(3) 플래그 변수를 사용하는 방법

 

- 플래그 변수를 사용하여 조건이 충족되었음을 표시하고, 각 반복문에서 플래그 변수를 확인하여 반복문을 종료하는 방법도 있습니다.

 

public class FlagExample { 

       public static void main(String[] args) {

 

               boolean flag = false;

               for (int i = 0; i < 5 && !flag; i++) {

                        for (int j = 0; j < 5; j++) {

                               if (i * j > 6) { flag = true; break; // 내부 반복문 종료 }

                               System.out.println("i: " + i + ", j: " + j);

                        }

                }

 

               System.out.println("반복문 종료");

        }

}

 

 

ㅁ continue문

- for, while, do-while문에서만 사용.

- for문의 증감식이나 while, do-while문의 조건식으로 이동.          //     그 아래 실행문들을 실행하지 않음. 

- 주로 if 문과 함께 사용.