공통 변수는 public static으로! :: 의존성 분리

tony·2023년 5월 12일
0

Problem ❗


☝️
여러 함수에서 공통적으로 쓰이는 공통변수를 지역적으로 선언하면, 함수분리를 할 수 없다

아래 코드의 문제점이 뭐라고 생각하는가??

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를 변화시키는 것이다.

세부 로직은 다른 함수에 위임한다. 즉, 그저 호출할 뿐이다.
하지만 여러 함수에서 공통적으로 쓰이는 공통변수를 지역적으로 선언하면, 함수분리를 할 수 없다. 모든 함수가 하나의 공통변수를 사용해야하기 때문이다.

그렇다면 이를 어떻게 해결하면 좋을까?

Solve 💡


👍
여러 함수에서 공통적으로 쓰이는 공통변수는 전역으로 선언하자.

👎 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;
}

What I’ve Learned 📝​

Theory 📜​

Note 📓​

여러 함수에서 공통적으로 쓰이는 공통변수는 전역으로 선언하자.

profile
내 코드로 세상이 더 나은 방향으로 나아갈 수 있기를

0개의 댓글