메서드는 클래스(Class)의 내부에 존재하는 영역으로, 특정 기능을 하는 코드를 묶어서 나타내는 것이다. 즉, 특정 기능을 수행하기 위한 코드들의 집합체이다.
메서드의 장점은 다음과 같다.
int a,int b) // 여기서 int a와 int b가 매개변수이다.메서드 시그니처(method signature)
메서드 이름과 매개변수 프로필의 조합이다.
예시로는 int sum(int a,int b)가 매서드 시그니처이다.
매개변수(formal parameter)
매개변수는 메서드의 헤더에 정의된 부분으로, 앞서 매개변수 프로필에서 확인할 수 있다.
인자(argument, actual parameter)
매개변수 자리에 들어가게 되는 실제 값을 의미한다.
매개 변수(parameter)와 인수(arguments)는 혼용되는 헷갈리는 용어이므로 잘 기억해 두자. 매개 변수는 메서드에 전달된 입력값을 저장하는 변수를 의미하고, 인수는 메서드를 호출할 때 전달하는 입력값을 의미한다.
메서드 정의의 예시를 봐보자
public static int max(int num1, int num2) {
if (num1 > num2)
return num1;
else
return num2;
}
여기서는 public이라는 접근제어자와 static 키워드가 앞에 붙었다.
다음에 나오는 int는 이 메서드의 리턴값의 타입(반환형)을 의미한다. 이 메서드는 num1과 num2를 비교하여, 더 큰 값을 돌려준다. 이 값의 타입은 int 이므로 반환형은 int가 된다.
max는 이 메서드의 이름이다.
다음으로 나오는 int num1, int num2는 모두 매개변수이다.
이 메서드는 a=max(3,5)와 같이 실행할 수 있고, 여기서 인수는 3, 5 이다.
public static int xMethod(int n){
if (n > 0){
return 1;
}
else if (n == 0) {
return 0;
}
else if (n<0){
return -1;
}
}
이 메서드는 얼핏 보기에 문제가 없어 보인다. 하지만 이 메서드를 실행하면 아래의 에러가 난다.
This method must return a type of int.
즉 int 의 타입을 무조건 return 해야한다는 것이다. 하지만 앞의 메서드는 n에 무엇이 들어가든 항상 return을 하지 않는가? 그렇다면 무엇이 문제인걸까?
우리가 논리적으로 보았을 때 n은 n>0, n==0, n<0 중 하나에 속할 수 밖에 없다.
하지만 java는 그런거 모르나보다.
if, else if, else if로 끝나니 자바 입장에서는 이 세가지 경우가 아닌 else가 나와서 return 값이 없는 경우가 있지 않을까? 라고 생각하는 것 같다.
따라서 if, else if, 그리고 마지막을 else로 수정해주면 정상적으로 실행된다.
매개변수에 인수를 넘겨줄 때, 메서드는 인수의 값으로 연산을 하기 때문에 매개변수의 값은 변하지 않는다.
자바는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
참고로 오버라이드는 클래스 상속에서 배우게 된다.
public static int max(int num1, int num2) {
if (num1 > num2)
return num1;
else
return num2;
}
이것은 아까 보았던 max 메서드이다.
public static double max(double num1, double num2) {
if (num1 > num2)
return num1;
else
return num2;
}
이렇게 같은 클래스 내에 max 메서드를 하나 더 만들 수 있는 것이 오버로딩이다.
원래의 max 메서드는 반환값과 매개변수가 모두 int 형이지만, 새로 만든 max 메서드는 반환값과 매개변수가 모두 double 형이다.
그렇다면 실제로 실행할 때 내가 두 메서드 중 어떤 메서드로 실행하게 될까?
내가 int형 인수를 전달한다면 첫번째 max를, double형 인수를 전달한다면 두번째 max로 실행하게 된다.
a = max(1,5)//첫 번째 메서드로 실행
b = max(1.4, 5.5)//두 번째 메서드로 실행
만약 a = max(1, 5.5)처럼 하나는 int, 하나는 double이면 어떻게 될까?
이렇게 되면 어떤 메서드를 선택할지 애매모호(ambigious)해지기 때문에 실행되지 않는다.
지역변수는 메서드나 블록 안에서 정의(선언)된 변수를 말한다.
지역변수의 범위는 선언의 시작부터, 그 변수를 포함한 블록의 끝까지 이다.
그러므로 다른 블록이나 메서드에서는 똑같은 문자로 변수를 선언할 수 있다. 어차피 그 블록의 밖에선 변수가 유효하지 않기 때문이다.
하지만 같은 블록이나 지역변수가 선언된 블록 안에 중첩된 블록에서는 다시 선언할 수 없다. 바깥 블록에서 이미 선언 되었기 때문이다.
// 틀린 코드
public static void incorrectMethod() {
int x = 1;//x를 한번 선언했다.
int y = 1;
for (int i = 1; i < 10; i++) {
int x = 0;//안쪽 블록에서 한번 더 선언했기에 틀렸다.
x += i;
}
}
메서드안에서 자신의 메서드를 호출하는 것을 재귀라고 한다.
대표적인 예시로 팩토리얼이 있다.
static long factorial(int n) {
if (n == 0) // Stopping condition
return 1;
else
return n * factorial(n - 1); // Call factorial recursively
}
또 다른 예시로는 하노이 탑이 있다.
//src=source 시작점, aux=auxiliary 보조로 사용, dest=destination 목적지
static int tower(int n, char src, char aux, char dest) {
if (n <= 1) { // Stopping condition
System.out.println("Mode disc " + n + " from " + src + " to " + dest);
return 1;
}
else {
int moves1 = tower(n - 1, src, dest, aux);
System.out.println("Mode disc " + n + " from " + src + " to " + dest);
int moves2 = tower(n - 1, aux, src, dest);
return moves1 + moves2 + 1;
} // else
}
재귀함수를 작성할 때는 재귀가 끝나는 조건을 무조건 넣어주어야 한다.
PI ,E
exp(double a)
e 의 a 제곱
log(double a)
a의 자연로그
pow(double a, double b)
a의 b제곱
sqrt(double a)
a의 제곱근
double ceil(double x)
올림
double floor(double x)
내림
double rint(double x)
가장 가까운 정수 반환. 만약 두 정수가 동일하게 가깝다면 두 정수 중 짝수 반환.
int round(float x)
Return (int)Math.floor(x+0.5).
반올림
long round(double x)
Return (long)Math.floor(x+0.5).
반올림
max(a,b)
최대값
min(a,b)
최소값
abs(a)
절대값
random()
[0.0, 1.0) 사이의 double값 반환