사실 처음에 들었을 땐 GOAT 인줄 알았다.
다른 팀의 Text rpg게임 발표 후 튜터님 曰 "goto문은 C샵에서 가급적 권장하지 않습니다." 라는 피드백이 기억이 났다.
특정 상황에서는 goto 문이 유용할 수도 있으나, 대부분의 경우에는 다른 대체 구조를 사용하는 것이 더 바람직 하다고 한다.
인터넷을 뒤져보니 실제로는 절대로 사용하지 말라는 내용도 보이고, 아예 관련 논문까지 있다고 한다.
나 같은 초보자한테는 직관적이고 사용하기 편한 goto문인데..
보다 자세한 이유가 궁금해서 찾아보았다.
엑셀? 팡션? 쓰지마세요.
goto 문은 프로그램의 가독성과 이해도를 떨어뜨릴 수 있다.
스파게티 코드 생성: 무분별하게 사용될 경우, goto는 복잡하고 따라가기 어려운 코드를 만들 수 있다.
이러한 코드는 오류가 발생하기 쉽고, 유지보수가 어렵다.
현대 프로그래밍은 구조적
프로그래밍을 강조한다.
구조적 프로그래밍은 루프, 조건문, 함수 등을 사용하여 프로그램의 흐름을 조직적으로 제어하고 있다.
하지만 goto는 이러한 구조적 흐름을 깨뜨려 프로그램을 혼란스럽게 만들 수 있다.
대부분의 경우, goto의 사용은 for
, while
, do-while
루프와 if-else
조건문 등으로 대체될 수 있는데,
이러한 구조들은 보다 명확하고 구조화된 방법으로 흐름 제어를 할 수 있게 한다.
일부 언어에서는 goto를 오류 처리와 정리 작업에 사용하기도 한다.
하지만 이는 특정 시나리오에 한정된 사용이며, 예외 처리
메커니즘을 갖춘 언어들은 더 나은 해결책을 제공할 수 있다.
goto는 함수 호출이나 루프 오버헤드를 줄이는 방법으로 보일 수 있지만, 현대 컴파일러는 코드 최적화에 매우 효율적이다.
따라서 goto를 사용하여 얻는 성능 향상은 코드의 명확성과 유지보수 가능성에 대한 잠재적 비용에 비해 대체로 미미하다.
C#이 구조적 프로그래밍과 객체 지향 프로그래밍을 강조하기 때문에 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 레이블로 되돌려 반복한다.
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 | 코드 내의 특정 레이블로 이동한다. | 직접적인 점프로 복잡한 흐름을 단순화할 수 있음 | 가독성 저하, 유지보수 어려움, 구조적 프로그래밍 위반 |
for | 초기화, 조건 검사, 증감을 포함한 반복문 | 가독성과 구조성이 뛰어남, 반복 로직에 적합 | 제한된 반복 구조 내에서만 사용 가능 |
while | 조건이 참인 동안 반복 실행되는 반복문 | 조건에 따른 간단한 반복에 적합 | 무한 루프에 빠질 위험 |
if-else | 조건에 따라 서로 다른 코드 블록을 실행하는 조건문 | 조건에 따른 명확한 분기 처리 가능 | 복잡한 조건 처리 시 가독성이 저하될 수 있음 |
위와 같은 여러가지 이유로, C#에서도
goto
문은 특별한 상황이나 예외적인 경우에만 사용하는 것이 좋으며, 일반적인 흐름 제어에는 다른 구조적 프로그래밍 요소들을 사용하는 것이 권장된다.