이안의 평일코딩

JAVA의 정석 17일차 - 메소드 응용 본문

Back-end/Java

JAVA의 정석 17일차 - 메소드 응용

이안92 2020. 7. 7. 12:49
반응형

2020.07.07(화)

 

1. 메소드 응용

 메소드 : 한가지 기능만 수행 => 다음에 다시 사용할 수 있게 만든다

            목적

              => 재사용

              => 반복 제거

형식)

        반환형이 없는 경우 : void

        매개변수가 없는 경우 (매개변수 => 주로 사용자가 요청한 값)

        반환형이 존재 => 사용자가 요청한 내용의 결과값 => 반드시 한개만 존재

                                여러개일 경우 : 배열, 클래스 이용 

        매개변수가 존재 => 아이디 중복체크 (=> id), 우편번호 검색(동, 길)

                                   로그인 (id, password)

        반환형(리턴형)  메소드명(매개변수, 매개변수..) {

          종료 => return => 

        }

 

        void process() {

              if(key==ENTER) {

                  return; // 강제로 종료

                  System.out.println(); ==> 오류

              }

             동작

             System.out.println("aaaa");

             return; => return 문장 밑에는 소스 코딩을 할 수 없다 //제어break; continue; return;

        }

 

        int add(int a, int b) {

            return a+b;

        }

       호출

       int a = add(10,20)

 

       void add(int a, int b)

       add(10,20)

 

       호출할 때마다 => 메소드 처음부터 return까지 수행 => 다시 호출한 위치로 돌아온다

 

메소드 용도

 (1) 기능, 입력, 출력

 (2) 조립

 (3) 시작점 => main()

 

2. 연습문제

 1) 사용자가 년도를 입력하면 윤년 여부 확인

    // 다음에 다시 사용할 수 있게. => modify 수정이 가능(오버라이딩), new 추가가 가능(오버로딩)

     (사이트 => 로그인 회원가입 게시판 공지사항)

import java.util.*;
public class 자바메소드 {
	// 사용자 입력 => 년도
	// 윤년여부를 확인하는 기능 => 재사용
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("년도 입력>");
		int year = scan.nextInt();
		
		if((year%4==0 && year%100!=0) || (year%400==0)) {
			System.out.println(year+"년도는 윤년입니다");
		}
		else {
			System.out.println(year+"년도는 윤년이 아닙니다");
		}

	}
}
import java.util.*;
public class 자바메소드 {
	// 사용자 입력 => 년도
	static int userInput() {
		Scanner scan = new Scanner(System.in);
		System.out.print("년도 입력>");
		int year = scan.nextInt();
		return year;
	}
	// 윤년여부를 확인하는 기능
	static boolean isYear(int year) {
		boolean bCheck=false;
		if((year%4==0 && year%100!=0) || (year%400==0)) {
			bCheck=true;
		}
		else {
			bCheck=false;
		}
		return bCheck;
	}
	public static void main(String[] args) {
		int year=userInput();
		boolean bCheck=isYear(year);
		if(bCheck==true)
			System.out.println(year+"년도는 윤년입니다");
		else
			System.out.println(year+"년도는 윤년이 아닙니다");
	}
}

 

 2) 국어 영어 수학 => 총점,평균,학점

import java.util.*;
public class 자바메소드2 {
	// 입력
	static int userInput(String subject) {
		Scanner scan = new Scanner(System.in);
		System.out.print(subject+" 점수입력:");
		int score=scan.nextInt();
		return score;
	}
	static int total(int kor, int eng, int math) {
		return kor+eng+math;
	}
	//평균
	static void avg(int total) { //메소드안에서 출력하려면 void 받아서 출력하려면 데이터형
		System.out.printf("평균:%,2f\n",total/3.0);
	}
	static char hakjum(int total) {
		char hakjum = 'A';
		switch(total/30) {
		case 10:
		case 9:
			hakjum = 'A';
			break;
		case 8:
			hakjum = 'B';
			break;
		case 7:
			hakjum = 'C';
			break;
		case 6:
			hakjum = 'D';
			break;
		default:
			hakjum = 'F';
			break;
		}
		return hakjum;
	}
	public static void main(String[] args) {
		int kor=userInput("국어");
		int eng=userInput("영어");
		int math=userInput("수학");
		int total=total(kor, eng, math); // 변수명, 메소드
		char hakjum=hakjum(total);
		
		// 출력
		System.out.println("국어점수:"+kor);
		System.out.println("영어점수:"+eng);
		System.out.println("수학점수:"+math);
		System.out.println("총점:"+total);
		avg(total);
		System.out.println("학점:"+hakjum);
	}

}

 

 3) 사용자 정수입력 => 짝수, 홀수

    메소드 => 결과값 => 리턴값

                   메소드 자체에서 출력 => 리턴값(X) void

    1) => 입력

    2) => 입력 처리

    3) => 결과 출력

import java.util.*;
public class 자바메소드3 {
	static int userInput() {
		Scanner scan = new Scanner(System.in);
		System.out.print("정수입력>");
		int num = scan.nextInt();
		
		return num;
	}
	// 연산자+제어문=메소드
	// 클래스 : 변수+메소드
	static void process(int num) {
		if(num%2==0)
			System.out.println(num+"는(은) 짝수입니다");
		else
			System.out.println(num+"는(은) 홀수입니다");
	}
	public static void main(String[] args) {
		// 사용자 입력값을 받는다
		int num = userInput();
		process(num);
	}

}

 

4) 영화를 선택

  => 현재상영영화

       개봉예정영화

       박스오피스(주간)

       박스오피스(월간)

       박스오피스(연간)

//<div class="wrap_movie">
//<div class="info_tit">
//<em class="ico_movie ico_15rating">15세이상관람가</em>
//<a href="/moviedb/main?movieId=134684" class="name_movie"
// data-tiara-layer="moviename"
// data-tiara-ordnum="1" data-tiara-id="134684" data-tiara-type="movie">#살아있다</a>
//</div>
//								
//<span class="info_grade">
//<a href="/moviedb/grade?movieId=134684&type=netizen" class="link_grade"
// data-tiara-layer="point" data-tiara-ordnum="1">
//<span class="txt_grade">네티즌</span>
//<span class="wrap_grade grade_netizen">
//<span class="ico_star ico_14star">등급</span>
//<span class="num_grade num_05">05</span>
//<span class="num_grade grade_dot">.</span>
//<span class="num_grade num_00">00</span>
//</span>
//</a>							
//</span>
//<span class="info_state">																							
//20.06.24 개봉
//<span class="txt_dot"></span>
//예매율 57.07%
//</span>

import java.util.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class 자바메소드4 {
	static int menuSelect() {
		Scanner scan = new Scanner(System.in);
		System.out.print("메뉴를 선택하세요(1~5):");
		int no=scan.nextInt();
		return no;
	}
	static void menu() {
		System.out.println("===== Menu =====");
		System.out.println("1.현재상영영화");
		System.out.println("2.개봉예정영화");
		System.out.println("3.박스오피스(주간)");
		System.out.println("4.박스오피스(월간)");
		System.out.println("5.박스오피스(연간)");
		System.out.println("6.종료");
		System.out.println("================");
	}
	static void movieData(int no) throws Exception {
		String[] site = {
				"https://movie.daum.net/premovie/released",
				"https://movie.daum.net/premovie/scheduled",
				"https://movie.daum.net/boxoffice/weekly",
				"https://movie.daum.net/boxoffice/monthly",
				"https://movie.daum.net/boxoffice/yearly"
		};
		String[] subject = {
				"현재상영영화",
				"개봉예정영화",
				"박스오피스(주간)",
				"박스오피스(월간)",
				"박스오피스(연간)"
		};
		//출력
		System.out.println("★★★★★ "+subject[no-1]+" ★★★★★");
		Document doc=Jsoup.connect(site[no-1]).get();
		Elements title=doc.select("div.info_tit a.name_movie");
		for(int i=0; i<title.size(); i++) {
			System.out.println((i+1)+"."+title.get(i).text());
		}
	}
	public static void main(String[] args) throws Exception{
		while(true) {
			menu();
			int no = menuSelect();
			if(no==6) {
				System.out.println("프로그램 종료");
				break;
			}
			movieData(no);
		}

	}

}

 

 5) 글 읽어오기

import java.io.FileReader;

public class 자바메소드5 {
	public static void main(String[] args) throws Exception{
		FileReader fr = new FileReader("C:\\javaDev\\news.txt");
		//String news="";
		StringBuffer sb = new StringBuffer(); //String Buffer가 더 빠르다
		int i=0;
		while((i=fr.read())!=-1) { //문장의 끝이 아닐 때 까지 읽어옴
			sb.append(String.valueOf((char)i));
			//news+=String.valueOf((char)i);
		}
		fr.close();
		System.out.println(sb);
	}
}

 

 6) 글자 갯수 가장 긴 것 찾기

public class 자바메소드5 {
	static String[] title = { //전역변수 : Class 블록안에 선언 vs 지역변수 : Method 안
			"#살아있다",
			"결백",
			"온워드:단 하루의 기적",
			"소리꾼",
			"인베이전 2020",
			"다크 나이트",
			"위대한 쇼맨",
			"트로이 디렉터스 컷",
			"야구소녀",
			"아무튼, 아담"
	};
	static void titleMax() {
		int max=0;
		for(int i=0; i<title.length; i++) {
			if(max<title[i].length())
				max=title[i].length();
		}
		
		for(int i=0; i<title.length; i++) {
			if(max==title[i].length())
				System.out.println(title[i]);
		}
	}
	static void titleMin() {
		int min=100;
		for(int i=0; i<title.length; i++) {
			if(min>title[i].length())
				min=title[i].length();
		}
		
		for(int i=0; i<title.length; i++) {
			if(min==title[i].length())
				System.out.println(title[i]);
		}
	}
	static void process() {
		System.out.println("가장 긴 영화명:");
		titleMax();
		System.out.println("가장 짧은 영화명:");
		titleMin();
	}
	
	public static void main(String[] args) throws Exception{
		process();
	}
}

 

 

 7) 달력만들기_절차적언어

     순차적인 코딩 => 구조화 코딩(메소드)

     ========= 기능별로 묶어서 사용이 가능 (재사용, 코드의 중복을 제거)

                                                              ===== 수정, 추가 편리하게 만드는 프로그램

 (1) 사용자로부터 년도, 월을 받는다

 (2) 요일을 구한다 ==> 세분화

 (3) 해당요일부터 달력을 출력한다

import java.util.*;
public class 달력만들기_절차적언어 {
	//static void process(int year, int month) { //매개변수 이용해서 지역변수 사용 
		//System.out.println(year+"년도 "+month+"월");
	//}
	public static void main(String[] args) {
		//1. 사용자 입력값 받기
		Scanner scan = new Scanner(System.in);
		System.out.print("년도 입력:");
		// 입력된 데이터를 메모리에 저장
		int year = scan.nextInt();
		System.out.print("월 입력:");
		int month = scan.nextInt();
		
		//저장된 year, month => main이 끝날때까지 사용이 가능
		//지역변수를 다른 메소드에서 사용할때는 => 매개변수를 이용해서 전송
		
		//2.요일 구하기
		// 1) 전년도까지의 총날 수 (year-1) 2020 => 1.1.1~2019.12.31
		int total = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400;
		// 2) 전달까지의 총 날수
		//   3월 => total+31+28
		//   4월 => total+31+28+31
		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;
		else
			lastDay[1] = 28;
		
		for(int i=0; i<month-1; i++) {
			total+=lastDay[i];
		}
		// 요청한 달의 1일자의 요일 구하기
		total++; //1일자부터 요일 확인
		
		// 요일 구하기
		int week = total%7;
		
		// 1년도 1월 1일 => 월
		
		// 출력(달력)
		System.out.println(year+"년도 "+month+"월");
		String[] strWeek = {"일", "월", "화", "수", "목", "금", "토"};
		for(int i=0; i<7; i++) {
			System.out.print(strWeek[i]+"\t");
		}
		System.out.println();
		
		// 달력 출력
		for(int i=1; i<=lastDay[month-1]; i++) {
			//공백
			if(i==1) {
				for(int j=0; j<week; j++) {
					System.out.print("\t");
				}
			}
			// 1부터 출력
			System.out.printf("%2d\t",i);
			
			// 요일 증가
			week++;
			if(week>6) {
				week=0;
				System.out.println();
			}
		}
	}
}

 7-2)메소드 사용

import java.util.*;
public class 달력만들기_메소드사용 {
	static int userInput(String msg) {
		Scanner scan = new Scanner(System.in);
		System.out.print(msg+" 입력:");
		int num = scan.nextInt();
		return num;
	}
	// 요일 구하기
	static int getWeek(int year, int month) { //매개변수로 가져오기
		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;
		else
			lastDay[1] = 28;
		for(int i=0; i<month-1; i++) {
			total+=lastDay[i];
		}
		total++;
		int week = total%7;
		return week;
	}
	// 달력 출력
	static void dataPrint(int year, int month, int week) { //매개변수로 가져오기
		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;
		else
			lastDay[1] = 28;
		
		System.out.println(year+"년도 "+month+"월");
		String[] strWeek = {"일", "월", "화", "수", "목", "금", "토"};
		for(int i=0; i<7; i++) {
			System.out.print(strWeek[i]+"\t");
		}
		System.out.println();
		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;
				System.out.println();
			}
		}
	}
	// 메소드 여러개 조립하는 메소드
	static void process() {
		int year=userInput("년도");
		int month=userInput("월");
		
		// 요일
		int week=getWeek(year, month);
		
		// 출력
		dataPrint(year, month, week);
	}
	public static void main(String[] args) {
		process();
	}
}

 

 7-3)메소드 정리

import java.util.*;
public class 달력만들기_메소드사용 {
	
    static int userInput(String msg)
    {
    	Scanner scan=new Scanner(System.in);
    	System.out.print(msg+" 입력:");
    	int num=scan.nextInt();
    	return num;
    }
    // 2. 요일 구하기 
    static int getWeek(int year,int month)
    {
    	// 1) 전년도까지의 총날 수 (year-1) 2020 => 1.1.1~2019.12.31
    			int total=(year-1)*365
    					 +(year-1)/4
    					 -(year-1)/100
    					 +(year-1)/400;
    			// 2) 전달까지의 총 날수 
    			// 3 ==> total+31+28
    			// 4 ==> total+31+28+31
    			
    			
    			for(int i=1;i<=month-1;i++)
    			{
    				total+=lastDay(year, i);
    			}
    			
    			// 요청한 달의 1일자의 요일 구하기
    			total++;
    			
    			// 요일 구하기 
    			int week=total%7;
    			
    			return week;
    }
    // 각달의 마지막날짜 알려주는 기능 
    static int lastDay(int year,int month)
    {
    	int[] lastDay={
				31,28,31,30,31,30,
				31,31,30,31,30,31
		};
    	if(isYear(year))
    			lastDay[1]=29;
    	else
    		    lastDay[1]=28;
    	
    	return lastDay[month-1];
    }
    
    // 반복(X) => 재사용성 
    static boolean isYear(int year)
    {
    	boolean bCheck=false;
    	
    	if((year%4==0 && year%100!=0)||(year%400==0))
    		 bCheck=true;
    	
    	return bCheck;
    }
    // 달력 출력 
    static void datePrint(int year,int month,int week)
    {
    	
    	int last=lastDay(year, month);
    	
    	String[] strWeek= {"일","월","화","수","목","금","토"};
		for(int i=0;i<7;i++)
		{
			System.out.print(strWeek[i]+"\t");
		}
    	System.out.println();
    	for(int i=1;i<=last;i++)
		{
			// 공백 
			if(i==1)
			{
				for(int j=0;j<week;j++)
				{
					System.out.print("\t");
				}
			}
			// 1부터 출력 
			System.out.printf("%2d\t",i);
			// 요일 증가
			week++;
			if(week>6)
			{
				week=0;
				System.out.println();
			}
		}
    	
    	
    }
    // 메소드 여러개 조립하는 메소드
    static void process()
    {
    	int year=userInput("년도");
    	int month=userInput("월");
    	
    	// 요일 
    	int week=getWeek(year, month);
    	// 출력 
    	datePrint(year, month, week);
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        process();
	}

}

 

 7-4)메소드 재사용

import java.util.*;
public class 메소드_재사용 {
	public static void main(String[] args) {
		// 달력만들기_메소드사용.process();
		int year = 달력만들기_메소드사용.userInput("년도");
		boolean bCheck = 달력만들기_메소드사용.isYear(year);
		if(bCheck==true)
			System.out.println("윤년이다");
		else
			System.out.println("윤년이 아니다");
	}
}

 

 8) 야구게임_절차적언어

1. 3의 정수를 난수발생 (중복없이) => 1~9사이

2. 사용자 입력

3. 비교

4. 힌트

5. 정답일때 종료

============ 조립 process() 메인에서 출력

import java.util.*;
public class 야구게임_절차적언어 {

	public static void main(String[] args) {
		//1. 중복없는 난수 ==> 3개
		int[] com = new int[3];
		// 1~9 => 111
		int su=0; // 난수를 저장하는 변수
		boolean bCheck=false; // 중복여부 확인 (중복 : true, 중복(X) : false)
		for(int i=0; i<3; i++) {
			bCheck=true;
			while(bCheck) {
				// 난수 발생
				su = (int)(Math.random()*9+1); //1~9
				bCheck = false;
				// while 종료 조건
				// 체크
				for(int j=0; j<i; j++) {
					if(com[j]==su) {
						bCheck=true;
						break;
					} //else를 bCheck=false를 걸면 안됨. 기본값 false로주고 해야됨.
				}
			}
			com[i]=su;
			//System.out.print(com[i]+"\t");
		}
		//System.out.println();
		// 2. 사용자 입력
		int[] user = new int[3];
		
		// 입력
		Scanner scan = new Scanner(System.in);
		while(true) {
		System.out.print("세자리 정수를 입력:");
		int input = scan.nextInt();
		
		// 첫번째 오류 처리 => 세자리 정수가 입력이 안됐다면
		if(input<100 || input>999) {
			System.out.println("잘못된 입력입니다");
			// 처음으로 이동
			continue;
		}
		// 자르기 예)369
		user[0]=input/100; // 369/100 => 3
		user[1]=(input%100)/10; // 369%100 => 69/10 => 6
		user[2]=input%10; // => 369%10 => 9
		
		// 두번째 오류
		if(user[0]==user[1]||user[1]==user[2]||user[0]==user[2]) {
			System.out.println("중복된 정수는 사용 할 수 없습니다");
			continue;
		}
		
		// 세번째 오류
		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++) {
			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;
		}
		}
	}
}

 

 8-2) 메소드사용

/*
1. 3의 정수를 난수발생 (중복없이) => 1~9사이
2. 사용자 입력
3. 비교
4. 힌트
5. 정답일때 종료
*/
import java.util.*;
public class 야구게임_메소드사용2 {
	// 3의 정수 난수발생
	static int[] getRand() {
		int[] com = new int[3];
		int su=0;
		boolean bCheck=false;
		for(int i=0; i<3; i++) {
			bCheck=true;
			while(bCheck) {
				su = (int)(Math.random()*9+1);
				bCheck = false;
				for(int j=0; j<i; j++) {
					if(com[j]==su) {
						bCheck=true;
						break;
					}
				}
			}
			com[i]=su;
		}
		return com;
	}
	
	// 사용자 입력
	static int[] userInput() {
		int[] user = new int[3];
		
		Scanner scan = new Scanner(System.in);
		while(true) {
		System.out.print("세자리 정수를 입력:");
		int input = scan.nextInt();
		
		if(input<100 || input>999) {
			System.out.println("잘못된 입력입니다");
			continue;
		}

		user[0]=input/100;
		user[1]=(input%100)/10;
		user[2]=input%10;
		
		if(user[0]==user[1]||user[1]==user[2]||user[0]==user[2]) {
			System.out.println("중복된 정수는 사용 할 수 없습니다");
			continue;
		}
		
		if(user[0]==0 || user[1]==0 || user[2]== 0) {
			System.out.println("0은 사용할 수 없습니다");
			continue;
		}
		break; // 써줘야함.
	}
		return user;
	}
	
	//힌트
	static void hint(int[] com, int[] user) {
		int s=0, b=0;
		for(int i=0; i<3; i++) {
			for(int j=0; j<3; j++) {
				if(com[i]==user[j]) {
					if(i==j)
						s++;
					else
						b++;
				}
			}
		}
		//배열 input값에서 배열 0~2 순서대로 받기 때문에 %d%d%d로
		System.out.printf("Input Number:%d%d%d, Result:%dS-%dB\n",user[0],user[1],user[2],s,b);
		
		if(isEnd(s)) {
			System.out.println("Game Over!!");
			System.exit(0); //프로그램 종류. while문이 아니기 때문에 break;쓰면 오류남
		} 
	}
	
	static boolean isEnd(int s) {
		if(s==3) {
			return true;
		}
		else
			return false;
	}
	
	//출력
	static void process() {
		int[] com=getRand();
		while(true) {
			int[] user=userInput();
			hint(com, user);
		}
	}
	
	public static void main(String[] args) {
		process();
	}
}

 

반응형
Comments