학원 11일차 - Java

·2021년 4월 12일
0
post-thumbnail

2021.04.12

달력만들기

  1. 년, 월
  2. 해당 월의 1일 무슨 요일?
    • 특정 날짜의 누적일수
    • 윤년 계산
  3. 월의 마지막 일?
    • 윤년 계산

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문안에 또 다른 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중 for문의 루프 변수 변화값을 볼 수 있는 사례
//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

  • 문자열과 관련된 여러가지 기능을 자바가 제공 (★★★★★)

문자열의 길이

  • 문자열을 구성하는 문자의 개수(글자 수)
  • 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, 서수)
  • 서수를 0부터 센다. > Zero-based Index (자바)
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("종료");
profile
모르면 괴롭고 알면 즐겁다.

0개의 댓글

관련 채용 정보