메소드 선언은 객체의 동작을 실행 블록으로 정의하는 것이며, 메소드 호출은 실행 블록을 실제로 실행하는 것이다. 메소드는 객체 내부에서도 호출되지만 다른 객체에서도 호출될 수 있다.
1. 메소드 선언
1-1. 리턴 타입
리턴 타입은 메소드가 실행한 후 호출한 곳으로 전달하는 결과값의 타입이다. 리턴값이 없는 메소드는 void로 작성한다.
void powerOn() {...} // 리턴값 없음
double divide(int x, int y) {...} // double 타입 값을 리턴
리턴 타입이 있는 메소드는 실행블록 안에서 return 문으로 리턴값을 반드시 지정한다.
1-2. 메소드명
첫 문자를 소문자로 시작하고, camel 스타일로 작성한다.
void run() {...}
void setSpeed(int speed) {...}
String getName() {...}
1-3. 매개변수
매개변수는 메소드를 호출할 때 전달한 매개값을 받기 위해 사용하며, 전달할 매개값이 없다면 매개변수는 생략 가능하다.
int sum(int x, int y) {...}
1-4. 실행 블록
메소드 호출 시 실행되는 부분이다.
예제 코드
public class Calculator {
// 리턴값이 없는 메소드 선언
void powerOn() {
System.out.println("on");
}
// 리턴값이 없는 메소드 선언
void powerOff() {
System.out.println("off");
}
// 호출 시 두 정수 값을 전달받고,
// 호출한 곳으로 결과값 int를 리턴하는 메소드 선언
int plus(int x, int y) {
int result = x + y;
return result; // 리턴 값 지정
}
// 호출 시 두 정수 값을 전달받고,
// 호출한 곳으로 결과값 double를 리턴하는 메소드 선언
double divide(int x, int y) {
double result = (double) x / (double) y;
return result; // 리턴 값 지정
}
}
2. 메소드 호출
메소드 호출은 메소드 블록을 실행하는 것이다. 클래스에서 메소드를 선언했다고 바로 호출할 수 있는 것은 아니며, 메소드는 객체의 동작으로 객체가 존재하지 않으면 메소드를 호출할 수 없다.
클래스로부터 객체가 생성된 후에 메소드는 생성자와 다른 메소드 내부에서 호출될 수 있고, 객체 외부에서도 호출될 수 있다.
객체 내부에서는 단순히 메소드명으로 호출하지만, 외부 객체에서는 참조 변수와 도트(.)연산자를 이용하여 호출한다.
메소드가 매개변수를 가지고 있을 때는 호출할 때 매개변수의 타입과 수에 맞게 매개값을 제공한다.
메소드가 리턴값이 있을 경우 대입 연산자를 사용해서 다음과 같이 리턴값을 변수에 저장 가능하며, 변수 타입은 메소드의 리턴 타입과 동일하거나 자동 타입 변환이 가능해야 한다.
타입 변수 = 메소드();
메소드 호출 예제 코드
public class CalculatorExample {
public static void main(String[] args) {
// Calculator 객체 생성
Calculator myCalc = new Calculator();
// 리턴값이 없는 powerOn() 메소드 호출
myCalc.powerOn();
// plus 메소드 호출 시 5,6 매개값 제공
// 덧셈 결과를 리턴 받아 result1 변수에 대입
int result1 = myCalc.plus(5, 6);
System.out.println("result1 = " + result1);
int x = 10;
int y = 4;
double result2 = myCalc.divide(x, y);
System.out.println("result2 = " + result2);
myCalc.powerOff();
}
}
3. 가변길이 매개변수
메소드 호출 시 매개변수의 개수에 맞게 매개값을 제공한다. 메소드가 가변길이 매개변수를 가지고 있다면 매개변수의 개수와 상관없이 매개값을 줄 수 있다.
가변길이 매개변수 선언
int sum(int ... values) {
}
int result = sum(1, 2, 3);
가변길이 매개변수는 메소드 호출 시 매개값을 쉼표로 구분하여 개수와 상관없이 제공 가능하다.
int[] values = {1, 2, 3};
int result = sum(values);
int result = sum(new int[] {1, 2, 3});
매개값들은 자동으로 배열 항목으로 변환되어 메소드에 사용되어 메소드 호출 시 직접 배열을 매개값으로 제공 가능하다.
예제 코드
public class Computer {
// 가변길이 매개변수를 갖는 메소드 선언
int sum(int... values) {
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
}
public class ComputerExample {
public static void main(String[] args) {
// Computer 객체 생성
Computer myCom = new Computer();
// sum() 메소드 호출 시 매개값 1, 2, 3 제공
// 합산 결과를 리턴 받아 result1 변수에 대입
int result1 = myCom.sum(1, 2, 3);
System.out.println("result1 = " + result1);
int result2 = myCom.sum(2, 5, 3);
System.out.println("result2 = " + result2);
int[] values = {1, 2, 3, 4, 5};
int result3 = myCom.sum(values);
System.out.println("result3 = " + result3);
int result4 = myCom.sum(new int[]{1, 2, 3});
System.out.println("result4 = " + result4);
}
}
4. return 문
return 문은 메소드의 실행을 강제 종료하고 호출한 곳으로 돌아간다. 메소드 선언에 return 타입이 있을 경우 return 문 뒤에 리턴값을 추가로 지정한다.
return 문 이후 실행문 작성 시 'Unreachable code' 컴파일 에러 발생하는데, return 문 이후의 실행문은 결코 실행되지 않는다.
예제 코드
public class Car {
// 필드 선언
int gas;
// 리턴값이 없는 메소드로 매개값을 받아서 gas 필드값을 변경
void setGas(int gas) {
this.gas = gas;
}
// 리턴값이 boolean인 메소드로 gas 필드값이 0이면 false, 아니면 true
boolean isLeftGas() {
if (gas == 0) {
System.out.println("no gas");
// false 리턴하고 메소드 종료
return false;
}
System.out.println("ok gas");
// true 리턴하고 메소드 종료
return true;
}
// 리턴값이 없는 메소드로 gas 필드값이 0이면 return 문으로 메소드 종료
void run() {
while (true) {
if (gas > 0) {
System.out.println("gas = " + gas);
gas -= 1;
} else {
System.out.println("gas = " + gas);
return;
}
}
}
}
public class CarExample {
public static void main(String[] args) {
// 객체 생성
Car myCar = new Car();
// 리턴값이 없는 setGas() 메소드 호출
myCar.setGas(5);
// isLeftGas() 메소드를 호출해서 받은 리턴값이 true일 경우 if 블록 실행
if (myCar.isLeftGas()) {
System.out.println("run");
// 리턴값이 없는 run() 메소드 호출
myCar.run();
}
System.out.println("need gas");
}
}
5. 메소드 오버로딩
메소드 오버로딩은 다양한 매개값을 처리하기 위해 메소드 이름은 같지만 매개변수의 타입, 개수, 순서가 다른 메소드를 여러개 선언한다.
예제 코드
public class Calculator {
double areaRectangle(double width) {
return width * width;
}
double areaRectangle(double width, double height) {
return width * height;
}
}
public class CalculatorExample {
public static void main(String[] args) {
Calculator cal = new Calculator();
// 정사각형
double result1 = cal.areaRectangle(10);
// 직사각형
double result2 = cal.areaRectangle(10, 20);
System.out.println("result1 = " + result1);
System.out.println("result2 = " + result2);
}
}
'IT > Java' 카테고리의 다른 글
[Java] final 필드와 상수 (0) | 2024.03.05 |
---|---|
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2024.03.05 |
[Java] 생성자 선언과 호출 (0) | 2024.02.29 |
[Java] 클래스 필드 선언과 사용 (0) | 2024.02.29 |
[Java] 클래스 객체 생성 (0) | 2024.02.29 |