본문 바로가기

programming/Gukbi

국비 교육 11일차 - Method

728x90
반응형

분명 메소드, 클래스, 상속까지 대충 무슨 개념인지는 알고 시작했는데 다시 배우려니까 헷갈리는게 너무나도 많다.

일단 이번 포스팅에서는 Method의 개념을 제대로 정리하고

응용을 어떻게 했는지 다시 짚어가면서 이해하고 마무리를 하겠다. 

 

 

일단 메소드의 개념부터 살펴보면 

method의 기본 동작 원리

사용자 입력값이 있으면 method 안에서 가공을 하고, 결과값을 배출하는것이 method의 기본원리이다

수학에서는 함수와 같으며, 실제로 자바 스크립트에서는 function으로 부르고 사용한다. 

그래서 기본 개념 자체는 어려운 것이 없다. 

 

메소드의 종류에는 4가지가 있는데,

1. 입력값이 있고 출력값이 있는 메소드

2. 입력값만 있는 메소드

3. 출력값만 있는 메소드

4. 입력값, 출력값 전부 없는 메소드 (실행만 하고 끝)

 

이미 자바로 이런 저런 프로그램을 만들었었기 때문에 네 가지 경우 모두 사용한 적이 있었다. 

 

 

메소드 실행순서

 

main 안에서 함수에서 처리할 입력값을 지정해주면, main 밖에서 함수값을 입력받은 메소드가 차례대로 실행을 하고

return 값을 배출한다. 

그러면 그 return 값을 받고 변수 a에 리턴값을 저장해준다. 

5에서는 println이라는 또 다른 메소드를 통해서 a에 저장된 값을 출력한다. 

 

이것만 잘 이해하고 있으면 기본 개념은 잘 잡히는게 아닐까 싶다. 

 

이 메소드 호출 순서를 보면 알 수 있듯이, 메소드 안에 또 메소드를 사용할 수 있고

또 그 메소드 안에 메소드를 호출 할 수 있다. 

 

 

/*	
 * 	프로그램 언어 => 컴퓨터 명령을 내리는 언어
 * 	메소드 : 한개의 기능을 수행하기 위한 명령문의 집합
 * 			재사용이 가능
 * 			반복을 제거할 수 있다
 * 			메소드 호출 => 메소드명(값) => 메소드 {}에 있는 모든 내용을 수행하고 다시 호출된 위치 복귀
 * 		   =============================
 * 			** 명령문 
 * 				int a=10; // 세미콜론 하나가 명령 하나 (10을 a라는 메모리 공간에 대입하라)
 * 				int b=20;
 * 				System.out.println(a+b);
 * 			형식) 
 * 				리턴형(결과값) 메소드명(매개변수...)
 * 				{
 * 					수행할 내용을 코딩
 * 				}
 * 				
 * 				= 리턴형(O)	매개변수(O)
 * 				  *** 리턴형 : 사용자가 요청한 내용 처리후에 나오는 결과값 (결과값은 반드시 한개만 만들 수 있음)
 * 							 여러개일 경우 : 배열, 클래스
 * 							 = 모든 메소드는 메소드 종료를 위해서 return을 사용
 * 								return 값; (void인 경우에는 return을 생략)
 * 				  *** 매개변수 : 사용자로부터 가공할 데이터를 받는다
 * 
 * 				= 리턴형(O)	매개변수(X)
 * 				= 리턴형(X)	매개변수(O)
 * 				= 리턴형(X)	매개변수(X)
 * 				
 * 				메소드는 소스가 많거나 복잡할 경우에 => 분리 
 */
/*
 * 	1. 반복이 많다
 * 	2. 다음에 다시 사용
 * 	3. 복잡한 소스코딩
 */
public class 메소드정리 {
	
	// 출력하는 메소드
	static void print(int[] arr) 
	{
		for(int i : arr)
			{
				System.out.print(i+" ");
			}
	}
	
	// 올림차순 메소드
	static void asc(int [] arr)

	{
		for(int i =0; i<arr.length-1; i++)
		{
			for(int j=i+1; j<arr.length; j++)
			{
				if(arr[i]>arr[j])
				{
					int temp = arr[i];
					arr[i]=arr[j];
					arr[j]=temp;
				}
			}
		}
	}
	
	//내림차순 메소드
	static void desc(int [] arr)
	{
		for(int i =0; i<arr.length-1; i++)
		{
			for(int j=i+1; j<arr.length; j++)
			{
				if(arr[i]<arr[j])
				{
					int temp = arr[i];
					arr[i]=arr[j];
					arr[j]=temp;
				}
			}
		}
	}
	public static void main(String[] args) {
		
		int[] arr= {30, 20, 50, 10, 40};
		System.out.println("===정렬전===");
		
		print(arr);
		
		System.out.println("\n===정렬후(ASC:올림차순)===");
		asc(arr);
		print(arr);
		System.out.println("\n===정렬후(DESC:내림차순)===");
		desc(arr);
		print(arr);
	}

}

위의 코드는 올림차순&내림차순을 메소드를 이용해서 main안에서는 깔끔하게 코딩을 해준 결과이다. 

array 하나를 매개변수로 받아서, main 밖에서 정리를 해주고 main에서 변수를 받아 처리해주고 있다. 

 

눈으로 보고 이해하고 넘어간다고 다가 아니니 지금 한번 연습해봐야겠다. 

-> 완료

 

그 다음 연습은 학점 계산해주는 프로그램을 메소드화 하는것

/*
 * 1. 입력
 * 2. 계산 
 * 3. 출력
 * 
 * 출력 메소드는 사용 x
 */
import java.util.Scanner;
public class 학점계산기연습 {

	// 입력 메소드
	static int input (String subject)
	{
		Scanner scan=new Scanner(System.in);
		System.out.print(subject+"점수 입력:");
		int score=scan.nextInt();
		return score;
	}
	
	
	// 학점 계산
	static char grade(double avg)
	{	
		char alphabet;
		if(avg>=90)
		{
			alphabet='A';
		}
		else if(avg>=80)
		{
			alphabet='B';
		}
		else if(avg>=70)
		{
			alphabet='C';
		}
		else if(avg>=60)
		{
			alphabet='D';
		}
		else
		alphabet='F';
		
		return alphabet;
	}
	
	public static void main(String[] args) {
		
		int kor=input("국어");
		int eng=input("영어");
		int math=input("수학");
		
		int sum=(kor+eng+math);
		System.out.println("총합:"+sum);
		double avg=sum/3.0;
		System.out.printf("평균점수: %.2f\n", avg);
		System.out.print("최종학점:"+grade(avg));

	}

}

역시 완료

하다보니 내가 쓴 코드여도 전에 쓴거랑 지금 생각나는거랑 다르다

그래서 굳이 전에 쓴 코드를 따라해가면서 쓰려고 하니 더 꼬였다. 

 

그냥 최대한 맞는거 같은 코드를 먼저 써보고 안풀리면 이전에 쓴걸 참고하는 식으로 복습하는게 좋을 것 같다. 

 

 

이 다음은 String을 이용한 method 만들기 였는데

그닥 어렵지는 않아서 그냥 코드만 쓰고 넘어가겠다. 

 

import java.util.Scanner;
/*
 * 	변수
 * 	 = 멤버변수
 * 	 = 공유변수: static
 * 	 = 지역변수
 * 	메소드
 * 	 = 멤버 메소드
 * 	 = 공유 메소드 (클래스 메소드) : static
 * 	 = 추상 메소드 
 * 	 ====================================
 * 	 1. 데이터를 묶어서 서리
 * 	2. 명령문을 묶어서 처리 
 * ==================================(클래스)
 */
public class 메소드활용_5 {
	// 1. 메뉴
	// int m=menu()
	// m=>return 값을 받는 변수
	static int menu()
	{
		Scanner scan=new Scanner(System.in); // 메뉴선택
		// 메뉴 보여주기
		System.out.println();
		System.out.println("============menu============");
		System.out.println("1. 뮤직 Top50 전체보기");
		System.out.println("2. 노래 검색");
		System.out.println("3. 가수명으로 노래 검색");
		System.out.println("4. 상세 보기 ");
		System.out.println("5. 프로그램 종료");
		System.out.println("============================");
		int m=0;
		
		while(true)
		{
			System.out.print("메뉴를 선택하세요(1~5): ");
			m=scan.nextInt();
			if(m<1||m>5)
			{
				System.out.println("존재하지 않는 메뉴입니다.");
				continue; //while 처음으로 이동
			}
			break; // while문을 종료한다
			
		}
		return m;
	}
	// 2. 전체목록
	static void musicAllData()
	{
		String[] title=메소드활용_4.title;
		String[] singer=메소드활용_4.singer;
		String[] album=메소드활용_4.album;	
		System.out.println("********************음악 전체 목록*******************");
		for(int i=0; i<50; i++)
		{
			System.out.println("노래명: "+title[i]);
			System.out.println("가수명: "+singer[i]);
			System.out.println("앨범명: "+album[i]);
			System.out.println("**************************************************");
		}
		
	}
	
	// 3. 노래 찾기
	static void musicFindData()
	{
		Scanner scan=new Scanner(System.in);
		System.out.print("노래 검색:");
		String ss=scan.next();
		String[] title=메소드활용_4.title;
		System.out.println("******************검색결과******************");
		
		for(String i:title)
		{
			if(i.contains(ss))
			{
				System.out.println(i);
			}
		}
	}
	// 4. 가수명으로 노래찾기
	static void singerFindData()
	{
		Scanner scan=new Scanner(System.in);
		System.out.print("가수명 입력: ");
		String s=scan.next();
		
		String[] title=메소드활용_4.title;
		String[] singer=메소드활용_4.singer; // 인덱스번호가 같음
		System.out.println("******************검색결과******************");
		
		for(int i =0; i<50; i++)
		{
			if(singer[i].startsWith(s))
			{
				System.out.println(title[i]+"\n입니다.");
			}
		}
	}
	// 5. 상세보기
	static void detailData()
	{
		Scanner scan=new Scanner(System.in);
		String[] title=메소드활용_4.title;
		System.out.println("=================선택 목록=================");
		for(int i=0; i<50; i++)
		{
			System.out.println((i+1)+"."+title[i]);
		}
		System.out.print("상세 정보를 원하는 곡의 번호를 입력하세요(1~50): ");
		int selNum=scan.nextInt();
		System.out.println("============================================");
		String mTitle=메소드활용_4.title[selNum-1];
		String singer=메소드활용_4.singer[selNum-1];
		String album=메소드활용_4.album[selNum-1];
		String state=메소드활용_4.state[selNum-1];
		int modify=메소드활용_4.modify[selNum-1];
		
		System.out.println("노래명:"+mTitle);
		System.out.println("가수명:"+singer);
		System.out.println("앨범:"+album);
		String ss="";
		
		if(state.equals("상승"))
		{
			ss="▲"+modify;
		}
		else if(state.equals("하강"))
		{
			ss="▽"+modify;
		}
		else
		{
			ss="-";
		}
		System.out.println("순위 변동:"+ss);
		System.out.println("============================================");
	}
	// 6. 종료
	// 조립
	static void process()
	{
		while(true)
		{
			int m=menu();
			switch(m)
			{
			case 1:
				System.out.println("1. 뮤직 Top50 전체보기\n");
				musicAllData();
				break;
			case 2:
				System.out.println("2. 노래 검색");
				musicFindData();
				break;
			case 3:
				System.out.println("3. 가수명으로 노래 검색");
				singerFindData();
				break;
			case 4:
				System.out.println("4. 상세 보기");
				detailData();
				break;	
			case 5:
				System.out.println("프로그램 종료");
				System.exit(0); // 프로그램 종료
			}
		}
	}
	public static void main(String[] args) {
		
		process();
		
		
	}

}

여기까지 했을때 내가 느낀것은

1. 어떤 기능을 메소드화 할 것인가

2. 매개변수는 어떻게 받아올 것인가

이거 두개를 잘 파악하는 것이 프로그램 메소드화에서 가장 중요한 점이 아닐까 싶다

 

그럼 진짜 마지막으로 저번 시간에 만들었던 달력 출력 프로그램을 메소드화 해보는 연습을 해보겠다.

이건 수업시간에 풀었던거라 답이 있는 문제인데..

혹시나 이걸 다 이해한거 같으면 숫자 야구게임을 메소드화 하는 연습도 해보겠다. (과연)

 

 

 

/*
 * 	1. 입력
 * 	2. 계산
 * 	3. 출력
 * 
 * 	일단은 세 부분으로 나눠서 메소드화 하는 연습부터
 */
import java.util.Scanner;
public class 달력만들기_메소드화연습 {
	// 입력메소드 만들기
	
	static String [] weekList = {"일","월","화","수","목","금","토"};
	
	static int input (String date)
	{
		Scanner scan=new Scanner(System.in);
		System.out.print(date+"입력:");
		return scan.nextInt();
	}
	
	// 요일 출력 메소드
	static void printWeek (String[] arr)
	{
		for(String i : arr)
		{
			System.out.print(i+"\t");
		}
		
	}
	
	// 계산파트
	
	// 윤년인지 아닌지 tf 여부가려주는 method
	
	static boolean isYear(int year)
	{
		if((year%4==0&&year%100!=0) || (year%400==0))
				return true;
		else 
			return false;
	}
	
	
	// 전년도까지의 합 구해주는 method
	static int totalLastYear (int year)
	{
		
		int total;
		total= (year-1)*365+(year-1)/4
				-(year-1)/100
				+(year-1)/400;
		return total;
	}
	
	static int [] lastDay = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	// 전달까지의 합 구해주는 method
	static int totalLastMonth (int year, int month)
	{
		
		int total = 0;
		if(isYear(year))
		{
			lastDay[1]=29;
		}
		else 
			lastDay[1]=28;
		for(int i =0; i<(month-1); i++)
		{
			total+=lastDay[i];
		}
		return total;
	}
	
	// 전년도+전달+1
	static int finalTotal(int year, int month)
	{
		return totalLastYear(year)+totalLastMonth(year, month)+1;
	}
	
	// 이번달 1일이 무슨 요일인지 구하는 메소드
	static void weekData(int year, int month)
	{
		int week=finalTotal(year, month)%7;// 요일
		
		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();
			}
		}
	}
	
	
	public static void main(String[] args) {
		
		int year=input("년도");
		int month=input("월");
		
		printWeek(weekList);
		
		System.out.println();
		weekData(year, month);
		
		
		

	}

}

겨우겨우 낑낑대며 다했다

우왕...

 

결국 중요한건 return 값을 뭘로 받아올 것인가, 매개변수를 어떻게 처리해줄 것인가

메소드 안에서만 쓰이는 지역변수+전역변수를 어떻게 설정해줄 것인가가 중요한거 같다

 

이제 다했으니 숫자 야구 게임을 메소드화 해보겠다

/*
 * 1. 입력
 * 2. 계산
 * 3. 출력
 */
import java.util.Scanner;
public class 숫자야구게임 {

	static int[] com = {3, 6, 9};
	// 입력 메소드 만들기 
	static int[] input()
	{
		int[] user=new int [3];
		Scanner scan=new Scanner(System.in);
		while(true) 
		{
			System.out.print("세자리 정수를 입력하세요:");
			int input=scan.nextInt();
			
			
			if(input>999||input<100) {
				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[2]==user[0])
			{
				System.out.println("중복된 수는 입력할 수 없습니다.");
				continue;
			}
			break;
		}
		return user;
	}
	
	
	
	// user 한 번 출력
	static void userPrint(int[] arr)
	{
		System.out.print("당신이 입력한 수는:");
		for(int i : arr)
		{
			System.out.print(i);
		}
	}
	
	// 힌트 출력 메소드
	static void hint(int[] arr)
	{
		int s=0;
		int b=0;
		int[] hintUser=input();
		for(int i =0; i<3; i++)
		{
			for(int j =0; j<hintUser.length; j++)
			{
				if(com[i]==hintUser[j])
				{
					if(i==j)
						s++;
					else
						b++;
				}
			}
		}
		
		//힌트 출력
		System.out.printf("Input Number: %d Result: %dS-%dB", hintUser, s, b);
		if(s==3)
		{
			System.out.println("\n-End-");
		}
		
	}
	
	public static void main(String[] args) {
			
		int[] user = input();
		
		// 입력한수 출력
		userPrint(user);
		System.out.println();
		
		// 힌트 출력
		hint(user);

	}

}

이렇게 열심히 했는데 hint(); 메소드가 작동하지 않는다..........

이따위로 뜬다

세자리 정수를 계속 입력하라고만 뜬다.. 

 

저에게 왜 이러세요.....

 

너무 큰 시련과 고난이다

ㄱ-

 

일단 입력한 수 출력까지는 잘하는걸 보면 힌트 메소드에서 뭔가 문제가 있는건데...

while문 break가 안걸려서 계속 반복하는거 같기도하고

조금만 더 고쳐보고 안되면 그냥 수업시간에 들어야지

 

 

728x90
반응형