●메서드란?
'메서드(method)'는 특정 작업을 수행하는 일련의 문장을 하나로 묶은 것이다. 수학의 함수와 유사하며 어떤 값을 입력하면 어떤 작업을 수행하여 결과를 반환한다. 메서드는 그저 값을 넣고 원하는 결과만 얻으면 될 뿐, 메서드가 내부적으로 어떤 과정을 거치는 지 알 필요가 없다. 그저 메서드의 입력 값과 출력 값을 알기만 하면 된다. 그래서 메서드를 내부가 보이지 않는 '블랙박스(black box)'라고도 한다. 메서드는 '선언부(header)'와 '구현부(body)'로 이루어져있다. 메서드를 정의한다는 것은 선언부와 구현부를 작성한다는 뜻이며 형식은 아래와 같다
●메서드의 선언부
메서드의 선언부는 '메서드의 이름', '매개변수 선언', '반환타입'으로 구성되어있다. 메서드의 선언부는 후에 변경이 발생하지 않도록 신중히 작성해야 한다. 메서드의 선언부가 변경되면, 그 메서드가 호출되는 모든 곳이 변경되어야 하기 때문이다.
매개변수 선언(parameter declaration)
매개변수는 메서드가 작업을 수행하는데에 필요한 값을 받는 것이다. 필요한 값의 갯수만큼 변수를 선언하며 변수간에는 쉼표','를 사용한다. 매개변수에서 한 가지 주의 해야 할 점은 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다는 것이다. 만일 값을 입력하지 않고 싶다면 괄호() 안에 아무것도 적지 않는다.
int add(int x, int y) {...} // OK
int add(int x,y) {...} //에러. 매개변수 y의 타입이 없다.
반환타입(return type)
메서드의 작업수행 결과(출력)인 '반환값(return value)'의 타입을 적는다. 단, 반환값이 없는 경우 반환 타입으로 'void'를 적는다. 참고로 반환타입으로 'void'가 선언된다면 메서드 구현부에 'return'을 적지 않는다.
void print99danAll() {
for(int i=1;i<=9;i++) {
for(int j=2;j<=9;j++) {
System.out.print(j+"*"+i+"="+(j*i)+" ");
}
System.out.prinln();
}
}
위의 코드는 구구단 전체를 출력하는데, 작업을 수행하는데 필요한 값(입력)도, 작업수행의 결과인 반환값(출력)도 없다. 그래서 반환타입이 'void'다.
●메서드의 구현부
메서드의 선언부 다음에 오는 괄호{}를 '메서드의 구현부'라고 한다. 여기에 메서드를 호출 했을 때 수행될 문장들을 넣는다.
return문
메서의 반환타입이 'void'가 아닌 경우 메서드의 구현부에서는 무조건 'return 반환값;'이 포함되어 있어야 한다. 구현부가 수행되면 반환값은 호출한 메서드로 전달되는데 이 값은 반환타입과 일치하거나 적어도 형변환이 가능한 것이어야 한다. 또한 메서드의 매개변수는 여러 개일 수 있지만, 출력(반환값)의 갯수는 최대 하나만 허용된다.
위 코드의 반환값(result)는 int값이다. add메서드의 반환타입 'int'와 일치한다.
지역변수
각기 다른 메서드 안에 선언된 변수들은 서로 이름이 같더라도 선언이 가능하다. 이처럼 메서드 안에 선언된 변수를 '지역변수'라 한다.
int add(int x, int y) {
int result = x + y;
return result;
}
int multiply(int x, int y) {
int result = x * y;
return result;
}
위 코드는 add 메서드와 multiply 메서드를 보여준다. 그런데 메서드 안의 변수들은 공통적으로 'x', 'y', 'result'를 갖는다. 변수들의 이름은 같지만 각기 다른 메서드에 선언된 지역변수들이기 때문에 컴파일 오류가 나지 않는다.
●메서드의 호출
메서드를 정의만 하고 호출하지 않으면 소용이 없다. 메서드를 정의했다면 꼭 메서드를 호출 해야한다. 메서드를 호출하는 방법은 아래와 같다.
메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법
print99danAll(); // void print99danAll()을 호출
int result = add(3, 5). //int add(int x, int y)를 호출하고, 결과를 result에 저장
인수(argument)와 매개변수(parameter)
메서드를 호출 할 때 괄호 안에 지정해준 값들을 '인수(argument)'라 하는데 인자의 개수와 순서는 호출된 메서드의 선언된 '매개변수(parameter)'와 일치해야 한다. 또한 인수는 메서드가 호출되면서 매개변수에 대입되므로, 인자 타입은 매개변수의
타입과 일치하거나 자동 형변환 가능한 것이어야 한다.
만약 메서드에 선언된 매개변수의 개수보다 많은 값을 괄호()에 넣거나 타입이 다른 값을 넣으면 컴파일 에러가 발생한다
int result = add(1, 2, 3); // 에러, 메서드에 선언된 매개변수의 개수가 다름
int result = add(1.0, 2.0); // 에러, 메서드에 선언된 매개변수의 타입이 다름
●메서드의 실행 흐름
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; }
}
MyMath 클래스의 add메서드를 호출하는 과정을 통해를 통해 메서드의 실행흐름을 살펴보도록 하겠다.
MyMath클래스의 'add(long a, long b)'를 호출하기 위해서는 우선 MyMath클래스의 인스턴스 'MyMath mm = new MyMath();'를 생성한 다음 참조변수 mm을 통해 실행을 진행한다. 이후 add메서드를 호출하고 인수 1L와 2L은 메서드 add의 매개변수 a, b 에 각각 대입된다. 이후 add메서드의 구현부가 수행되고 수행이 끝나면 호출한 메서드로 돌아와 문장을 실행한다.
출처:자바의 정석 기초편( 저자: 남궁성, 출판사: 도우출판)
'java > 객체지향' 카테고리의 다른 글
[객체지향] static 메서드와 인스턴스 메서드 (0) | 2021.07.09 |
---|---|
[객체지향] return문과 반환값 (0) | 2021.07.09 |
[객체지향] 변수 (0) | 2021.07.06 |
[객체지향] 객체 (0) | 2021.07.05 |
[객체지향]객체지향 언어, 클래스와 객체 (0) | 2021.07.05 |