메서드의 선언과 구현
int add(int x, int y)
{
int result = x + y;
return result; //작업 결과(반환값)을 반환한다.
}
메서드는 크게 두 부분, 선언부와 구현부로 이루어져 있다.
메서드를 정의한다는 것은 선언부와 구현부를 작성하는 것을 뜻하며 다음과 같은 형식으로 메서드를 정의한다
반환타입 메서드 이름 (타입 변수명, 타입 변수명, ...) //선언부
{
//메서드 호출시 수행될 코드(구현부)
}
int add(int a, int b) // 선언부
{
int result = a + b; //구현부
return result; //구현부
}
메서드 선언부(method declaration, method header)
메서드 선언부는 메서드의 이름과 매개변수 선언, 그리고 반환 타입으로 구성되어 있으며, 메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.
int add(int x, int y) {
int result = x + y;
return result; //결과를 반환
}
매개변수 선언(parameter declaration)
매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것이며, 필요한 값의 개수만큼 변수를 선언하며 각 변수 간의 구분은 쉼표', '를 사용한다.
일반적인 변수선언과 달리 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다는 특징이 있다.
매개변수도 메서드 내에서 선언된 것으로 간주되므로 지역변수이다.
메서드의 이름(method name)
메서드의 이름도 앞서 배운 변수의 명명규칙대로 작성하면 된다.
메서드의 이름은'add'처럼 동사인 경우가 많으며, 이름만으로도 메서드의 기능을 쉽게 알 수 있도록 함축적이면서도 의미 있는 이름을 짓도록 노력해야 한다.
반환 타입(return type)
메서드의 작업 수행 결과인 반환 값의 타입을 적는다 반환 값이 없는 경우 반환 타입으로 void를 적어야 한다.
매서드의 구현부(method body, 메서드 몸통)
매서드의 선언부 다음에 오는 괄호{}를 메서드의 구현부라고 하는데, 여기에 메서드를 호출했을 때 수행될 문장들을 넣는다.
return문
메서드의 반환 타입이 void가 아닌 경우, 구현부{} 안에 return 반환 값; 이 반드시 포함되어 있어야 한다. 이 문장은 작업을 수행한 결과인 반환 값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환 타입과 일치하거나 적어도 자동 형 변환이 가능한 것이어야 한다. 여러 개의 변수를 선언할 수 있는 매개변수와 달리 return문은 단 하나의 값만 반환할 수 있는데, 메서드로의 입력(매개변수)은 여러 개일 수 있어도 출력(반환 값)은 최대 하나만 허용하는 것이다.
지역변수(local variable)
메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메서드라면 같은 이름의 변수를 선언해도 된다. 이처럼 메서드 내에 선언된 변수를 지역변수(local variable)라고 한다.
메서드의 호출
메서드를 정의했어도 호출되지 않으면 아무 일도 일어나지 않는다. 메서드를 호출해야만 구현부{}의 문장들이 수행된다.
그러나 main메서드는 프로그램 실행 시 OS에 의해 자동적으로 호출된다.
또한 메서드를 호출하는 방법은 다음과 같다.
메서드이름(값1,값2,...): // 메서드를 호출하는 방법
print99danAll(); // void print99danAll()을 호출
int result = add(3, 5); // int add(int x, int y)를 호출하고, 결과를 result에 저장
인자(argument)와 매개변수(parameter)
메서드를 호출할 때 괄호() 안에 지정해준 값들을 인자(argument)또는 인수라고 하는데, 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다. 그리고 인자는 매서드가 호출되면서 매개변수에 대입되므로 인자의 타입은 매개변수의 타입과 일치하거나 자동 형 변환이 가능한 것이어야 한다.
메서드의 실행 흐름
같은 클래스 내의 메서드끼리는 참조 변수를 사용하지 않고도 서로 호출이 가능하지만 static메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.
public class MyMathTest {
public static void main(String[] args) {
MyMath mm = new MyMath();
long result1 = mm.add(5L, 3L);
long result2 = mm.subtract(5L, 3L);
long result3 = mm.multiply(5L, 3L);
double result4 = mm.divide(5L, 3L);
System.out.println("add(5L, 3L) = " + result1);
System.out.println("subtract(5L, 3L) = " + result2);
System.out.println("multiply(5L, 3L) = " + result3);
System.out.println("divide(5L, 3L) = " + result4);
}
}
class MyMath {long add(long a, long b) {
long result = a+b;
return result;
}
long subtract(long a, long b) {return a -b;}
long multiply(long a, long b) { return a * b;}
double divide(double a, double b) {return a / b;}
}
add(5L, 3L) = 8
subtract(5L, 3L) = 2
multiply(5L, 3L) = 15
divide(5L, 3L) = 1.6666666666666667
MyMath클래스를 이용한 예제이다. divide에 선언된 매개변수 타입은 double형인데 이와 다른 long형의 값인 5L과 3L을 사용해서 호출하는 것이 가능하다.
return문
return문은 현재 실행 중인 메서드를 종료하고 호출한 메서드로 돌아간다.
반환 값의 유무에 관계없이 모든 메서드에 넌 적어도 하나의 return문이 있어야 한다.
반환 값이 void인 경우 return문이 없어도 문제가 없던 이유는 컴파일러가 메서드의 마지막에 return을 자동적으로 추가하기 때문이다.
그러나 반환 타입이 void가 아니 경우, 반드시 return문이 있어야 한다.
매개변수의 유효성 검사
메서드를 작성하는 사람은 호출하는 쪽에서 알아서 적절한 값을 넘겨준다는 보장이 없으므로 가능ㅎ나 모든 경우의 수에 대해 고민하고 그에 대비한 코드를 작성해야 한다.
'JAVA06강 객체지향 프로그래밍1 > 변수와 메서드' 카테고리의 다른 글
클래스 메서드(static메서드)와 인스턴스 메서드 (0) | 2021.07.19 |
---|---|
JVM의 메모리구조와 참조변수 (0) | 2021.07.19 |
변수와 메서드 (0) | 2021.07.18 |