수업
+13 메소드 세분화 예제
hs_developer
2022. 5. 19. 10:15
변수 설정 (은닉화) → private
*동전
*음료수
ㅡ
메소드
: 동작, 행위 → 사용 가능 → public
*동전 투입시 처리
*잔돈
*시작
ㅡ
생성자 (변수에 대한 초기화) → 필요시에 사용
1. 메소드는 재 사용, 수정 가능, 추가 (유지 보수)
2. 견고한 프로그램 (구조화) → 기능별 분리
3. 반복적 소스 → 제거 가능
ㅡ
웹: 메소드 (7-80% 차지) → 라이브러리 → 라이브러리 변경(오버라이딩)
1. OX 문제
1번째 답 입력(O, X): O
.
.
10번째 답 입력(O, X): X
=== 정답 ===
O O O O X O X O O X
O O O O O O O O X X 점수: 70점
// 난수 발생
static char[] munje()
{
char[] m = new char[10];
for(int i=0; i<m.length; i++)
{
int k=(int)(Math.random()*2); // 0,1
if(k==0)
m[i]='O';
else
m[i]='X';
}
/*for(char c:m)
{
System.out.print(c + " ");
}*/
return m;
}
// 값 입력
static char[] user()
{
char[] u = new char[10]; // 지역 변수
Scanner sc = new Scanner(System.in);
for(int i=0; i<u.length; i++)
{
System.out.print((i+1) + "번째 답 입력(O, X): ");
String a = sc.next();
char answer = a.charAt(0);
u[i] = answer;
}
/*for(char c:u)
{
System.out.print(c + " ");
}*/
return u;
}
// 결과
static int result(char[] d, char[] u)
{
int count = 0;
for(int i=0; i<d.length; i++)
{
if(d[i] == u[i])
count++;
}
System.out.println("=== 정답 ===");
for(char c:d)
{
System.out.print(c + " ");
}
System.out.println();
for(char c:u)
{
System.out.print(c+ " ");
}
return count;
}
// 출력
public static void main(String[] args) {
char[] m = munje();
char[] u = user();
int res = result(m, u);
System.out.println("점수: " + (res*10) + "점");
}
다른 방법_전역변수 이용
1번째 답 입력(O, X):
O
.
.
10번째 답 입력(O, X):
X
O X O O O X X X X X
O O O O O O X X X X
점수: 80점
// 전역변수 → 메소드에서 1개 이상 사용시 설정되는 변수
static char[] m = new char[10];
static char[] u = new char[10];
// 문제 → 랜덤
static void munje()
{
for(int i=0; i<m.length; i++) // 필요할 때마다 m 갖다 쓴다
{
int k = (int)(Math.random()*2);
m[i] = k==0?'O':'X'; // k가 0이면 O, 아니면 X → if-else
}
}
// 사용자 입력 값
static void user()
{
Scanner sc = new Scanner(System.in);
for(int i=0; i<u.length; i++)
{
System.out.println((i+1) + "번째 답 입력(O, X): ");
/*
* String a = sc.next();
* char answer = a.charAt(0);
* ↓
*/
char c = sc.next().charAt(0); // 위 문장을 이렇게 하나로 줄였다
u[i]=c;
}
}
// 비교 → 결과 값 도출
static int result()
{
int count = 0;
for(int i=0; i<m.length; i++)
{
if(m[i] == u[i])
count++;
}
return count;
}
public static void main(String[] args) {
munje();
user();
int count = result();
// 결과 값 출력
for(char mm:m)
System.out.print(mm + " ");
System.out.println();
for(char uu: u)
System.out.print(uu + " ");
System.out.println();
System.out.println("점수: " + (count*10) + "점");
}
달력 만들기
_절차적 언어
달력
*예약 기능에 필요
eg. 호텔, 영화, KTX..
프로젝트
eg. 예약, 추천, 코스, 장바구니(쇼핑몰 *진부..), 도서관, 맛집/레시피, 잡 포털
0. 사용자 입력 → year, month
1. 요일 구하기
: 1년도 1월 1일 ~ 요청한 달의 1일 자 → 총 날 수 구한다
: %7
: Calendar 라이브러리 사용
ㅡ
2. 출력 → 요일부터 1~
연도 입력:
2022
월 입력:
5
2022년 5월
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
달력 만들기 _ 절차적(일반)
public static void main(String[] args) {
// 1. 입력 값 받기
Scanner sc = new Scanner(System.in);
System.out.println("연도 입력: ");
int year = sc.nextInt();
System.out.println("월 입력: ");
int month = sc.nextInt();
// 2. 요일 구하기
// 2-1. 전 년도까지의 총 날 수
int total = (year-1)*365
+(year-1)/4
-(year-1)/100
+(year-1)/400;
// 2-2. 전 달까지의 총 날 수
int[] lastday = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if((year%4==0 && year%100!=0) || (year%400==0))
lastday[1] = 29; // 윤년이면, 2월 29일
else
lastday[1] = 28; // 윤년이 아니면, 2월 28일
for(int i=0; i<month-1; i++)
{
total+=lastday[i]; // 전 달까지의 합
}
// 2-3. +1
total++;
// ㅡㅡㅡㅡ+ %7 → 요일 출력
int week = total%7;
// 3. 달력 출력
System.out.printf("%d년 %d월\n", year, month);
String[] strWeek = {"일", "월", "화", "수", "목", "금", "토"};
for(String s:strWeek)
{
System.out.print(s + "\t");
}
System.out.println("\n");
for(int i=1; i<=lastday[month-1]; i++)
{
if(i==1)
{
for(int j=0; j<week; j++)
{
System.out.print("\t");
}
}
System.out.printf("%2d\t", i);
week++;
if(week>6)
{
week = 0; // 한 줄에 7개 출력하고 밑으로 내려가라
System.out.println("\n");
}
}
}
달력 만들기 _ 매개변수
// 사용자 입력
static int userInput(String msg)
{
Scanner sc = new Scanner(System.in);
System.out.println(msg + " 입력: " );
int data = sc.nextInt();
return data;
}
// 요일 구하기 (0-6)
static int getWeek(int year, int month)
{
int week = 0;
// 처리
int total = (year-1)*365
+(year-1)/4
-(year-1)/100
+(year-1)/400;
// 전 달까지의 총 날 수
int[] lastday = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if((year%4==0 && year%100!=0) || (year%400==0))
lastday[1] = 29; // 윤년이면, 2월 29일
else
lastday[1] = 28; // 윤년이 아니면, 2월 28일
for(int i=0; i<month-1; i++)
{
total+=lastday[i]; // 전 달까지의 합
}
// +1
total++;
// ㅡㅡㅡㅡ+ %7 → 요일 출력
week = total%7;
return week;
}
// 출력
static void print(int year, int month, int week) // 매개변수로 year, month, week 다른 곳에서 가져온다
{
// lastday를 다른 메소드에서 직접 가져온다
int[] lastday = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if((year%4==0 && year%100!=0) || (year%400==0))
lastday[1] = 29; // 윤년이면, 2월 29일
else
lastday[1] = 28; // 윤년이 아니면, 2월 28일 (lastday 여기까지)
System.out.printf("%d년 %d월\n", year, month);
String[] strWeek = {"일", "월", "화", "수", "목", "금", "토"};
for(String s:strWeek)
{
System.out.print(s + "\t");
}
System.out.println("\n");
for(int i=1; i<=lastday[month-1]; i++)
{
if(i==1)
{
for(int j=0; j<week; j++)
{
System.out.print("\t");
}
}
System.out.printf("%2d\t", i);
week++;
if(week>6)
{
week = 0; // 한 줄에 7개 출력하고 밑으로 내려가라
System.out.println("\n");
}
}
}
// 조립
static void process()
{
int year = userInput("년");
int month = userInput("월"); // 반복 제거
int week = getWeek(year, month);
print(year, month, week);
}
public static void main(String[] args) {
process();
}
달력 만들기 _ 전역변수
→ 초반에 변수를 더 저장하기 때문에 넘겨주는 매개변수가 없다
static int year, month, week;
// 중복되는 변수
// 전역 변수 → 자동으로 초기화(0)
static int[] lastday = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static void userInput()
{
Scanner sc = new Scanner(System.in);
System.out.println("연도 입력: " );
year = sc.nextInt();
System.out.println("월 입력: " );
month = sc.nextInt();
}
static void getWeek()
{
int total = (year-1)*365
+(year-1)/4
-(year-1)/100
+(year-1)/400;
// 전 달까지의 총 날 수
if((year%4==0 && year%100!=0) || (year%400==0))
lastday[1] = 29; // 윤년이면, 2월 29일
else
lastday[1] = 28; // 윤년이 아니면, 2월 28일
for(int i=0; i<month-1; i++)
{
total+=lastday[i]; // 전 달까지의 합
}
// +1
total++;
// ㅡㅡㅡㅡ+ %7 → 요일 출력
week = total%7;
}
static void print()
{
System.out.printf("%d년 %d월\n", year, month);
String[] strWeek = {"일", "월", "화", "수", "목", "금", "토"};
for(String s:strWeek)
{
System.out.print(s + "\t");
}
System.out.println("\n");
for(int i=1; i<=lastday[month-1]; i++)
{
if(i==1)
{
for(int j=0; j<week; j++)
{
System.out.print("\t");
}
}
System.out.printf("%2d\t", i);
week++;
if(week>6)
{
week = 0; // 한 줄에 7개 출력하고 밑으로 내려가라
System.out.println("\n");
}
}
}
static void process()
{
userInput();
getWeek();
print();
}
public static void main(String[] args) {
process();
}
데이터 빨리 불러오는 라이브러리 : StringBuffer()
public static void main(String[] args) {
try
{
StringBuffer news = new StringBuffer();
FileReader fr = new FileReader("c:\\JavaDev\\news.txt");
int i=0;
while((i=fr.read())!=-1)
{
news.append(String.valueOf((char)i));
}
System.out.println(news.toString());
}catch(Exception ex) {}
}
1. 숫자야구게임 _ 절차적
1. 난수 발생 (1-9) → 3개 → 중복이 없는 난수 발생 **중요
2. 사용자 입력
3. 비교 (난수/사용자)
4. 힌트 제공
5. 종료 여부 확인
ㅡ
6. 조립
[9, 4, 3]
세 자리 정수 입력:
943
Input Number: 943, Result: 3S-0B
Game Over!!
user = [9, 4, 3]
public static void main(String[] args) {
// 난수 발생 → 중복 없는 난수
int[] com = new int[3];
int su = 0; // 난수 값 받는다
boolean bCheck = false; // 중복 여부 확인
// false: 중복X → com에 저장,
// true: 중복O → 난수 다시 발생
for(int i=0; i<com.length; i++)
{
bCheck = true; // i=0일 때 bCheck=true라 난수 발생
while(bCheck)
{
// 난수 발생
su = (int)(Math.random()*9)+1; // 1-9
bCheck = false;
// 중복 검사
for(int j=0; j<i; j++)
{
if(com[j]==su) // 중복 되었다면
{
bCheck=true;
break;
}
}
}
com[i] = su;
}
System.out.println(Arrays.toString(com));
// 사용자 입력
Scanner sc = new Scanner(System.in);
int[] user = new int[3];
while(true)
{
System.out.println("세 자리 정수 입력: ");
int input = sc.nextInt();
// 오류 체크1 → 3자리를 입력했는지
if(input<100 || input>999)
{
System.out.println("잘못된 입력입니다!!");
// 처음부터 다시 시작
continue; // while의 조건식으로 이동, for은 증가식으로 이동
}
// 단위 나누기
// eg. 567
user[0] = input/100; // 567/100 → 5
user[1] = (input%100)/10; // 567%100 → 67/10 → 6
user[2] = input%10; // 567%10 → 7
// 오류 체크2 → 같은 수 입력하면 안됨
if(user[0]==user[1] || user[1]==user[2] || user[0]==user[2])
{
System.out.println("같은 수는 사용할 수 없습니다!!");
continue;
}
// 오류 체크3 → 0 포함하면 안됨
if(user[0]==0 || user[1]==0 || user[2]==0)
{
System.out.println("0은 사용할 수 없습니다!!");
continue;
}
// 비교
int s=0, b=0;
for(int i=0; i<3; i++) // com[i]와 j[i]에 같은 숫자가 있는지
{
for(int j=0; j<3; j++)
{
if(com[i]==user[j])
{
if(i==j)
s++;
else
b++;
}
}
}
// 힌트
System.out.printf("Input Number: %d, Result: %dS-%dB\n", input, s, b);
// 종료
if(s==3)
{
System.out.println("Game Over!!");
break;
}
}
System.out.println("user = " + Arrays.toString(user));
}
2. 숫자야구게임 _ 메소드화
// 난수 발생
static int[] getRand()
{
int[] com = new int[3];
int su = 0; // 난수 값 받는다
boolean bCheck = false; // 중복 여부 확인
for(int i=0; i<com.length; i++)
{
bCheck = true; // i=0일 때 bCheck=true라 난수 발생
while(bCheck)
{
// 난수 발생
su = (int)(Math.random()*9)+1; // 1-9
bCheck = false;
// 중복 검사
for(int j=0; j<i; j++)
{
if(com[j]==su) // 중복 되었다면
{
bCheck=true;
break;
}
}
}
com[i] = su;
}
System.out.println(Arrays.toString(com));
return com;
}
// 사용자 입력
static int[] Input()
{
Scanner sc = new Scanner(System.in);
int[] user = new int[3];
while(true)
{
System.out.println("세 자리 정수 입력: ");
int input = sc.nextInt();
// 오류 체크1
if(input<100 || input>999)
{
System.out.println("잘못된 입력입니다!!");
continue;
}
user[0] = input/100;
user[1] = (input%100)/10;
user[2] = input%10;
// 오류 체크2
if(user[0]==user[1] || user[1]==user[2] || user[0]==user[2])
{
System.out.println("같은 수는 사용할 수 없습니다!!");
continue;
}
// 오류 체크3
if(user[0]==0 || user[1]==0 || user[2]==0)
{
System.out.println("0은 사용할 수 없습니다!!");
continue;
}
break;
}
return user;
}
static int Compare(int[] com, int[] user)
{
int s=0, b=0;
for(int i=0; i<3; i++) // com[i]와 j[i]에 같은 숫자가 있는지
{
for(int j=0; j<3; j++)
{
if(com[i]==user[j])
{
if(i==j)
s++;
else
b++;
}
}
}
hint(user, s, b);
return s;
}
static void hint(int[] user, int s, int b)
{
System.out.printf("Input Number: %d%d%d, Result: %dS-%dB\n", user[0], user[1], user[2], s, b);
}
static boolean isEnd(int s)
{
if(s==3)
return true;
else
return false;
}
static void process()
{
int[] com = getRand();
while(true)
{
int[] user = Input();
int s = Compare(com, user);
if(isEnd(s))
{
System.out.println("Game Over!!");
break;
}
}
}
public static void main(String[] args) {
process();
}
3. 숫자야구게임 _ 전역변수
내일 추가