24.01.17 TIL - [C#] goto문을 권장하지 않는 이유

JJwoo·2024년 1월 17일
0

C#

목록 보기
15/20
post-thumbnail

사실 처음에 들었을 땐 GOAT 인줄 알았다.


다른 팀의 Text rpg게임 발표 후 튜터님 曰 "goto문은 C샵에서 가급적 권장하지 않습니다." 라는 피드백이 기억이 났다.

특정 상황에서는 goto 문이 유용할 수도 있으나, 대부분의 경우에는 다른 대체 구조를 사용하는 것이 더 바람직 하다고 한다.

인터넷을 뒤져보니 실제로는 절대로 사용하지 말라는 내용도 보이고, 아예 관련 논문까지 있다고 한다.

나 같은 초보자한테는 직관적이고 사용하기 편한 goto문인데..

보다 자세한 이유가 궁금해서 찾아보았다.

엑셀? 팡션? 쓰지마세요.


💥 C 언어에서 goto 문의 사용을 피해야 하는 이유


1. 가독성과 유지보수성 저하

goto 문은 프로그램의 가독성과 이해도를 떨어뜨릴 수 있다.

스파게티 코드 생성: 무분별하게 사용될 경우, goto는 복잡하고 따라가기 어려운 코드를 만들 수 있다.
이러한 코드는 오류가 발생하기 쉽고, 유지보수가 어렵다.

2. 구조적 프로그래밍에 위배

현대 프로그래밍은 구조적 프로그래밍을 강조한다.
구조적 프로그래밍은 루프, 조건문, 함수 등을 사용하여 프로그램의 흐름을 조직적으로 제어하고 있다.
하지만 goto는 이러한 구조적 흐름을 깨뜨려 프로그램을 혼란스럽게 만들 수 있다.

3. 대체 구조의 존재

대부분의 경우, goto의 사용은 for, while, do-while 루프와 if-else 조건문 등으로 대체될 수 있는데,
이러한 구조들은 보다 명확하고 구조화된 방법으로 흐름 제어를 할 수 있게 한다.

4. 오류 처리와 정리 코드

일부 언어에서는 goto를 오류 처리와 정리 작업에 사용하기도 한다.
하지만 이는 특정 시나리오에 한정된 사용이며, 예외 처리 메커니즘을 갖춘 언어들은 더 나은 해결책을 제공할 수 있다.

5. 성능 고려사항

goto는 함수 호출이나 루프 오버헤드를 줄이는 방법으로 보일 수 있지만, 현대 컴파일러는 코드 최적화에 매우 효율적이다.
따라서 goto를 사용하여 얻는 성능 향상은 코드의 명확성과 유지보수 가능성에 대한 잠재적 비용에 비해 대체로 미미하다.

C#이 구조적 프로그래밍과 객체 지향 프로그래밍을 강조하기 때문에 goto 문은 이러한 원칙들을 위반하고 코드의 흐름을 덜 명확하게 만들 수 있다.


말만 봐서는 잘 모르겠으니 예시 코드도 찾아 보았다.

goto 사용 예시

using System;

class Program {
    static void Main() {
        int i = 0;
        start_loop:
        if (i < 10) {
            Console.WriteLine(i);
            i++;
            goto start_loop;
        }
    }
}

이 코드는 goto를 사용하여 0부터 9까지의 숫자를 출력한다.
그리고 goto start_loop;는 프로그램을 start_loop 레이블로 되돌려 반복한다.

for 루프 사용 예시

using System;

class Program {
    static void Main() {
        for (int i = 0; i < 10; i++) {
            Console.WriteLine(i);
        }
    }
}

초기화: int i = 0;는 루프의 시작점에서 변수 i를 0으로 초기화한다.

조건식: i < 10;는 루프가 계속 실행될 조건을 정의합니다. i가 10 미만일 때까지 루프가 계속된다.

증감식: i++는 각 반복 후에 i의 값을 1씩 증가시시킨다.

for 루프는 코드의 흐름을 명확하고 구조적으로 표현해주며, 프로그램의 가독성과 유지보수성을 향상시킨다.

이는 goto 문을 사용하는 것보다 훨씬 더 선호되는 방식.


🧿 goto vs 다른 제어문 비교표

제어문설명장점단점
goto코드 내의 특정 레이블로 이동한다.직접적인 점프로 복잡한 흐름을 단순화할 수 있음가독성 저하, 유지보수 어려움, 구조적 프로그래밍 위반
for초기화, 조건 검사, 증감을 포함한 반복문가독성과 구조성이 뛰어남, 반복 로직에 적합제한된 반복 구조 내에서만 사용 가능
while조건이 참인 동안 반복 실행되는 반복문조건에 따른 간단한 반복에 적합무한 루프에 빠질 위험
if-else조건에 따라 서로 다른 코드 블록을 실행하는 조건문조건에 따른 명확한 분기 처리 가능복잡한 조건 처리 시 가독성이 저하될 수 있음

위와 같은 여러가지 이유로, C#에서도 goto 문은 특별한 상황이나 예외적인 경우에만 사용하는 것이 좋으며, 일반적인 흐름 제어에는 다른 구조적 프로그래밍 요소들을 사용하는 것이 권장된다.

profile
개발 모코코

0개의 댓글