메소드?
- 객체의 동작에 해당하는 중괄호{}블록.
- 메소드를 호출하면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행
리턴타입 메소드이름 ([매개변수선언, ...]){ //메소드 선언부
//메소드 실행부
}
void일 경우 리턴값이 없다. 다만 return문을 사용 할 수 있는데, 이 경우 리턴값을 지정하는 것이 아니라 메소드 실행을 강제 종료시키는 역할을 한다.
double divide(int x, int y) {
double result = (double)x / y;
return result;
}
double result = divide(10.5, 20.0);
리턴타입이 double , 매개변수가 int 타입인 divide에
매개값을 double값으로 넣어주게되면 에러가 발생한다
매개값은 반드시 매개 변수의 타입에 맞는 값이어야하며, 메소드가 int타입 매개변수를 갖고있다면 호출 시 매개값으로 int값이나 int로 변환할 수 있는값을 넘겨주어야한다
예제
package a220706;
public class Calculator {
void powerOn() {
System.out.println("전원이 켜집니다");
}
int plus(int x, int y) {
int result = x + y;
return result;
}
double divide(int x, int y) {
double result = (double)x / y;
return result;
}
void powerOff() {
System.out.println("전원을 끕니다");
}
}
package a220706;
public class CalculatorEx {
public static void main(String[] args) {
Calculator cal = new Calculator();
cal.powerOn();
int result = cal.plus(5, 6);
System.out.println("Result: " + result);
byte x = 10;
byte y = 35;
int resultB = cal.plus(x, y);
System.out.println("ResultB: " + resultB);
cal.powerOff();
}
}
매개 변수의 개수를 모를 경우
메소드의 매개변수는 개수가 이미 정해져 있는 것이 일반적이나, 메소드 선언 시 매개변수의 개수를 알 수 없는 경우도 있다.
int sum(int[] values){}
이때 해결책은 매개변수를 배열타입으로 선언하는 것이다
int[] values = {1, 2, 3};
int result = sum(values);
int result = sum(new int[] {1, 2, 3, 4, 5);
메소드를 호출 할 때 배열을 넘겨줌으로써 배열의 항목값들을 전달 할 수 있으며, 배열의 항목 수는 호출 시 결정된다
하지만 이렇게 매개변수를 배열 타입으로 선언하면 메소드 호출 전 배열생성의 불편함이 있다.
이때는 배열을 생성하지 않고 값의 목록만 넘겨주면 된다
int sum(int ...values){}
int result = sum(1, 2, 3);
int result = sum(1, 2, 3, 4, 5);
예제
package a220706;
public class Computer {
int sum(int[] values) {
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
int sum2(int ... values) {
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
}
위처럼 매개변만 다르고 메소드 실행문이 완전 일치하는 것을 볼 수 있다
package a220706;
public class ComputerEx {
public static void main(String[] args) {
Computer computer = new Computer();
int[] values = {1,2,3};
int result = computer.sum(values);
System.out.println("result: " + result);
int result2 = computer.sum(new int[] {1, 2, 3, 4, 5});
System.out.println("result2: " + result2);
int result3 = computer.sum2(1, 2, 3);
System.out.println("result3: " + result3);
int result4 = computer.sum2(new int[] {1, 2, 3, 4, 5});
System.out.println("result4: " + result4);
}
}
return
package a220706;
public class Car {
int gas;
void setGas(int gas) {
// 리턴값이 없는 메소드로 매개값을 받아 gas필드값 변경
this.gas = gas;
}
boolean isLeftgas() {
if (gas == 0) {
System.out.println("gas가 없습니다");
return false;
}
System.out.println("gas가 있습니다");
return true; //boolean에 대한 값 반환
}
void run() {
while (true) {
if(gas > 0) {
System.out.println("달립니다.(gas잔량: " + gas + ")");
gas -= 1;
} else {
System.out.println("멈춥니다.(gas잔량: " + gas + ")");
return; //메소드 실행 종료
}
}
}
}
package a220706;
public class CarEx {
public static void main(String[] args) {
Car car = new Car();
car.setGas(5);
boolean gasState = car.isLeftgas();
if(gasState) {
System.out.println("출발합니다");
car.run();
}
if(car.isLeftgas()) {
System.out.println("gas주입 필요 없음");
} else {
System.out.println("gas주입 필요");
}
}
}
메소드 오버로딩(overloading)
- 사전적의미로는 많이 싣는 것을 뜻하며, 하나의 메소드 이름으로 여러 기능을 담아 붙여짐
- 매개변수의 타입, 개수, 순서중 하나가 달라야한다
가장 대표적인 예는 println()메소드.
호출할 때 주어진 매개값의 타입에 따라 오버로딩된 println()메소드들 중 하나를 호출한다.
예제
package a220706;
public class Square {
//정사각형의 넓이
double areaRectangle(double width) {
return width * width;
}
//직사각형의 넓이
double areaRectangle(double width, double height) {
return width * height;
}
}
package a220706;
public class SquareEx {
public static void main(String[] args) {
Square square = new Square();
double result = square.areaRectangle(10);
double result2 = square.areaRectangle(10, 20);
System.out.println("정사각형 넓이 = " + result);
System.out.println("직사각형 넓이 = " + result2);
}
}
정리
선언부: 메소드 선언부는 리턴타입, 메소드이름, 매개변수 선언부분
void: 리턴값이 없는 메소드는 리턴타입으로 void를 기술
매개변수: 메소드 호출 시 제공되는 매개값은 메소드 선언부의 매개 변수에 차례대로 대입되어, 메소드 블록 실행시 이용
리턴문: 메소드 선언부에 리턴 타입이 있을시 리턴값 지정을 위해 return문 필수. void라면 필요없으나 메소드 실행 종료를 위해 사용할 수도 있음
호출: 메소드를 실행하려면 '메소드 이름(매개값, ...)'형태로 호출
오버로딩: 클래스 내 같은 이름의 메소드를 여러개 선언하는 것. 매개변수타입, 개수, 순서 중 하나가 달라야 함
'개발 > JAVA' 카테고리의 다른 글
[Java] Getter & Setter (0) | 2022.07.08 |
---|---|
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2022.07.07 |
[Java] 생성자(constructor) (0) | 2022.07.05 |
[Java] 필드(field) (0) | 2022.07.04 |
[Java] 객체 지향 프로그래밍 (OOP) (0) | 2022.07.01 |