package method_basic;
public class Ex {
public static void main(String[] args) {
/*
* 메서드(Method)
* - 객체의 동작을 나타내는 최소 단위
* - 메서드를 정의한 후에는 반드시 호출 되어야만 사용 가능
* => 이 때, 다른 메서드를 호출하는 메서드를 Caller, 호출 당하는 메서드를 Worker(Callee) 라고 함
* - 메서드는 선언부(Header)와 구현부(Body, {}) 로 구분됨
* - main() 메서드도 메서드의 일종
* => JVM 에 의해 자동으로 호출되는 메서드 = 자바 프로그램의 시작점
* - 메서드를 호출할 때 전달하는 데이터를 전달인자(Argument) 라고 하며
* 메서드가 이 값을 전달받기 위해 선언하는 변수를 매개변수(Parameter)라고 함
* - 메서드 수행이 끝날 때 메서드를 호출한 곳(Caller)으로 전달할(= 되돌려 줄) 데이터를 리턴값이라고 함
*
* ===============================================================================
* < 메서드 정의 방법(형태)에 따른 분류 >
* 1. 매개변수가 없고, 리턴값도 없는 메서드
* 2. 매개변수는 없고, 리턴값만 있는 메서드
* 3. 매개변수만 있고, 리턴값은 없는 메서드
* 4. 매개변수도 있고, 리턴값도 있는 메서드
*
* < 메서드 정의 기본 문법 >
* [제한자] 리턴타입 메서드명([매개변수...]) {
* // 메서드가 호출되었을 때 실행할 코드들...
* // [return [값];]
* }
*/
// 1. 매개변수가 없고, 리턴값도 없는 메서드 호출
// => 정의된 메서드 이름과 동일한 이름을 사용하여 호출
// => 매개변수가 없으므로, 메서드 호출 시 소괄호() 안에 아무 데이터도 전달하지 않음
System.out.println("동생아! 불 좀 꺼라!");
sister_1(); // sister_1() 메서드 호출 => 코드 흐름(제어)이 메서드쪽으로 변경됨(제어권이 넘어감)
System.out.println("동생이 불을 껐다!");
System.out.println("---------------------");
// 2. 매개변수는 없고, 리턴값만 있는 메서드 호출
// => 매개변수가 없으므로, 메서드 호출 시 소괄호() 안에 아무 데이터도 전달하지 않음
System.out.println("동생아! 물 좀 떠온나!");
// sister_2(); // sister_2() 메서드 호출
// => 주의! 리턴값이 있을 경우 메서드 호출 코드 앞에 변수 선언을 통해 리턴값을 저장하거나
// 출력문 등을 통해 사용하지 않을 경우 리턴값은 버려짐
// 1) 리턴값을 변수에 저장하는 경우
// String result = "물";
// String result = sister_2(); // 리턴값인 "물" 이라는 문자열을 리턴받아 변수 result 에 저장
// System.out.println("동생이 가져다 준 것 : " + result); // 리턴 데이터인 "물" 이 출력됨
// 2) 리턴값을 출력문에서 바로 사용하는 경우
// => 변수에 저장 후 출력 과정 대신 출력문 내에서 리턴값을 전달받아 즉시 출력
System.out.println("동생이 가져다 준 것 : " + sister_2());
// => System.out.println("동생이 가져다 준 것 : " + "물"); 과 동일한 코드가 됨
System.out.println("--------------------------------");
// 3. 매개변수만 있고, 리턴값은 없는 메서드 호출
// => 매개변수(int money)가 있으므로 메서드 호출 시 소괄호() 내부에 전달할 데이터(정수) 지정
System.out.println("동생아! 200원 줄테니 과자 사먹어라!");
sister_3(200); // 메서드 호출 시 정수 200을 전달 => 메서드 내의 매개변수 int money 에 저장됨
} // main() 메서드 끝
// ---------------- 메서드 정의 -----------------
// < 메서드 정의 기본 문법 >
// [제한자] 리턴타입 메서드명([매개변수...]) {
// // 메서드가 호출되었을 때 실행할 코드들...
// [return [값];]
// }
// -----------------------------------------------
// 1. 매개변수가 없고, 리턴값도 없는 메서드 정의
// => 리턴값이 없으므로 메서드 선언부 리턴타입 자리에 void 타입 명시(생략 불가)
// => 매개변수가 없으므로, 메서드 선언부 소괄호() 안에 아무것도 기술하지 않음
public static void sister_1() {
System.out.println("동생 : 오빠가 불을 끄라고 시켜서 불을 껐다!");
} // sister_1() 메서드 종료 => 코드 흐름(제어)이 호출한 곳(sister_1() 코드 부분)으로 되돌아 감
// ------------------------------------------------------
// 2. 매개변수는 없고, 리턴값만 있는 메서드 정의
// => 리턴값이 있으므로, 리턴할 데이터의 데이터타입을 리턴타입 부분에 기술
// 만약, 문자열 데이터를 리턴 시 String, 정수 데이터 리턴 시 int 타입을 기술
// 리턴타입을 명시한 상태에서 아무 데이터도 리턴하지 않으면 오류 발생!
// (This method must return a result of type XXX => XXX 타입 데이터를 반드시 리턴해라!)
// => 매개변수가 없으므로, 메서드 선언부 소괄호() 안에 아무것도 기술하지 않음
public static String sister_2() {
System.out.println("동생 : 오빠가 물 떠오라고 시켰다!");
// 메서드 선언부에서 리턴타입을 명시했을 경우 반드시 return 문 뒤에 리턴할 데이터(리턴값)를 기술해야함!
// => 리턴할 데이터는 리터럴 또는 변수 모두 지정 가능
// return "물"; // String 타입 리터럴을 직접 리턴할 경우
// 리턴할 데이터를 변수에 저장 후 리턴할 경우
String data = "물";
return data;
// => return 문을 만나면 return 문 위치에서 즉시 return 문 뒤의 데이터를 가지고 호출한 곳으로 되돌아 감
}
// ------------------------------------------------------
// 3. 매개변수만 있고, 리턴값은 없는 메서드 정의
// => 리턴값이 없으므로 메서드 선언부 리턴타입 자리에 void 타입 명시(생략 불가)
// => 전달인자(데이터)가 있으므로 매개변수 부분에 데이터를 전달받아 저장할 변수 선언
// 주의! 전달되는 데이터와 일치하는 데이터타입의 변수 선언 필수!
public static void sister_3(int money) {
// 전달받은 전달인자(데이터, 200) 가 매개변수 money 에 저장되고
// 저장된 데이터는 메서드 내에서 자유롭게 사용 가능함
// => 매개변수에 전달되는 값 x 는 int money = x 코드와 동일한 효과를 가짐(int money = 200 과 동일)
System.out.println("동생 : 오빠가 과자 사먹으라고 " + money + " 원을 줬다!");
money -= 200;
System.out.println("동생 : 새우깡 사먹고 " + money + "원이 남았다!");
// 리턴타입이 void 이므로 return 문을 생략
}
} // Ex 클래스 끝