1.메서드
메서드란?
-수학의 함수와 유사
- 작업을 수행하기 위한 명령문의 집합
- 어떤 값을 입력받아서 처리하고 그 결과를 돌려준다.
(입력받는 값이 없을 수도 있고 결과를 돌려주지 않을 수도 있다.)
▶ 메서드의 장점과 작성지침
- 반복적인 코드를 줄이고 코드의 관리가 용이하다.
- 반복적으로 수행되는 여러 문장을 메서드로 작성한다.
- 하나의 메서드는 한 가지 기능만 수행하도록 작성하는 것이 좋다.
- 관련된 여러 문장을 메서드로 작성한다.
<중복된 코드의 제거 >
이렇게 코드가 중복되면 아래처럼 printArr이라는 메서드로 만들어서 증복을 제거한다.
static int showMenu() {//나중에 내용을 완성한다}
static voin inputRecord() {//나중에 내용을 완성한다}
static void changeRedcord {//나중에 내용을 완성한다}
static void deleteRedcord {//나중에 내용을 완성한다}
static void searchRedcord {//나중에 내용을 완성한다}
static void showRedcordList {//나중에 내용을 완성한다}
public static void main(String args[]){
...
switch(showMenu()){
case 1: inputRecord() break;
case 2: changeRecord() break;
case 3: deleteRecord() break;
case 4: searchRecord() break;
default: showRecordList();
}
}
2. 메서드의 선언과 구현
메서드는 선언부(header)와 구현부(body)로 이루어진다.
메서드 선언부
메서드 선언부는 '메서드의 이름'과 '매개변수 선언', 그리고 '반환타입'으로 구성되어 있으며, 메서드가 작업을 수행하기 위해 어떤 값들을 필요로하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.
메서드 선언부는 후에 변경 사항이 발생하지 않도록 신중히 작성해야한다. 메서드의 선언부를 변경하게 되면,
그 메서드가 호출되는 모든 곳도 같이 변경해야하기 때문이다.
매개변수 선언(parameter declaration)
매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것이며, 필요한 값의 개수만큼 선언한다.
각 변수 간의 구분은 쉼표(,)로 구분한다.
일반적인 변수 선언과 달리 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다.
선언할 수 있는 매개변수의 개수는 거의 제한이 없지만,
만일 입력해야할 값의 개수가 많은 경우에는 배열이나 참조변수를 사용하면 된다.
입력받을 필요가 없다면 괄호()안에 아무것도 적지 않는다.
매서드의 이름(method name)
메서드는 특정 작업을 수행하므로 메서드의 이름은 'add'처럼 동사인 경우가 많다. 이름만으로 메서드의 기능을 쉽게 알 수 있도록 함축적이면서 의미있는 이름을 짓도록 해야한다.
반환타입(return type)
메서드의 작업 수행 결과(출력)인 '반환값'의 타입을 적는다.
반환값이 없는 경우, 반환타입으로 'void'를 적는다.
void print99danAll() {
for(int i=1; i<=9; i++) {
for(int j=2; j<=9; j++) {
System.out.println(i+"*"+j+"="+(i*j));
}
}System.out.println();
}
}
메서드의 구현부(method body, 메서드 몸통)
메서드의 선언부 다음에 오는 괄호{}를 '메서드의 구현부'라고 하는데, 여기에 메서드를 호출했을 때 수행될 문장들을 적는다.
return문
메서드의 반환타입이 'void'가 아닌 경우, 구현부 안에{ }안에 'return반환값'이 반드시 포함되어 있어야한다.
이 문장은 작업을 수행한 결과인 반환값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야한다.
여러개의 변수를 선언할 수 있는 매개변수와 달리, return문은 단 하나의 값만 반환할 수 있는데, 메서드로의 입력(매개변수)은 여러 개일 수 있어도 출력(반환값)은 최대 하나만 허용한다.
지역변수(local variable)
메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메서드라면 같은 이름의 변수를 선언해도 된다. 이처럼 메서드 내에 선언된 변수를 '지역변수'라고 한다.
지역변수 : x, y, result
(이름만 같을 뿐 서로 다른 변수)
메서드가 종료되면 모두 사라진다.
*매개변수도 메서드 내에 선언된 것이므로 지역변수다.
2. 메서드의 호출
메서드를 정의했어도 호출하지 않으면 아무일도 일어나지 않는다. 메서드를 호출해야만 구현부{}의 문장들이 수행된다.
인자(argument)와 매개변수(parameter)
메서드를 호출할 때 괄호()안에 지정해준 값들을 '인자' 또는 '인수'라고 하는데,
인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야한다.
그리고 인자는 메서드가 호출되면서 매개변수에 대입되므로, 인자의 타입은 매개변수의 타입과 일치하거나
자동 형변환이 가능해야한다.
int result = add(1,2,3); //에러. 메서드에 선언된 매개변수의 개수가 다름
int result = add(1.0, 2.0); //에러. 메서드에 선언된 매개변수의 타입이 다름
반환타입이 void가 아닌 경우, 메서드가 작업을 수행하고 반환한 값을 대입연산자로 변수에 저장하는 것이 보통이지만,
저장하지 않아도 문제가 되지 않는다.
int result =add(3,5); //int add(int x, int y)의 호출결과를 result에 저장
add(3,5) //ok. 메서드 add가 반환한 결과를 사용하지 않아도 된다.
메서드의 실행 흐름
같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만 static메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.
class MyMath{
long add(long a, long b){
long result = a+b;
return result;
//return a+b; //위의 두 줄을 한줄로 표현
}
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(long a, long b)'를 호출하기 위해서는 먼저 MyMath mm = new MyMath(); 와 같이 해서,
MyMath클래스의 인스턴스를 생성한 다음 참조변수 mm을 통해야한다.
add메서드의 매개변수 타입이 long이므로 long 또는 long으로 자동 형변환이 가능한 값을 지정해줘야한다.
메서드는 호출시 넘겨받은 값으로 연산을 수행하고 그 결과를 반환하면서 종료된다. 반환된 값은 대입연산자에 의해 변수 value에 저장된다. 메서드의 결과를 저장하기 위한 변수 value역시 반환값과 같은 타입이거나 반환값이 자동 형변환되어 저장될 수 있는 타입이어야한다.
예6)
public class MyMathTest {
public static void main(String[] args) {
MyMath mm = new MyMath(); // 1.인스턴스 생성
// 2.메서드 호출
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;
}
}
'double a =5L;' 을 수행했을 때와 같이 long형의 값인 5L은 double형 값인 5.0으로 자동 형변환되어 divide의 매개변수 a에 저장된다. 그래서 divide의 메서드에 두 개의 정수값(5L, 3L)을 입력하여 호출했음에도 불구하고 연산결과가 double형의 값이 된다.
'JAVA > 객체지향프로그래밍1' 카테고리의 다른 글
[JAVA] 호출 스택(call stack) (0) | 2021.06.20 |
---|---|
[JAVA] return문 (0) | 2021.06.20 |
[JAVA] 변수와 메서드-변수 (0) | 2021.06.19 |
[JAVA] 객체 배열 (0) | 2021.06.18 |
[JAVA] 객체와 인스턴스 (0) | 2021.06.18 |