アカデミー11日目-Java


2021.04.12


カレンダーの作成

  • 年、月
  • 当月の初日は何曜日ですか?
  • 特定日の累計日数
  • 輪年計算
  • 月の最終日?
  • 輪年計算
  • public class Ex23_Calendar {
    
        public static void main(String[] args) throws NumberFormatException, IOException {
            //변수 선언
            //- 보통 변수의 초기값은 해당 변수가 가질 수 없는 값으로 하는 것이 좋다. -> 실수 하더라도 피해가 적거나 발견하기 쉬워서
            //0년은 없기 때문에 0으로, 월은 0부터 시작하기 때문에 -1을 준다.
            int year = 0, month = -1;
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
            System.out.println("달력만들기");
    
            System.out.print("년 : ");
            year = Integer.parseInt(reader.readLine());
    
            System.out.print("월 : ");
            month = Integer.parseInt(reader.readLine());
    
            output(year,month);
    
            //2021년 1~12월 달력 출력 
            //for(int i=1; i<=12; i++) {
            //    output(2021, i);
            //}
            //System.out.println();
    
        } //main
    
    
        public static void output(int year, int month) {
    
            int lastDay = 0; //마지막 일
            int day_of_week = 0; //요일
    
            //해당년월에 마지막일이 몇일로 끝나는지?
            lastDay = getLastDay(year, month);
    
            //해당 월의 1일이 무슨 요일?
            day_of_week = getDayOfWeek(year, month);
    
            // System.out.println(day_of_week);
    
            //달력 출력하기
            System.out.println();
            System.out.println("===================================================");
            System.out.printf("                     %d년 %d월\n", year, month);
            System.out.println("===================================================");
            System.out.println("[일]\t[월]\t[화]\t[수]\t[목]\t[금]\t[토]");
    
            //1일의 요일을 맞추기 위해서 ..
            for(int i=0;i<day_of_week;i++) {
                System.out.print("\t");
            }
    
            //날짜 출력
            for (int i=1; i<=lastDay; i++) {
                System.out.printf("%3d\t", i);
    
                //토요일마다 개행
                //3월(1) -> 6
                //4월(4) -> 3
                //5월(6) -> 1
                //8월(0) -> 7
    
                //고민?????????? 에러.....
                if (i % 7 == (7 - day_of_week)) {
                    System.out.println();
                }
            }
    
        }//output
    
    
        public static int getDayOfWeek(int year, int month) {
            //서기 1년 1월 1일 ~ year년 month월 1일까지 총 며칠이 흘렀는지?
            //누적변수
            int totalDays = 0;
    
            //1.1.1 ~ 2021.4.1
    
            //1.1.1 ~ 2020.12.31 -> 1년 ~ 2020년 x 365
    
            //윤년인지 확인
            for (int i=1; i<year; i++) {//전년도까지
    
                if(isLeafYear(i)) { //i가 윤년인지 검사
                    totalDays+= 366; //윤년일때
                } else {
                    totalDays+= 365; //아닐때
                }
            }
    
            //2021.1.1 ~ 2021.3.31
            for(int i=1; i<month; i++) { //전월까지
    
                totalDays += getLastDay(year, i);
            }
    
            //2021.4.1 ~ 2021.4.1
            totalDays++;
    
            return totalDays % 7; //1(월) ~ 7(일)
        }
    
    
        // getLastDay() 마지막일 구하는 메소드
        public static int getLastDay(int year, int month) {
            switch (month) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    return 31; //return문: 메소드를 종료하는 역할(break랑 유사) + 값 반환
                case 4:
                case 6:
                case 9:
                case 11:
                    return 30;
                case 2:
                    return isLeafYear(year) ? 29 : 28;
                    //default:
                    //return 0;
            }
    
            return 0; //맞는 값을 넣지 않았을 경우 0을 return함.
    
        }//getLastDay
    
    
        //윤년이면 true, 평년이면 false로 반환하는 메소드
        //is~로 시작하는 메소드 : 이거 ~맞아~틀려하는 메소드 
        public static boolean isLeafYear(int year) {
    
            if (year % 4 == 0) {
                if (year % 100 == 0) {
                    if (year % 400 == 0) {
                        return true; //윤년
                    } else {
                        return false; //평년
                    }
                } else {
                    return true; //윤년
                }			
            } else {
                return false; //평년
            }
    
        }
    
    }

    複文


    オーバーラップ

  • for文案もう一つのfor文案
  • //2중 for문
    //- 바깥쪽 회전수 x 안쪽 회전수
    for(int i=0; i<10; i++) { //대회전
        for(int j=0; j<10; j++) { //소회전
            //System.out.println("실행문");  //실행횟수..?-> 100번
            System.out.printf("i: %d, j: %d\n", i, j); //루프변수 확인 -> 
        }
    }
    
    
    //1중 for문 -> 똑같이 100회를 반복하지만 루프변수의 활용이 다르다.
    for(int i=0; i<100; i++) {
    	//System.out.println("실행코드");
    	System.out.printf("i: %d\n", i); //루프변수 확인
    }
  • 私たちの周りに2つの文の循環変数の変化値のケース
  • が見られます.
    //A.시계(시침, 초침)
    for (int i=0; i<24; i++) {  //시침
        for (int j=0; j<60; j++) { //분침 (시침이 1바퀴돌때 분침이 60번 돈다.)
            System.out.printf("%02d:%02d\n", i, j);
        }
    //B. 강의실(6개)+ 학생(30명)	
    // -> 전부 체크
    for(int i=1; i<=6; i++) { //강의실
        for(int j=1; j<=30; j++) { //학생
            System.out.printf("%d강의실 %d번 학생\n", i, j);
        }
    }
    //C. 아파트 110동 -> 15층 -> 층마다 5세대(1호~5호)
    for(int i=1; i<=15; i++) { //층
        for(int j=1; j<=5; j ++) { //세대(호)
            System.out.printf("%d층 %d호 ",i, j);
        }
    }
    // 3중 for문 10x10x10 = 1000회 실행
    //for -> 1~3중 for문을 많이 씀.
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j<10; j++) {
            for (int k = 0; k < 10; k++) {
                System.out.println("실행문");
            }
        }
    }
    //시분초
    for (int i=0; i<24; i++) {  //시침
        for (int j=0; j<60; j++) { //분침
            for(int k=0; k<60; k++) {
                System.out.printf("%02d:%02d:%02d\n", i, j, k);
            }
        }
    }
  • 九九九诀
  • // 2중 for문 -> 구구단(2단~9단)
    for (int dan=2; dan<10; dan++) {
    
        //int dan = 2;
    
        for (int i=1; i<10; i++) {
            System.out.printf("%d x %d = %2d\n", dan, i, dan * i);
        }
        System.out.println();
    }
    //1. 루프변수 제어
    //2. 분기문 개입
    for (int i=0; i<10; i++) {
        for(int j=0; j<10; j++) {
    
            if(i == 5) {
                //자신이 직접 포함된 제어문만 탈출한다.(j for문 탈출)
                break;
                //continue;
            }
    
            System.out.printf("i: %d, j: %d\n", i, j);
        }
    }
  • 星図
  • //별찍기 -> 루프 연습
    for(int i=0; i<10; i++) { //행 출력 (증감)
        for(int j=0; j<10; j++) { //열 출력(증감)
            System.out.print("*");
        }
        System.out.println();
    }
    for(int i=0; i<5; i++) {
        for(int j=0; j<=i; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    for(int i=0; i<5; i++) { 
        for(int j=i; j<5; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    for(int i=0; i<5; i++) { 
        for(int j=0; j<(4-i); j++) {
            System.out.print(" ");
        }
        for(int j=0; j<=i; j++) {
            System.out.print("*");
        }
        System.out.println();
    }

    while

  • for文系油砂
  • 条件による繰返し制御
  • While(조건식){
        실행문;
    }
    //숫자 1~10까지 출력
    //for문
    for(int i=1; i<=10; i++) {
        System.out.println(i);
    }
    System.out.println();
    
    
    //while문
    int n = 1; //초기식
    while(n<=10) { //조건식
        System.out.println(n);
        n++; //증감식
    }
    //누적값 1000이 넘어가면 중단
    //for문
    int sum = 0;
    
    for(int i=0; ; i++) {
        sum+=i;
    
        if(sum>=1000) {
            System.out.println(i);
            break;
        }
    }
    System.out.println(sum);
    
    
    
    //while문
    sum = 0;
    n = 1; //루프 변수 역할
    
    while(true) {
        sum += n;
    
        if(sum >= 1000) {
            break;
        }
        n++;
    }
    System.out.println(sum);
    //while문
    sum = 0;
    n = 1; //루프 변수 역할
    
    while(sum < 1000) {
        sum += n;
        n++;
    }
    System.out.println(sum);
    
    
    
    //for문
    sum = 0;
    
    for(int i=0; sum<=1000; i++) {
        sum+=i;
    }
    System.out.println(sum);

    do while

    //while문
    //선조건 후실행
    while (조건식){
        실행코드;
    }
    
    //do while문
    //선실행 후조건 -> 무조건 1회 실행 보장
    do {
        실행코드;
    } while (조건식);
    int n = 20;
    
    do {
        System.out.println(n);
        n++;
    } while (n <= 10);

    String


    JAvaは
  • 文字列に関する各種機能(★★★)
  • を提供しています

    文字列の長さ

  • 文字列を構成する文字数(文字数)
  • int length()
  • String txt = "";
    txt = "ABCDEF";
    
    System.out.println(txt.length()); //6글자 
    System.out.println("ABCDEF".length()); //6글자 -> 상수도 대입 가능
    
    
    txt = "123 홍길동 !@#";  // -> 숫자, 한글, 영어, 특수문자, 공백 -> 모두 1글자 취급
    System.out.println(txt.length()); //11
    
    
    System.out.println((int)' '); //스페이스(32)
    System.out.println((int)'	'); // 탭(9)
    System.out.println((int)'\t');
    
    
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("문장 입력 : ");
    txt = reader.readLine();
    
    //요구사항) 사용자 입력한 문장이 몇글자로?
    System.out.printf("입력한 문장은 총 %d개의 문자로 구성되어있습니다.\n", txt.length());
  • 文字列の長さで
  • を検証
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    //길이
    // - 유효성 검사
    
    //회원가입 > 이름 입력 > [유효성검사] > DB 저장(10글자제한)
    // -> 20입력 -> 에러 발생
    
    //이름 입력 > 2~5자 이내
    System.out.print("이름 입력: ");
    String name = reader.readLine();
    
    if(name.length() >= 2 && name.length() <= 5) {
        System.out.println("환영합니다.");
    } else {
        System.out.println("이름은 2~5자 이내로 입력하세요.");
    }
    //올바른 이름을 입력할 때까지 위의 작업을 반복해보자.
    String name ="";
    while (true) {
        System.out.println("이름 : ");
        name = reader.readLine();
    
        if(name.length() >= 2 && name.length() <= 5) {
    
            break;
        } else {
            System.out.println("이름은 2~5자 이내로 입력하세요.");
        }
    } //while
    
    System.out.println("회원가입을 진행합니다.");
    

    文字列抽出-char charAt(int index)

  • 必要な位置の文字
  • を抽出する.
  • char charAt(int index)
  • index:抽出する文字の位置(符号、index、シーケンス番号)
  • ゼロから
  • シーケンス数を計算します.>ZeroベースIndex(Java)
  • String txt = "홍길동"; //0,1,2 + 3(문자열의 길이)
    
    char c = txt.charAt(3);
    
    System.out.println(c);
    
    
    //문자열의 모든 문자를 추출하기
    //java.lang.StringIndexOutOfBoundsException 에러 조심.
    
    
    for(int i=1; i<=10; i++) {
        //10회전(빈도 낮음)
    
    }
    
    for (int i=0; i<10; i++) {
        //10회전(빈도 높음★)
    }
    
    
    for(int i=0; i<txt.length(); i++) {
        System.out.println(txt.charAt(i));
    }
    // 유효성 검사
    //- 이름 입력 >  2~5자 이내 + 한글만 입력했는지
    
    //영소문자로만 구성
    String id = "test";
    
    for (int i = 0; i < id.length(); i++) {
    
        char c = id.charAt(i);
        int code = (int) c;
    
        // 유효성 검사 -> 잘못된 경우를 찾는 것이 좋다. -> 코드짜기 더 편함
        if (code < 97 || code > 122) {
            System.out.println("잘못된 문자가 있습니다.");
            break; // 잘못된 문자가 발견되면 더이상 유효성 검사가 필요없다.
        }
    }
    System.out.println("종료");