2016년 1월 27일 수요일

[JAVA 교육] 제어문

[JAVA 교육] 제어문
(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)

  1. 어제의 Review(기본개요)
    1. 자바의 가장 큰 특징
      1. 플랫폼 독립적=Anywhere
        내가 만든 코드가 어떤 플랫폼에서도 실행 된다.
        JMV(Java Virtual Mechine)으로 가능함.
      2. 객체지향(OOP)
      3. 런타임언어
        컴파일 하기는 하지만, 메모리 할당이 컴파일 때가 아니라 실행시에 된다.
    2. Data Type
      1. Primitive Type
        1. 정수 - byte, short, int, long
        2. 부동소수점 - float, double
        3. 논리 - Boolean - true, false
        4. 문자 - char - 0~65535
      2. Reference Type
        1. 배열
          1. Homogeneous Collection = 같은 종류의 데이터를 모아 놓은 것.
          2. immutable = 불변한다.=갯수 확장 X
          3. 선언->생성->초기화 과정으로 사용할 수 있다.
            1. primitive type의 배열의 선언, 생성, 초기화(생성은 reference type과 같다.)
              1. 선언 : 선언된 타입에 따라서 Primitive, Reference 배열로 나뉜다. 이에 따라 선언방법이 다르다.( int[] )
              2. 생성 : (ex. jumsu = new int[10];)
              3. 초기화 : (ex. junsu[0] = 10;)
              4. 선언, 생성, 초기화를 한번에 할 수 있다. (ex. int[] jumsu = {10,20,30,40};)
          4. 차원
            1. 1차원
            2. 2차원
            3. 다차원 
          5. 길이 - .length
        2. enum
        3. 클래스
    3. 개발 환경설정
      1. JDK 설치
      2. Eclipse 설치 (EE용)
    4. 연산자
      1. 3항 - (조건문) ? true : false
      2. 논리 - short circuit(&&, ||), !
      3. 비트
        1. 이동 - <<, >>, >>>
        2. 연산 - &, |, ~, ^
      4. 기본 - 사칙, 할당

  2. 저장에 대한 진화
    1. 배열이용저장
      1. 제어문, 반복문
    2. OOP(객체)
    3. Collection
    4. File 저장
    5. DB 저장
    6. Web interface로 변환

  3. 제어문
    메소드 내에서는 절차식으로 수행되는제 제어문을 이용한 흐름 제어가 가능하다.
    1. 조건문
      조건식 결과에 따라 중괄호 블록을 실행할지 여부를 결정한다.
      1. if - 반드시 조건문이 들어가서 true/fasle로 조건식의 답이 나와야한다.
        1. 단독 if 문
        2. if-else 문
        3. 중첩 if 문
      2. switch
        1. switch(표현식 expression)
          1. 표현식에는 int형으로 묵시적으로 변환되는 값이 와야한다.
          2. 표현식에는 enum
          3. 표현식에는 문자열(JDK 1.7 이상)(String)
    2. 반복문
      1. for - 반복 횟수가 정해져 있을때
        1. for( ; ; )
        2. for( : ) - JAVA5에 추가
      2. while - 반복 횟수가 정해져 있지 않을때
      3. do-while - 무조건 1회 이상 실행 시켜야 할 때
    3. 탈출문
      1. break - 반복문을 종료시킨다.
      2. continue - 1회만 skip. 1회만 건너뛴다.
      3. return - 메소드를 종료. return문도 탈출문의 일부라는걸 알아야한다.
    4. 반복문에 레이블을 가질 수 있다. = 이름을 가질 수 있다.
      break와 continue가 레이블과 같이 사용될 수 있다.
      레이블을 이용한 흐름제어가 가능하다.
  4. Tip
    1. args이용하기
      1. 이클립스에서도 실행시 args에 인자를 주고 싶을때
        1. Run-Run Configuration
        2. 왼쪽에서 'Java Application'에서 실행할 항목 선택.
        3. 오른쪽 상단 'Arguments'탭
        4. 'Program arguments'에서 옆에 'Variable'선택
        5. 'string_prompt' 선택
      2. 이렇게 하면 이클립스에서 실행해도 입력을 받고 실행한다.
    2. switch-case문에서 2개이상의 case에 대해 같은 동작을 수행하고자 할때는 case들을 연달아서 쓰고 동작은 맨 밑의 case에만 구현. 그러면 위의 case들 모두 수행되도 맨 아래 case를 수행하고 break로 나가니깐 정상수행된다.
    3. 임의의 수를 사용하기 위하여 예전에는 Math.random()함수(0~1.0)를 사용하였지만 사용하는데 불편함이 있어서 요즘은 Random클래스를 이용한다.(ex. rand.nextInt(10) )
    4. Stack, Heap
      1. Stack은 FILO(First In Last Out)
      2. Java의 배열은 런타임에 크기가 가변할 수 있기 때문에 Stack에 잡을 수 없다.
      3. Java에서 배열은 Heap에 잡히고, Heap에 잡힌 배열의 주소를 Stack에 잡는다. 그래서 Stack에는 4byte만 소모한다. 정확하게는 Hash코드값이라고 한다.
  5. 실습 코드
    1. IfApplication
      public class IfApplication {
          //main프로그램 실행 진입점(Entry point)
          public static void main(String[] args) {
              //args는 프로그램을 실핼 할 때 입력하는 명령행 인자를 저장
              //Command Line Arguments

              //args에서 하나씩 arg에 담아서 for문 수행
              for(String arg : args) {
                  System.out.println(arg);
              }

              //점수를 입력받아 60점 이상이면 합격
              //그렇지 않으면 불합격을 출력하세요.
              if(args.length != 1) {
                  System.out.println("사용 예 : java IfApplication 70");
                  System.exit(0);
              }
              String data = args[0];
              int jumsu = Integer.parseInt(data);
              if(jumsu>=60) {
                  System.out.println("합격");
              } else {
                  System.out.println("불합격");
              }
          }
      }
    2. ScannerApplication
      import java.util.Scanner;

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

              /*        System.out.print("점수를 입력하세요. : ");        int jumsu = scan.nextInt();        if(jumsu >= 60) {            System.out.println("합격");        } else {            System.out.println("불합격");        }        */

              //1.점수를 입력받아 학점을 출력하는 프로그램을 작성하세요.
              //점수는 0점부터 100점까지 (100점 포함) 입력할 수 있습니다.
              //점수가 90점 이상이면 A
              //점수가 80점 이상이면 B
              //점수가 70점 이상이면 C
              //점수가 60점 이상이면 D
              //점수가 60점보다 작으면 F를 출력하세요.
              //if 블럭, else if 블럭, else 블럭을 이용해서 해결
              /*        System.out.print("점수를 입력하세요. : ");        int jumsu = scan.nextInt();

              if((jumsu > 100) || (jumsu < 0)) {            System.out.println("0부터 100까지 범위에서 입력하세요.");            System.exit(0);        }

              if(jumsu >= 90) {            System.out.println("학점 A");        } else if(jumsu >= 80) {            System.out.println("학점 B");        } else if(jumsu >= 70) {            System.out.println("학점 C");        } else if(jumsu >= 60) {            System.out.println("학점 D");        } else {            System.out.println("학점 F");        }        */


              //205호 앞문에 있는 스위치 값을 저장하는 변수와
              //뒷문에 있는 스위치 값을 저장하는 변수를 선언하고
              //각 스위치 값은 0 또는 1을 저장합니다.
              //0은 on, 1은 off.
              //앞문에서 켜고 뒷 문으로 나가면서 불을 끌 수 있도록 제어문을 작성하세요.
              //Hint:int front = 0;
              //     int rear = 0;
              //     앞 문 스위치를 켤 때는 F 1
              //     앞 문 스위치를 끌 때는 F 0
              //     뒷 문 스위치를 켤 때는 R 1
              //     뒷 문 스위치를 끌 때는 R 0
              //으로 입력합니다.
              //아직 반복문 배우기 전이므로 한번만 실행.
              //조작은 앞문 스위치 한번, 뒷문 스위치 한번.
              int front = 0;
              int rear = 0;
              System.out.print("스위치를 조작하세요 : ");
              if(scan.next().equals("F")) {
                  front = scan.nextInt();
                  if(front == 1) {
                      System.out.println("앞 문의 스위치를 켰습니다.");
                  }
                  if((front^rear)==1){
                      System.out.println("불이 켜졌습니다.");
                  }
              }
              System.out.print("스위치를 조작하세요 : ");
              if(scan.next().equals("R")) {
                  rear = scan.nextInt();
                  if(rear == 1) {
                      System.out.println("뒷 문의 스위치를 켰습니다.");
                  }
                  if((front^rear)==0){
                      System.out.println("불이 꺼졌습니다.");
                  }
              }
          }
      }
    3. LightApplication
      import java.util.Scanner;

      public class LightApplication {
          public static void main(String[] args) {
              int front = 0;
              int rear = 0;

              //데이터 입력
              Scanner scan = new Scanner(System.in);

              while(true) {
                  System.out.print("스위치를 조작하세요 : "); //F 1
                  String door = scan.next();
                  int onoff = scan.nextInt();

                  //스위치 조작
                  if(door.equals("F")) {
                      front = onoff;
                      if(onoff == 1) {
                          System.out.println("앞문 스위치를 켭니다.");
                      } else {
                          System.out.println("앞문 스위치를 끕니다.");
                      }
                  } else if(door.equals("R")) {
                      rear = onoff;
                      if(onoff == 1) {
                          System.out.println("뒷문 스위치를 켭니다.");
                      } else {
                          System.out.println("뒷문 스위치를 끕니다.");
                      }
                  } else {
                      System.out.println("잘못 입력된 명령입니다.");
                  }

                  //전등 켜기 끄기
                  if((front^rear) == 1) {
                      System.out.println("전등을 켭니다.");
                  } else {
                      System.out.println("전등을 끕니다.");
                  }
              }
          }
      }
    4. SwitchApplication
      import java.util.Scanner;

      public class SwitchApplication {
          public static void main(String[] args) {
              Scanner scan = new Scanner(System.in);
              boolean key = true;

              while(key) {
                  //메뉴 안내 출력
                  System.out.println("메뉴를 입력하세요.");
                  System.out.print("(I)nsert,  (U)pdate,  (D)elete,  (S)earch,  (Q)uit : ");

                  //메뉴 입력 받기
                  String menu = scan.next();

                  switch(menu.toUpperCase().charAt(0)) {
                  case 'I':   //'I'는 char(stack에 저장), "I"는 String(heap에 저장)
                  case '':
                      System.out.println(">>데이터 입력을 처리합니다.");
                      break;
                  case 'U':
                  case '':
                      System.out.println(">>데이터 수정을 처리합니다.");
                      break;
                  case 'D':
                  case '':
                      System.out.println(">>데이터 삭제를 처리합니다.");
                      break;
                  case 'S':
                  case '':
                      System.out.println(">>데이터 조회를 처리합니다.");
                      break;
                  case 'Q':
                  case '':
                      System.out.println(">>종료합니다.");
                      key = false;
                      break;
                  default:
                      System.out.println(">>잘못된 입력입니다.");
                  }
                  System.out.println("");
              }
          }
      }
    5. LoopApplication
      public class LoopApplication {
         
       public static void main(String[] args) {
             
       //for(초기값 ; 조건식 ; 증/감문) { 실행문장; }
             
       for(int i=0 ; i<10 ; i++) {
                  System
      .out.println(i);
              }

             
       //for다른형태. for문 괄호 안을 반드시 채울 필요는 없다.
             
       int j = 0;
             
       for( ; j < 10 ; ) {
                  System
      .out.println(j);
                  j
      ++;
              }

             
       int k = 0;
             
       while(k < 10) {
                  System
      .out.println(k);
                  k
      ++;
              }
          }
      }
    6. EchoApplication
      import java.util.Scanner;

      public class EchoApplication {
          public static void main(String[] args) {
              Scanner scan = new Scanner(System.in);
              String message;
              do {
                  message = scan.nextLine();
                  System.out.println(message);
              }while(!message.equals("q"));
              System.out.println("프로그램을 종료합니다.");
          }
      }
    7. BreakApplication
      import java.util.Random;

      public class BreakApplication {
          public static void main(String[] args) {
              for(int i=0; i<10;i++) {
                  if(i==5){
                      //break;    //현재 진행중인 반복문 한개만 탈출
                      continue;   //현재 진행중인 반복 1회만 skip
                  }
                  System.out.println(i);
              }
              System.out.println("--------------");
              outer:      //첫번째 for문에 레이블(이름) 부여
              for(int i=0; i<3; i++) {
                  for(int j=0; j<3; j++) {
                      if(j==1){
                          break outer;    //outer라는 이름을 가진 for문을 빠져나간다.
                                          //단, break를 둘러싸고 있는 반복문만 지정할 수 있다.
                      }
                      System.out.printf("i=%d, j=%d\n",i,j);
                  }
              }

              System.out.println(Math.random());
              int dice = (int)(Math.random()*6 + 1);
              System.out.println(dice);
              Random rand = new Random();
              int num = rand.nextInt(6+ 1;
              System.out.println(num);
          }
      }
    8. ArrayApplication
      public class ArrayApplication {
          public static void main(String[] args) {
              //기본 데이터 타입을 저장하는 배열
              int[] jumsuList = new int[10];
              jumsuList[0= 10;

              for(int i=0 ; i<10 ; i++) {
                  System.out.print(jumsuList[i]+" ");

              }
              System.out.println("");
              System.out.println("--------------");
              for(int jumsu : jumsuList) {        //enhanced for, advanced for
                  System.out.print(jumsu+" ");
              }
              System.out.println("");

              int[] jumsuList2 = {100200300400};
              for(int jumsu : jumsuList2) {
                  System.out.println(jumsu);
              }

              //참조 데이터 타입을 저장하는 배열
              //고객의 이메일 주소를 10개 저장하는 배열을 선언/생성/초기화 하자.
              String[] emailList;                     //선언
              emailList = new String[10];             //생성
              emailList[0= "naraniga@nate.com";     //초기화, 문자열일때만
              emailList[1= new String("walkinpcm@gmail.com");
              //초기화, 문자열이 아닐때는 new를 이용해서 객체로 초기화한다.
              for(String email : emailList) {
                  System.out.println(email);
              }

              //배열의 Immutable 확인
              //새로운 배열을 heap에 생성하여 jumsuList에 할당
              //이전의 배열은 G.C의 대상이 된다.
              jumsuList = new int[20];
              for(int jumsu : jumsuList) {
                  System.out.print(jumsu+" ");
              }
              System.out.println("");

              //다차원 배열(2차원)
              //1학년의 1반부터 5반까지 학생들의 국어점수를 저장하는 배열을 생성하라.
              int[][] korList = new int[5][30];       //1~5반국어점수
              korList[0][0= 30;         //1반 1번 학생의 점수 초기화

              //2차원 배열 선언,생성,초기화 한번에
              int[][] dataList = {{1,2,3},{4,5,6}};   //2행3열[2][3] 배열 만들어짐.

              //반별로 학생수가 다르면?
              int[][] engList = new int[5][]; //열은 나중에 생성가능
              engList[0= new int[29];       //1반 29명
              engList[1= new int[31];       //2반 31명


              //배열 복사
              int[] num1 = {9,8,7,6,5,4,3,2,1};
              int[] num2 = {10,20,30,40,50,60,70,80};
              //결과가10,7,6,5,4,60,70,80
              System.arraycopy(num1, 2, num2, 14);
              for(int n : num2) {
                  System.out.println(n);
              }
          }
      }

댓글 없음:

댓글 쓰기