코딩 이야기
JAVA return, 메소드 본문
리턴(retrun)문
리턴값이 있는 메소드
메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 합니다.
만약 return 문이 없다면 컴파일 에러가 발생하고, return 문이 실행되면 메소드는 즉시 종료됩니다.
return 리턴값;
return문의 리턴 값은 리턴 탕비이거나 리턴 타입으로 변환될 수 있어야 합니다. 예를 들어 리턴 타입이 int인 plus()메소드에서는 byte,short,int의 값이 리턴되어 상관없습니다. byte와 short는 int로 자동 타입 변환되어 리턴되기 때문입니다.
리턴값이 없는 메소드:void
리턴값이 없는 메소드는 리턴 타입으로 void를 사용합니다. 그런데 void로 선언된 메소드에서도 return문을 사용할 수 있습니다. 이것은 리턴값을 지정하는 것이 아니라 메소드 실행을 강제 종료 시키는 역활을 합니다.
return;
다음은 gas 값이 0보다 클 경우 계속해서 while문을 실행하고, 0일 경우 return문을 실행해서 run() 메소드를 즉시 종료합니다. while문이 한번 루핑할 때마다 gas를 1씩 감소하기 때문에 언제가는 0이되어 run()메소드를 종료합니다. 만약 while문뒤에 실행문이 추가적으로 더 있을 경우, break문을 반드시 사용해야 합니다. return문은 메소드를 즉시 종료 시키기 때문입니다.
return 문
package ch06;
public class Car5 {
// 필드
int gas;
// 생성자
// 메소드
void setGas(int gas) {
this.gas = gas;
}
boolean isLeftGas() {
if(gas == 0) {
System.out.println("gas가 없습니다.");
return false; // false를 리턴
}
System.out.println("gas가 있습니다.");
return true; // true를 리턴
}
void run() {
while(true) {
if(gas > 0 ) {
System.out.println("달립니다.(gas잔량:"+gas+")");
gas -= 1;
}else {
System.out.println("멈춥니다.(gas잔량:"+gas+")");
return; // 메소드 실행 종료
}
}
}
}
return문
package ch06;
public class Car5Example {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car5 myCar = new Car5();
myCar.setGas(5); // Car5의 setGas() 메소드 호출
boolean gasState = myCar.isLeftGas();
if(gasState) {
System.out.println("출발합니다.");
myCar.run(); // Car5의 run() 메소드 호출
}
if(myCar.isLeftGas()) {// Car5의 isLeftGas() 메소드 호출
System.out.println("gas를 주입할 필요가 없습니다.");
}else {
System.out.println("gas를 주입하세요");
}
}
}
메소드 호출
메소드는 클래스 내·외부의 호출에 의해 실행됩니다. 클래스 내부의 다른 메소드에서 호출할 경우에는 단순한 메소드 이름으로 호출하면 되지만, 클래스 외부에서 호출할 경우에는 우선 클래스로부터 객체를 생성한 뒤 참조 변수를 이용해서 메소드를 호출해야 합니다. 객체가 존재해야 메소드도 존재하기 때문이다.
외부
void 외부메소드() {
Car car = new Car();
car.run();
car.stop();
car.sound();
}
객체내부
[메소드 선언]
void run() {}
void stop() {}
void sound() {}
void 내부메소드() {
run();
stop();
sound();
}
객체 내부에서 호출
클래스 내부에서 다른 메소드르 호출할 경우에는 다음과 같은 형태로 작성하면 됩니다. 메소드가 매개 변수를 가지고 있을 때에는 매개 변수의 타입과 수에 맞게 매개 값을 제공합니다.
메소드( 매개값, ...);
메소드가 리턴값이 없거나, 있어도 받고 싶지 않을 경우 위와 같이 모두 호출이 가능합니다. 리턴 값이 있는 메소드를 호출하고 리턴값을 받고 싶지 않다면 다음과 같이 변수를 선언하고 리턴 값을 대입합니다.
타입 변수 = 메소드(매개값, ... );
↑ ↓
←
리턴값
이때 변수타입은 메소드 리턴 타입과 동일하거나, 자동 타입 변환이 될 수 있어야 한다는 점에 주의 해야합니다. 예를 들어 int는 double 타입으로 자동 변환되기 때문에 int 리턴값은 double 타입 변수에 대입할 수 있습니다.
public class ClassName {
int method1(int x, int y) {
int result = x + y;
return result;
}
void method2() {
int result1 =method1(10,20); // result1에는 30이저장
double result2 =method1(10,20); //result2에는 30.0이 저장
}
}
클래스 내부에서 메소드 호출
package ch06;
public class Calculator2 {
int plus(int x, int y) {
int result = x + y;
return result;
}
double avg(int x, int y) {
double sum = plus(x,y);
double result = sum /2;
return result;
}
void execute() {
double result = avg(7,10);
println("실행결과:"+result);
}
void println(String message) {
System.out.println(message);
}
}
Calculator의 execute() 실행
package ch06;
public class CalculatorExmaple2 {
public static void main(String[] args) {
Calculator2 myCalc = new Calculator2();
myCalc.execute();
}
}
객체 외부에서 호출
외부 클래스에서 메소드를 호출하려면 우선 클래스로부터 객체를 생성해야 합니다. 메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문입니다.
클래스 참조변수 = new 클래스 ( 매개값, ...);
객체가 생성되었다면 참조 변수와 함께 도트(.)연산자를 사용해서 메소드를 호출할 수 있습니다. 도트(.)연산자는 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드에 접근할 때 사용됩니다.
참조변수.메소드( 매개값, ...); // 리턴값이 없거나, 있어도 리턴 값을 받지 않을 경우
타입 변수 = 참조변수,메소드 ( 매개값, ...); // 리턴값이 있고,리턴값을 받고 싶을 경우
클래스 외부에서 메소드 호출
package ch06;
public class Car6 {
// 필드
int speed;
// 생성자
// 메소드
int getSpeed() {
return speed;
}
void keyTurnOn() {
System.out.println("키를 돌립니다.");
}
void run() {
for(int i= 10; i<50; i+=10) {
speed = i;
System.out.println("달립니다.(시속:"+ speed + "km/h)");
}
}
}
클래스 외부에서 메소드 호출
package ch06;
public class Car6Exmaple {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car6 myCar =new Car6();
myCar.keyTurnOn();
myCar.run();
int speed = myCar.getSpeed();
System.out.println("현재 속도:"+speed+"km/h");
}
}
메소드 오버로딩
클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 합니다. 오버로딩의 사전적 의미는 많이 싣는 것을 뜻합니다. 하나의 메소드 이름으로 여러 기능을 담는다라고 해서 붙여진 이름입니다. 메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점입니다.
class 클래스 {
리턴 타입 메소드이름 ( 타입 변수, ...) { ... }
↑ ↑ ↑
상관없슴 동일 매개 변수의 타입
↓ ↓ ↓
리턴 타입 메소드이름 ( 타입 변수, ... ) { ... }
메소드 오버로딩이 필요한 이유는 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서 입니다.
예를 들어 덧셈이 가능한 plus()메소드가 있습니다.
int plus (int x, int y){
int result = x + y;
return result;
}
하지만 double 타입을 값을 덧셈 하기 위해서는 plus() 메소드를 호출할 수 없습니다. 해결방법은 double 타입으로 선언된 puls() 메소드를 하나 더 선언 하는 것입니다.
doulbe plus (double x, doubley){
double result = x + y;
return result;
}
오버로딩된 메소드를 호출할 경우 JVM은 매개값의 타입을 보고 메소드를 선택합니다.
int x =10;
double y = 20.3;
plus(x, y);
위와 같은 경우는 매개 변수의 타입이 일치하지 않을 경우 자동 타입변환이 가능한지 검사하여 최종적으로는 double타입 메소드를 선택합니다.
오버로딩시 주의할 점.
매개 변수의 타입과 개수, 순서가 똑같을 경우 매개 변수의 이름이 다르다고 해서 이것을 메소드 오버로딩이라고 하지않습니다. 또한 리턴 타입만 다르고 매개 변수가 동일해도 오버로딩이 아닙니다. 리턴타입은 JVM이 메소드를 선택할 때 아무런 도움도 주지 못하기 때문입니다.
메소드 오버로딩
Calculator 클래스에 areaRectangle() 메소드를 오버로딩해서 매개값이 1개이면 정사각형의 넓이를, 2개이면 직사각형의 넒이를 계산하여 리턴하도록 했습니다. 어떤 메소드가 호출될지는 매개변수의 개수에 달려 있습니다.
package ch06;
public class Calculator3 {
double areaRectangle(double width) {
return width * width;
}
double areaRectangle(double width, double height) {
return width * width;
}
}
메소드 오버로딩
package ch06;
public class Calcuator3Exmaple {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calculator3 myCalcu = new Calculator3();
// 정사각형의 넒이 구하기
double result1 = myCalcu.areaRectangle(10);
// 직사각형의 넒이 구하기
double result2 = myCalcu.areaRectangle(10, 20);
}
}
'JAVA' 카테고리의 다른 글
JAVA 싱글톤 , final 필드와 상수 (0) | 2023.02.10 |
---|---|
JAVA 인스턴스 멤버와 정적 멤버 (0) | 2023.02.09 |
JAVA 메소드 (0) | 2023.02.08 |
JAVA 생성자 (0) | 2023.02.08 |
JAVA 필드 (0) | 2023.02.07 |