수업

+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
20225월
일	월	화	수	목	금	토	

 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. 숫자야구게임 _ 전역변수

 

 

내일 추가