-
Notifications
You must be signed in to change notification settings - Fork 1
Day 10(21.09.14)
객체의 동작에 해당하는 중괄호({}) 블록을 말한다. 각 중괄호 블록은 이름을 가지고 있는데, 이것이 메소드의 이름이 된다.
Method는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성한 뒤에 외부에서 매개값을 받을 수도 있고, 어떤 값을 리턴하는 등 다양한 기능을 수행할 수 있다.
Method의 구성은 다음과 같다.
리턴타입 메소드이름 (매개변수, 매개변수, ...) {
Method 실행 블록
}리턴 타입은 Method가 실행된 후 리턴하는 Value의 타입을 말한다. Method는 리턴값이 있을 수도 있고 없을 수도 있지만, Method가 실행된 뒤에 결과를 호출한 곳에 넘겨줄 경우엔 Return value가 있어야한다. 자동차라는 객체를 예시로 들어보자, 자동차의 시동을 거는 turnOn()이라는 method와 속도를 올리는 acceleration()이라는 method가 있다고 가정할 때, acceleration()이라는 method는 엔진의 회전수, 바퀴의 회전 등 결과를 반환해야 하지만, turnOn()이라는 method는 자동차의 시동만 켜면 그만이다. 즉, turnOn()이라는 method는 reutrn value가 없고, acceleration()이라는 method는 return value가 있다고 생각해야 한다.
이러한 경우에 return value가 없을땐 return type에 void가 와야하며, return value가 있을 경우엔 해당 자료형에 맞는 타입이 와야한다. 예를 들어 바퀴의 회전수 같이 정수형으로 나타나는 method의 경우엔 int가, 엔진의 rpm을 (x1000) 으로 소수점 까지 나타내야할 경우엔 double을 사용해야한다는 것이다.
void turnOn() {...}
int acceleration(int tireSpin) {...}
이와 같은 return type은 method를 호출하는 방법에도 영향을 미치는데,
turnOn();
int numberOfTireSpin = acceleration(20);
turnOn() method는 return value가 없으므로 변수에 저장할 내용이 없다. 따라서 단순히 method만 호출하면 된다. 반면, acceleration() method는 이후 타이어의 회전수를 리턴하기 떄문에 이를 저장할 변수가 있어야 한다. 또한, 이를 받기 위해 method의 return type인 int 타입으로 선언되어야한다. 만약 여기서 numberOfTireSpin이 double로 선언하게 되면 acceleration()의 정수 값을 저장할 수 없기 때문에 컴파일 에러가 발생한다. 희망적인 부분(?)은 return type이 있다고 해서 return value를 반드시 변수에 저장할 필요는 없다. method의 실행이 중요할 경우엔 변수 선언 없이 바로 method를 호출할 수도 있다.
메소드 이름을 작성할땐 다음과 같은 내용을 유의해야 한다.
(1) 숫자로 시작하면 안된다.
(2) $와 _를 제외한 특수문자를 사용하면 안된다.
(3) 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자로 작성한다.(낙타체)
이름은 이 메소드가 어떤 기능을 하는지 쉽게 알 수 있도록 기능 이름으로 지어주는 것이 좋다. 프로그램 실행과는 무관하나 너무 짧거나 길게 작성하지 않도록 한다.
매개 변수는 method가 실행될때 필요한 데이터를 외부에서 받기 위해 사용한다. 이 매개 변수라는 것도 필요한 경우가 있고 없는 경우가 있는데, 위의 turnOn()과 acceleration()의 경우, turnOn() method는 그냥 시동만 걸면 되지만, acceleration() method의 경우 매개 변수가 필요하다. 여기서 매개 변수의 매개 값은 매개 변수의 타입과 같아야 한다. 위에서 acceleration() method의 경우 int 타입 매개 변수를 받고 있으므로 반드시 int 타입으로 변환될 수 있는 값을 넘겨주어야 한다.
메소드 선언에 return type이 있는 method는 반드시 return문을 사용해서 return value를 지정해야 한다. 만약 return type이 있는데도 return문이 없다면 컴파일 에러가 발생한다. return문은 실행되는 즉시 method를 종료시킨다.
return 리턴값;
return문의 return value는 return type이거나 return type으로 변환될 수 있어야 한다. 예를 들면 return type이 int인 메소드에서 byte나 short, int 타입의 값이 return되어도 상관없다. byte와 short은 int로 자동으로 타입이 변환되어 리턴되기 때문이다. 또한, return 문을 사용할때 주의할 점은 return을 사용한 후에 실행문이 오면 "Unreachable code"라는 컴파일 에러가 발생한다. 이는 return; 후의 실행문이 실행되지 않기 떄문인데 다음과 같은 경우엔 컴파일 에러가 발생하지 않는다.
boolean isLeftGas() {
if(gas==0) {
System.out.println("연료가 없습니다.");
return false;
}
System.out.println("연료가 있습니다.");
return true;
}"연료가 있습니다"를 출력하는 문장의 경우, return false; 다음에 있지만 if문의 조건식이 false가 될 경우엔 정상적으로 해당 문장이 실행되기 때문에 컴파일 에러가 발생하지 않는다. 즉, if 문의 조건식(gas==0)이 true가 되면 "연료가 없습니다." 출력문이 실행되고 return false;가 실행되어 메소드는 즉시 종료되고 아래의 실행문은 절대로 실행되지 않는다.
void로 선언되어 return value가 없는 메소드에서도 return문을 사용할 수 있다.
return;
위와 같이 return문을 사용하면 메소드 실행을 강제로 종료시킨다.
아래는 gas 값이 0보다 클 경우 계속해서 while문을 실행하고, 0일 경우 return문을 사용해서 run() 메소드를 종료하는 프로그램이다.
void run() {
while(true) {
if(gas > 0) {
System.out.println("달립니다. (연료 잔량: " + gas + ")");
gas -= 1;
} else {
System.out.println("멈춥니다. (연료 잔량: " + gas + ")");
return;
}
}
}while문이 한 번 반복될 때마다 gas가 1씩 감소되기 때문에 gas가 0이 되는 순간 run() 메소드를 종료한다.
다음 프로그램은 return value가 없는 method를 사용하는 Car 클래스의 예시이다. 출력 결과는 다음과 같다.