☝️
여러 함수에서 공통적으로 쓰이는 공통변수를 지역적으로 선언하면, 함수분리를 할 수 없다
아래 코드의 문제점이 뭐라고 생각하는가??
private static int move(int[] point, int[] dx, int[] dy, int n) {
// 재귀하기까지 걸린 시간
int timeSpentToReturn = 0;
// 입력횟수만큼 이동
for (int i = 0; i < n; i++) {
// 이동방향
char direction = scanner.next().charAt(0);
// 이동칸
int scalar = scanner.nextInt();
// N에 따른 이동
if (direction == 'N') {
for (int j = 1; j <= scalar; j++) {
point[0] += dx[0];
point[1] += dy[0];
++timeSpentToReturn;
// 만약 재귀하였다면 이동시간 반환
if (hasReturned(point))
return timeSpentToReturn;
}
}
// S에 따른 이동
if (direction == 'S') {
for (int j = 1; j <= scalar; j++) {
point[0] += dx[1];
point[1] += dy[1];
++timeSpentToReturn;
// 만약 재귀하였다면 이동시간 반환
if (hasReturned(point))
return timeSpentToReturn;
}
}
if (direction == 'E') {
for (int j = 1; j <= scalar; j++) {
point[0] += dx[2];
point[1] += dy[2];
++timeSpentToReturn;
// 만약 재귀하였다면 이동시간 반환
if (hasReturned(point))
return timeSpentToReturn;
}
}
if (direction == 'W') {
for (int j = 1; j <= scalar; j++) {
point[0] += dx[3];
point[1] += dy[3];
++timeSpentToReturn;
// 만약 재귀하였다면 이동시간 반환
if (hasReturned(point))
return timeSpentToReturn;
}
}
}
return -1;
}
한 가지 가장 중요한 이슈는 바로 함수 분리가 안 된다는 것이다.
그렇다면 왜 안 될까?
그 이유는 여러 로직에 사용되는 공통변수를 함수 내부에 선언했기 때문이다.
여러 로직을 사용하는 하나의 함수 안에 선언하다보니 로직 분리가 안 된다.
위 코드를 요약해보자면 이와 같을 것이다.
private static int move(int[] point, int[] dx, int[] dy, int n) {
// 재귀하기까지 걸린 시간
int timeSpentToReturn = 0;
// 입력횟수만큼 이동
for (int i = 0; i < n; i++) {
// 이동방향
char direction = scanner.next().charAt(0);
// 이동칸
int scalar = scanner.nextInt();
/** 방향과 칸에 따른 이동 후 시간 증가 :: timeSpentToReturn 사용 **/
if(...){
timeSpentToReturn~~~
}
if(...){
timeSpentToReturn~~~
}
...
}
return -1;
}
방향과 칸에 따른 이동 후 시간 증가로직은 여러 로직이 존재하며, 이는 수정되거나 추가될 수 있을 것이다.
위 move함순의 역할은 단 한 가지이다.
인자값 dx,dy를 통해 이동방향과 칸에 따라 인자값 point를 변화시키는 것이다.
세부 로직은 다른 함수에 위임한다. 즉, 그저 호출할 뿐이다.
하지만 여러 함수에서 공통적으로 쓰이는 공통변수를 지역적으로 선언하면, 함수분리를 할 수 없다. 모든 함수가 하나의 공통변수를 사용해야하기 때문이다.
그렇다면 이를 어떻게 해결하면 좋을까?
👍
여러 함수에서 공통적으로 쓰이는 공통변수는 전역으로 선언하자.
👎 code
private static int move(int[] point, int[] dx, int[] dy, int n) {
// 재귀하기까지 걸린 시간
int timeSpentToReturn = 0;
// 입력횟수만큼 이동
for (int i = 0; i < n; i++) {
// 이동방향
char direction = scanner.next().charAt(0);
// 이동칸
int scalar = scanner.nextInt();
/** 방향과 칸에 따른 이동 후 시간 증가 :: timeSpentToReturn 사용 **/
if(...){
timeSpentToReturn~~~
}
if(...){
timeSpentToReturn~~~
}
...
}
return -1;
}
위 코드에서 여러 함수의 공통 변수인 timeSpentToReturn을 전역적으로 선언하면 함수 분리를 할 수 있다.
이를 수정하면 다음과 같이 수정할 수 있을 것이다.
👍 code
// 재귀하기까지 걸린 시간
public static int timeSpentToReturn = 0;
private static int move(int[] point, int[] dx, int[] dy, int n) {
// 입력횟수만큼 이동
for (int i = 0; i < n; i++) {
// 이동방향
char direction = scanner.next().charAt(0);
// 이동칸
int scalar = scanner.nextInt();
/** 방향과 칸에 따른 이동 후 시간 증가 :: timeSpentToReturn 사용 **/
if( .. )
callA()
if( .. )
callB()
}
return -1;
}
여러 함수에서 공통적으로 쓰이는 공통변수는 전역으로 선언하자.