만년달력

1. 1년 1월 1일부터 전년도 12월 31일까지의 총 날짜수 구함.
int total = (year-1)*365 + ((year-1)/4 - (year-1)/100 + (year-1)/400);


2. 해당년도 1월 1일부터 해당년도 해당월 1일까지의 총 날짜수 구함.
int[] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for (int a=0; a<month-1; a++) {
total += m[a];
}
//해당월 1일 때문에 +1
total++;
//올해가 윤년이면서 2월 이상인 경우 +1
if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) {
total++;
}


3. 해당년도 해당월의 첫 날(1일)의 요일(일, 월, 화, 수, 목, 금, 토) 구함.
String[] d = {"일", "월", "화", "수", "목", "금", "토"};
int days = total % 7;
System.out.printf("%s요일 %n", d[days]);


4. 콘솔버전에서 날짜를 달력 형태로 출력.






난수 발생

1. 0 부터 1 사이의 무작위 숫자를 난수라고 함.

2. Random 클래스의 nextInt() 메소드를 이용하면 쉽게 난수를 얻을 수 있다.

import java.util.*;
Random rd = new Random();

int val = rd.nextInt(100); //0 보다 크거나 같고 100 보다는 작은 난수

예를 들어, 로또번호는 1~45까지만 존재. rd.nextInt(45) + 1 라고 계산함.
난수를 여러개 발생시키고, 배열에 저장한 다음, 난수 출력. 1~45 범위의 숫자 6개.






문제) 여러개의 난수를 발생시키고, 난수들 중에서 가장 큰 값과 가장 작은 값을 별도 출력. 난수 허용 범위는 1~100. 배열 이용.
실행 예)
난수 갯수(2~20)?5
난수 결과 : 55 9 12 6 90 
가장 큰 값 : 90
가장 작은 값 : 6






중복되지 않은 난수 얻기 (1~100)_방법1
실행 예)
난수 갯수(2~20)? 5
난수 결과 : 3 4 5 10 12


//중복되는 경우

int size=5;
int count=0;
int[] arr = new int[size];
Random rd = new Random();
while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복)
int random = rd.nextInt(100) + 1;
arr[count] = random;
count++;
if (count == size) {
break;
}
}


//중복되지 않은 경우

int size=5;
int count=0;
int[] arr = new int[size];
Random rd = new Random();

while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복)
int random = 0;
boolean check = false;


do {
check = false;
random = rd.nextInt(100) + 1;
for (int a=0; a<count; a++) {
if (arr[a] == random) {
check = true;
}
}
}while(check);  //무한실행 (중복되지 않는 경우만 배열에 저장)


arr[count] = random;
count++;
if (count == size) {
break;
}
}






중복되지 않은 난수 얻기 (1~100)_방법2
실행 예)
난수 갯수(2~20)? 5
난수 결과 : 3 4 5 10 12






문제) 로또 번호를 원하는 장수 만큼 출력.
로또 번호는 1~45 범위의 숫자를 중복되지 않은 상태에서 6개가 되면 1장에 해당.
실행 예)
로또 장수(1~20)?3
번호1 :  1 12 13 34 35 36
번호2 : 12 20 25 30 39 45
번호3 :  1  4  9 20 30 42






문제) 가위,바위,보 게임. 
1~3 사이의 난수가 발생하면 가위, 바위, 보라고 생각하고 사용자가 내는 가위, 바위, 보와 비교해서 승패 결정.
실행 예)
사용자 선택(1:가위, 2:바위, 3:보, -1:종료)?1
사용자:가위, 컴퓨터:바위
결과 : 컴퓨터 승!

사용자 선택(1:가위, 2:바위, 3:보, -1:종료)?2
사용자:바위, 컴퓨터:바위
결과 : 비겼습니다.

사용자 선택(1:가위, 2:바위, 3:보, -1:종료)?-1
사용자 승:0회, 컴퓨터 승:1회





객체 지향 프로그래밍

-> 프로그램의 대상이 되는 데이터를 객체로 취급하는 프로그램 기법.


클래스 
- 객체에 대한 원본 정의서. 
- 데이터형을 정의하는 코드 작성 필요.
- 사용자가 직접 데이터형에 대한 정의를 추가해야 한다. 
- 멤버변수(상태), 메소드(행위)

예를 들어서, 
int 자료형은 상태값은 있지만 행위는 없다.
Integer 클래스는 상태값만 있는게 아니라 행위도 가능하다.

나무(상태) -> 조각가(클래스) -> 조각(행위) -> 작품(결과)

예를 들어, 프린터 클래스를 만든다면
class 프린터 {
//멤버변수
int 잉크 = 100;
int 종이 = 0;

//메소드
void 인쇄(대상) {
if (잉크>0 && 종이>0) {
//대상 출력
잉크--;
종이--;
} else {
//잉크 또는 종이 부족 메시지 출력
}
}
void 종이공급(매수) {
종이 += 매수;
}
}



클래스 정의 기본 형식

1. 클래스명은 첫 글자는 대문자로 표기

2. class 클래스명 { .... }

3. 저장시 물리적 파일명은 클래스명.java

4. public class 클래스명 {   ..    } 에서 public은 접근지정자. 

외부에서 클래스를 참조할 때 접근 가능한 지역 표시.

5. 멤버변수와 메소드는 사용자 정의.

6. 멤버변수와 메소드도 접근 지정자를 별도 지정. 멤버변수는 private, 메소드 public 주로 사용.


멤버변수 정의 예.  private int a = 0;

메소드 정의 예. public void method() { ...  }




산술연산 담당 클래스 연습
-> Calc
-> 숫자 두 개에 대한 덧셈 결과 리턴
실행 예)
숫자1?10
숫자2?20
입력된 숫자 : 10, 20
결과 : 30





산술연산 담당 클래스2 
-> 기존의 Calc 클래스에 메소드 추가를 이용해서 수정 가능.
-> 임의의 정수 두 개를 받아서 n부터 m까지의 합을 계산해서 출력.
실행 예)
숫자1?1
숫자2?10
입력된 숫자: 1, 10
연산 결과: 55



WRITTEN BY
빨강꼬마

,