# 메소드 스코프 리뷰
#### CODE <a class='btn btn-default' href='/codes/26868'>Link</a>
```
public class MethodScope {
public static void main(String[] args) {
// main 메소드의 지역변수 score
int score = 88;
System.out.printf("score = %d in main()\n", score);
// Record 클래스의 메소드 수행
Record.foo(score);
// main 메소드의 지역변수 score 출력
System.out.printf("score = %d in main()\n", score);
Record.foo(score); //
> 이때 한번 더 foo 를 사용하면 78이 아닌 68이 나오게 하려면 어떻게 해야하나요..? super을 이용해 변수를 따로
> 보 관하면 되는 건가요..?
}
}
class Record {
// 클래스 메소드
public static void foo(int score) {
// printMinus10 메소드의 파라미터 score의 값을 10 감소
score -= 10;
// printMinus10 메소드의 파라미터 score의 값을 출력
System.out.printf("score = %d in foo()\n", score);
}
}
```
#### INPUT
```
```
#### OUPUT
```
score = 88 in main()
score = 78 in foo()
score = 88 in main()
```
goodlife1359님의 답변
Record.foo(score); 이때 호출되는 foo메소드의 반환타입을 int로 선언합니다.
class Record {
// 클래스 메소드
public static int foo(int score) {
score -= 10;
System.out.printf("score = %d in foo()\n", score);
return score;
}
}
foo메소드가 실행완료된후 foo메소드가 호출된곳으로 score값을 반환해줍니다.
score = Record.foo(score);
그러면 현재 reScore 변수에 저장된 값은 78입니다.
다시한번 foo메소드를 호출합니다.
Record.foo(score);
이때 foo메소드의 파리미터(전달값)로 score를 넘겨줍니다.
이때 넘겨지는 값은 78이 넘겨집니다.
foo메소드가 실행되면 score에 저장된 값이 78이기때문에 foo메소드 안에서 score -= 10; 연산을 수행하면 68이 됩니다.
그러면 return을 사용해서 score변수를 foo메소드가 호출된 곳으로 반환해줍니다.
두번째 Record.foo(score);가 수행된후 값을 저장하는 변수를 re2Score라고 하면 score에 68이 저장되 있는 상태입니다. 두번째 foo 메소드까지 실행 완료된후 score를 출력하면 68이 출력됩니다.
코드를 정리하면
public class MethodScope {
public static void main(String[] args) {
int score = 88;
System.out.printf("score = %d in main()\n", score);
score = Record.foo(score);//여기서 score의 값은 88
//메소드 실행이 완료된후 score의 값은 78
System.out.printf("score = %d in main()\n", score);//78이 출력됨
score = Record.foo(score); // score의 값은 78
//메소드 실행이 완료된후 score의 값은 68
System.out.printf("score = %d in main()\n", score);//68이 출력됨
}
}
class Record {
public static int foo(int score) {
score -= 10;
System.out.printf("score = %d in foo()\n", score);
return score;//계산 완료한 값을 메소드가 호출된 곳으로 반환해줌
}
}
이렇게 됩니다.
score = Record.foo(score);
System.out.printf("score = %d in main()\n", score);
score = Record.foo(score);
System.out.printf("score = %d in main()\n", score);
정리하면 첫번째로 호출되는 foo메소드의 반환값을 score변수에 저장한후 foo메소드가 두번째로 호출될때 score를 전달값으로 넘겨주면 두번째 foo메소드가 실행되기 전에 score변수에 저장된 값은 78이었지만 두번째 foo메소드가 실행된후 score의 값은 68이 됩니다.
sehongpark님의 답변
# 메소드의 결과값을
반환 받아 다시 출력하는 방법이 있겠습니다.
```
public class MethodScope {
public static void main(String[] args) {
int score = 88;
System.out.printf("score = %d in main()\n", score);
// 결과를 value에 저장
int value = Record.foo(score);
System.out.printf("score = %d in main()\n", score);
// value 값을 전달
Record.foo(value);
}
}
class Record {
// 클래스 메소드
public static int foo(int score) {
score -= 10;
System.out.printf("score = %d in foo()\n", score);
return score;
}
}
```
## PS.
질문 감사합니다!