Method
동일한 행동(연산)을 할 때 마다 연산용 코드를 매번 작성하는 것은 매우 번거로운 일이다.
// 계산1
int a = 1;
int b = 2;
System.out.println(a +" 와 " + b + " 의 더하기 연산을 수행한다.");
int sum = a + b;
System.out.println("결과값 = " + sum);
// 계산2
int x = 10;
int y = 20;
System.out.println(x + " 와 "+ y +" 의 연산 수행");
int sum2 = x + y;
System.out.println("x+y 의 결가괎 = " + sum2);
더하기 연산 100번 하다 시간만 날리고 죽것다. 아주.
이를 해소하기 위한 장치가 바로 '메소드' 이다.
동일한 행동에 대해 식을 작성하고, 이를 이용하는 것.
알기 쉬운 예시로, 수학에서의 함수(function) 이 그렇다.
f(x) = x + y; 유노?
아래와 같이 +연산(sum) 에 대한 메소드를 작성하면 재사용이 가능해진다.
public static int sum(int num1, int num2) {
return num1 + num2;
}
int a = 1;
int b = 2;
int x = 50;
int y = 100;
// 메소드 호출
int sum1 = sum(a,b);
int sum2 = sum(x,y);
System.out.println(sum1); // 3
System.out.println(sum2); // 150
이렇게 쓸 수 있다는 건 알았으니, 구조를 뜯어보자.
public static int sum(int num1, int num2) {
return num1 + num2;
}
메소드는 크게 선언부, 실행부로 나뉜다.
선언부
public : 다른 클래스에서 호출 할 수 있는지를 알려준다.
static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드임을 알려준다.
int : 메서드 실행 후 반환할 결과값의 타입이다. 결과값 반환이 필요치 않은 경우 void 가 사용된다.
public static void sum(매개변수1, 매개변수2);
sum : 메서드 이름. 용도에 맞게 이름을 지어주도록 하자.
(int num1, num2) : 메소드 실행에 필요한 매개변수(=파라미터) 이다.
실행부
선언부 작성 후 중괄호 {} 안에서 실행할 코드
return : 반환할 값이다.
메소드 사용 흐름
프로그램을 실행하게 되면, 위에서 아래로 물 흐르듯 코드가 실행된다. 이 때, 메소드 호출 코드가 인식되면, 코드의 흐름은 호출된 메서드 쪽으로 넘어간다.
메소드 진행 순서
1. 호출된 메소드를 사용하기 위한 메모리가 할당됨. (매개변수를 통해 값을 전달해야 하므로)
2. 메소드가 실행되고 결과를 반환 하는 등의 절차가 발생함.
3. 메소드 종료. 변수 등에 할당된 값 모두 제거. 할당된 메모리가 회수됨.
메소드 호출
메소드 호출 시, 메소드에 넘기는 값과 파라미터의 타입이 동일해야 함. 또한, 파라미터의 순서와 갯수도 동일해야 함.
호출: sum(1, 2);
메소드 정의 : int sum(int num1, int num2);\{}
아래와 같이 불일치할 경우, 사용 불가
호출: sum(1, "2");
메소드 정의: sum(int num1, int num2){}
호출: sum(1, 2);
메소드 정의: sum(int num1, int num2, int num3){}
메소드 용어
인수(Argument)
위에서 작성한 sum(1, 2); 에서 1, 2와 같이 '넘기는 값'을 'Argument(인수)' 라 한다.
매개변수(Parameter)
호출문에 입력된 인자값을 받아오는 매개체 역할을 하는 변수'를 'Parameter(매개변수)' 라 한다.
여담
따라 쳐보면서 알게 된 것인데, 아래와 같이, 메소드 안에 메소드를 선언하는 것은 금지 돼 있는 모양이다.
public static int sum(int num1, int num2) {
public int minus(int a, int b){
return a-b;
}
return num1 + num2;
}
gpt 한테 물어보니 Scoping 원칙, 객체지향 원칙에 위배되기 때문이라는데..
나중에 알아보자. 일단, 메소드 안에 메소드 선언은 안 되는 걸로!