/*
 * 메서드 ( method )
 * → class 안에 하나의 기능을 가진 작은 프로그램.
 */

public class MethodEx01 {
	
// 접근제한자 지정예약어 반환타입  메서드명  매개변수
//   선택       선택      필수       필수      선택
	public     static     void      main(     String[] args) {
		// 반환타입 : 메서드의 실행이 종료되면서 호출부로 돌아갈 때 보내지는 값의 자료형.
		//            기본 자료형, 참조 자료형, void( 반환값 X )
		//            호출 요청한 곳에서 return값 수신. 
		//            부른 메서드에서 코드가 작동되고, 결과값을 반환. ! 반드시 참조변수에 저장해야 데이터 사용가능. !
		// 메서드명 : 매서드 실행(호출)시에 사용되는 이름.
		// 매개변수 : 호출부에서 보내지는 값을 보관하는 변수. (사용할 때도 있고, 안할 때도 있음.)
		
		// 메서드 호출 : 메서드 명을 사용해서 실행.
		// → 메서드명( 인자값 );
		//   > 메서드 정의부에 매개변수가 있으면, 메서드 호출시에 해당 타입에 맞는 값을 보내야 함.
		hi();
		hi();
		dataSend(10);
		System.out.println( "원주율 : " + returnPi() );
		double pi = returnPi();
		System.out.println("pi : "+ pi);
		
		// 메서드 지역이 다르면 동일한 문자사용가능.
		// sendReceive(str); → sendReceive에 있는 str이 "종료"로 바뀌는 거라 출력도 시작으로 됌.
		// str = sendReceive(str); → "종료" 
		String str = "시작";
		str = sendReceive(str);
		System.out.println("str : " + str);
	}
	
	public static String sendReceive(String str) {
		System.out.println("받은 문자열 : " + str);
		str = "종료";
		return str;
	}
	
	// return : 메서드 실행에서 나온 결과물을 호출부로 보낼 때 사용.
	//          → 반환 값을 한 개만 가능.
	public static double returnPi() {
		return 3.141592;
	}
	
	public static void dataSend(int parameter) {
		System.out.println("받은 데이터 : " + parameter);
	}

	// 매서드 정의 : 매서드 호출시에 실행하는 기능 구현.
	public static void hi() {
		System.out.println("Hello World!");
	}
}
import java.util.Scanner;

public class MethodEx02 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// sc = Scanner class의 주소
		int data = inputInt(sc);
		System.out.println("data : " + data);
		
		sc.close();
	} // main()
	
	// Scanner 변수 값일 때 동일한 변수타입으로 받아야 함.
	public static int inputInt(Scanner sc) {
		System.out.print("데이터 입력 > ");
		int data = sc.nextInt();
		return data;
	}
	

}
public class MethodEx03 {
	public static void main(String[] args) {
		
		int[] arr = new int[3];
		lifeTestA();
		// 출력 arr[0] : 0 → main의 arr과 lifeTestA의 arr은 다른 배열이므로, 0값 출력.
		System.out.println("arr[0] : " + arr[0]);
		
		// lifeTestB의 arr → main의 arr
		lifeTestB(arr);
		System.out.println("arr[0] : " + arr[0]);
		
		arr = lifeTestC();
		System.out.println("arr[0] : " + arr[0]);
	}
	
	// int[] int배열의 위치값(주소값)
	public static int[] lifeTestC() {
		return new int[3];
	}
	
	public static void lifeTestB(int[] arr) {
		arr[0] = 7;
	}
	
	public static void lifeTestA() {
		int[] arr = new int[3];
		arr[0] = 10;
		
	}
}
import java.util.Scanner;

public class MethodEx04 {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		char subject = inputSubject("Java : j, Python : p 선택 >> ", sc);
		
		if( checkSubject(subject) ) {
			System.out.println("열심히 하세요.");
		}
		
		sc.close();
	}
	public static char inputSubject(String menu, Scanner sc) {
		System.out.print(menu);
		char value = sc.next().charAt(0);
		return value;
	}
	
	// 메서드 실행 중 'return'문이 실행되면, 해당 위치에서 메서드의 실행을 멈추고 호출부로 돌아감.
	// 메서드 안에서 'return'문은 몇 번이든 사용할 수 있으나, 여러번 사용시 모든 경우의 수에서 return값을 써야함.
	public static boolean checkSubject(char subject) {
		switch(subject) {
		case 'j':
			System.out.println("Java를 선택하셨습니다.");
			//break;
			// return; → 실행을 멈추고 호출부로 돌아감.
			return true; // → void가 아닌 boolean 반환타입이 정해져 있을 때, 모든 상황에서 return값을 써야함. 
		case 'p':
			System.out.println("Python을 선택하셨습니다.");
			//break;
			// return; → 여러번 사용 가능.
			return true; // → void가 아닌 boolean 반환타입이 정해져 있을 때, 모든 상황에서 return값을 써야함. 
		}
		System.out.println("--end--");
		return false; // → void가 아닌 boolean 반환타입이 정해져 있을 때, 모든 상황에서 return값을 써야함. 
	}
}

QuizMethod