package method;
public class Method1 {
public static void main(String[] args) {
// 계산 1
int a = 1;
int b = 2;
int sum = a + b;
System.out.println(a + "+" + b + "=" + sum);
// 계산 2
int c = 10;
int d = 20;
int sum2 = c+d;
System.out.println(c+ "+" + d + "=" + sum2);
}
}
package method;
public class Method1Ref {
public static void main(String[] args) {
// 계산 1
int sum1 = add(5 , 10); // 함수를 호출
System.out.println("연산 결과: " + sum1); // 연산 결과 리턴
System.out.println("===============================");
// 계산 2
int sum2 = add(10,20);
System.out.println("연산 결과: " + sum2);
System.out.println("===============================");
}
public static int add (int a , int b){
System.out.println(a + "+" + b + " 연산수행");
int sum = a + b;
return sum; // 계산 결과를 리턴
}
}
메서드 선언
public static int add(int a , int b)
- 메서드의 선언 부분으로,메서드 이름 , 반환 타입 , 파라미터 목록을 포함한다.
- 어떤 곳에서든 해당 메서드를 호출할 수 있다.
- int a, int b은 매개변수(파라미터)라고 부른다.
public static
- public : 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다. 접근 제어에서 사용한다.
- static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드라는 뜻이다.
메서드 본문
{ System.out.println(a + "+" + b + " 연산수행"); int sum = a + b; return sum; // 계산 결과를 리턴 }
- 메서드를 수행해야 하는 코드 블록
- 메서드를 호출하면 코드 본문이 순서대로 실행한다.
- 호출하는 곳에서 선언은 알지만 메서드 본문은 모를ㄴ다.
- 메서드의 실행 결과를 return문을 사용하여 값을 리턴한다.
- 메서드 리턴값은 선언시 반환 타입과 일치해야 한다.
int call (String str , int age) call("hello" , 20)
- call로 선언한 매개변수는 String , int가 파라미터이다. 이때 call 을 호출할 때도 선언과 똑같은 자료형과 개수를 맞춰야 한다.
변수(Argument)
- "hello" , 20 처럼 넘기는 값을 Argument 라고 한다.
매개 변수(Parameter)
- 메서드를 선언할 때 선언한 변수를 말한다.
- 인수를 매개 변수(파라미터)에 넘긴다.
public static int add(int a , int b) {
// 메서드 본문 , 실행 코드
}
//제어자 반환 타입 메서드 이름(매개변수 목록){
// 메서드 본문
//}
반환 타입이나 매개변수가 없는 경우
package method; public class Method2 { public static void main(String[] args) { printHeader(); System.out.println("프로그램이 동작합니다."); printFooter(); } public static void printHeader(){ // 반환 타입이 없는 겨우 System.out.println("프로그램이 시작합니다."); return; // 반환할게 없기 때문에 값을 안넣어줘도 된다. } public static void printFooter(){ System.out.println("프로그램을 종료합니다."); } }
- 매개변수가 없는 경우 인수를 비워 두고 선언하면 된다.
- 매개변수를 호출 할때도 인수를 비워두고 호출하면 된다.
- 반환 타입이 없는 경우 에는 void를 자료형으로 선언하면 된다.
- 호출할 때도 반환 타입이 없으므로 메서드만 호출하고 반환 값을 받지 않으면 된다.
- void일 경우 return문을 생략해도 된다.
package method;
public class MethodReturn1 {
public static void main(String[] args) {
boolean result = odd(2); // 홀수 인지 판단하는 함수
System.out.println(result);
}
public static boolean odd(int i){
if (i % 2 == 1){
return true;
}
// 만약 홀수가 아닐때 에는 return 자료형이 있기 때문에 오류가 발생한다.
else{
return false;
}
}
}
만약 odd 함수에서 else 문이 존재하지 않으면 return문이 실행 안되기 때문에 컴파일 오류가 발생 한다.
return문을 만나면 반드시 메서드를 빠져 나간다.
18살 미만인 경우: 미성년자 출입을 불가하고 18살 이상일 경우 입장 가능하다는 메서드를 작성하시오.
package method;
public class MethodReturn2 {
public static void main(String[] args) {
checkAge(10);
checkAge(20);
}
public static void checkAge(int age){
if (age < 18){
System.out.println(age + "살은 미성년자라 출입할 수 없습니다.");
return; // void 이지만 return문을 만나면 자동으로 함수를 빠져 나온다.
}else {
System.out.println(age + "살은 입장하세요");
return;
}
}
}
package method;
public class MethodValue0 {
public static void main(String[] args) {
int num1 = 5;
int num2 = num1; // 현재 코드에서 num1 = 5 , num2 = 5
num2 = 10; // num2 = 10으로 변경
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
package method;
public class MethodValue1 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("1.ChangeNumber 호출전 : " + num1); // 5
changeNumber(num1); // 5를 호출하여 넘김
System.out.println("4.ChangeNumber 호출후 : " + num1); // 5
}
public static void changeNumber(int num2){
System.out.println("2.ChangeNumber 변경전 : " + num2); // 곱하기 전에는 5
num2 = num2 * 2; // 곱한 후에는 10
System.out.println("3.ChangeNumber 변경후 : " + num2);
}
}
package method;
public class MethodValue2 {
public static void main(String[] args) {
int number = 5;
System.out.println("1.changeNumber 함수 호출전 :" + number); // 5
changeNumber(number);
System.out.println("4.changeNumber 함수 호출후 : " + number); // 5
}
public static void changeNumber(int number){
System.out.println("2.changeNumber 변경 전 : " + number); // 5
number = number * 2; // 10
System.out.println("3.changeNumber 변경 후 : " + number); // 10
}
}
값을 사용하기 위해서
- 함수 호출 후 변경된 값을 return 으로 반환 받아야 한다.
package method; public class MethodValue3 { public static void main(String[] args) { int num1 = 5; System.out.println("1.changeNumber 함수 호출전 :" + num1); // 5 num1 = changeNumber(num1); // 호출할 때 number의 값을 복사해서 호출할 때 대입한다. System.out.println("2.changeNumber 함수 호출후 : " + num1); // 10 } public static int changeNumber(int num2){ num2 = num2 * 2; return num2; } }
- void 자료형이 아닌 반환 자료형을 지정해줘서 값을 바꿔야 한다.
명시적 형변환
- 메서드를 호출하는데 인자의 매개변수의 타입이 맞지 않을때 사용한다.
- ex) 함수 매개변수가 int형인데 대입 인자(Argument)가 double형 일때
package method; public class ModelCasting1 { public static void main(String[] args) { double number = 1.5; System.out.println("함수 호출전 : " + number); printNumber((int) number); // 명시적 형변환 1.5 -> 1 } public static void printNumber(int n){ System.out.println("숫자 : " + n); //1 } }
- 매개변수의 타입이 안맞을때는 형변환을 통해 처리해야 한다.
- but 크기가 작은 자료형에서 큰 자료형에 대입 할때는 자동 형변환으로 처리된다.
package method; public class ModelCasting2 { public static void main(String[] args) { int number = 100; printNumber(number); } public static void printNumber(double n){ System.out.println("숫자: " + n); } }
- int -> double 로 자동 형변환이 진행된다.
add(int a , int b)
add(int x , int y , int z)
add(double c , double d)
double add(int a , int b)
int add(int x , int y)
메서드 시그니처
- 자바에서 메서드를 구분하는 고유한 식별자나 서명을 뜻하는 용어이다.
- 메서드 이름 + 매개변수 타입
- 매개변수 타입에는 매개변수의 선언의 순서도 포함이 된다.
매개 변수의 개수가 다른 오버로딩
package method.overloading; public class OverLoading1 { public static void main(String[] args) { System.out.println("1번 함수: " + add(1,2)); System.out.println("2번 함수: " + add(1,2,3)); } public static int add(int a , int b){ System.out.println("1번 함수 호출"); return a + b; } public static int add(int a , int b , int c){ System.out.println("2번 함수 호출"); return a + b + c; } }
매개 변수 타입이 다른 오버로딩
package method.overloading; public class OverLoading2 { public static void main(String[] args) { myMethod(1, 1.2); myMethod(1.2 , 1); } public static void myMethod(int a , double b){ System.out.println("1번 함수 호출 "); System.out.println("a: " + a + " b: " + b); } public static void myMethod(double a , int b){ System.out.println("2번 함수 호출 "); System.out.println("a: " + a + " b: " + b); } }
package method.overloading; public class OverLoading3 { public static void main(String[] args) { System.out.println(add(1,2)); // 1번 함수 호출 System.out.println(add(1.1,2.2)); // 2번 함수 호출 } public static int add(int a , int b){ System.out.println("정수형 수 더하기 "); return a + b; } public static double add(double a , double b){ System.out.println("실수형 수 더하기"); return a + b; } }
- 한가지 특징으로는 정수형 더하기 함수를 지운다 해도 같은 이름의 함수가 실행되기 때문에 문제 없이 실행할 수있다.
- int -> double 이기 때문에 자동 형변환에도 문제가 발생하지 않는다.