continue 즐겨 쓰시나요?

winner의 이미지

대부분의 programming 언어에 반복문 도중 돌아가는 continue 문을 지원하는데요.
저는 이 continue 문을 보면 뭔가 이상하다는 생각을 많이 합니다.
차라리 중첩단계를 하나 더 넣고, 중첩단계가 너무 깊다면 함수로 빼서,
testability를 증진시키는게 좋다고 생각하는데요.

저는 return을 여러 곳에 두는 것도 좋아하지는 않지만 그럭저럭 쓰곤 하는데
continue는 왠만하면 못 봐주겠더군요. 다른 분들은 어떤지 궁금합니다.

Daiquiri의 이미지

방금 “continue가 뭐지?”하는 생각이 들 정도로 continue를 사용한 기억이 없네요.

winner의 이미지

실은 오늘 발견된 bug가 너무 긴 for 문(STL 반복자 관련)을 while 문으로 바꾸는 과정에서
중간에 위치한 continue를 정리하지 않아서 생겼었거든요.

회사 source 보면 continue를 참 많이 쓰더군요.
제가 좋아하는 style로 변경하기도 했는데 version 정리하면서 제가 바꿔놓은 style로 인해서
다른 사람이 병합 혹은 정리할 때 문제가 많다고 해서 고민을 좀 하게 되었습니다.
물론 제 coding style을 고집하는 것은 문제가 있겠죠.
그렇다고 팀내 conding convention이 없으면서 맘대로 하라고 해서 좀 했더니 이런 문제가...

제가 확실히 code 읽는 습관이 부족했다는 점도 인정합니다.
이제는 제 style도 독특한 점이 많은만큼 다른 사람 style도 인정하고 읽는 노력을 해야겠다고
생각하기는 하는데 하지만 역시 continue가 많이 쓰인 source를 보면 왠지 못참겠다는...

emptynote의 이미지

케케묵은 구조적언어 와 절차적언어? 쟁점에 서 있는 goto 논쟁

너무나 깊은 루프를 어떻게 빠져나올것인가?

구조적 언어 지지자들도 그때만큼은 goto문을 인정한다는 교수님 말씀이 기억나네요.

하여간 깊은 루프에서는 막강한 goto문이 정답이지만 goto문 난발시 문제때문에,

단순히 loop만으로 빠져나오도록 하자고 해서 continue가 나온거라 근거는 없지만 신앙처럼 굳게 믿고 있는데..

갑자기 continue가 맘에 안드시는분을 뵙게 되네요.

continue, return의 족보로 따지면 goto문이 큰형님이니깐 난발할 성질의 것은 아닌데요..

도대체 어떻게 짠 프로그램이기에 continue가 보기 싫은 정도일까요.

아래는 제가 continue가 유용하다고 생각하는 정도의 예제입니다.
------------------------------------
while (Iterator.hasNext()) {
Object obj = Iterator.next();
if (obj이 본처리가 필요 없다면) continue;
// 본처리
}

winner의 이미지

예제의 경우 저라면

if (obj이 본처리가 필요하다면)
  본처리

위와 같이 합니다.

goto 논쟁은 지겨우니 살짝 비켜간 논쟁이라고 할까요? ^_^

송효진의 이미지

방법론 명칭이 생각이 안나네요;
'본처리' 가 매우 길 경우 {} 묶음 보다는 아닐경우에 끊어 주는 것이 좋다고 하더군요.
동감이 되더군요.
프로그램이 좀 복잡해져도 depth 가 좀 덜 들어가는 것 같습니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

emptynote의 이미지

본문글이 이제서야 이해가 가네요. ^^;

취향의 문제아닐까요.

소타의 이미지

루프 중간에 continue, goto, return 모두 필요할 땐 씁니다..
쓰라고 만들어 둔 것들을 피해야 할 이유가 전혀 없다고 생각하는데 싫어하시는 이유는 무엇인가요? ㅋ

winner의 이미지

제 편견은 다음과 같습니다.

goto: 다중반복탈출과 기타 상황에서 필요
return: 수학적 표현에 왠지 좀더 어울림. 예) factorial
continue:???

continue를 쓰면 분명 중첩단계를 줄일 수 있다는 장점이 있는데,
중첩단계를 줄여야겠다고 생각이 들만큼 continue 아래에 놓이는 문장들이 길 경우
보통 함수로 만들만한 것이 많은 것 같습니다.
그래서 continue를 보면 goto, break, 다중 return 이상으로 구조가
단순화되지 못했을 거라는 의구심이 강하게 듭니다.

저는 continue를 통한 중첩단계를 줄이는 것이 오히려 단계적인 절차진행구조를
훼손하는 것 같아 장점보다는 단점이 강한 것 같은 느낌을 많이 받습니다.

하지만 역시 이것은 제 개인의 취향이 강한 듯 합니다.
중접이 깊으면 보기도 싫은 사람도 있겠죠.

ymir의 이미지

loop 는 가급적 로직이 한눈에 드러나도록 간결하게 작성하는게 좋습니다.

대부분의 함수가 그러하듯이 페이지가 넘어가거나 너무 복잡하면 실수가 많아지죠.

continue, break 등은 필요하면 쓰되 최소한으로...

condition / main processing routine 등은 inline 으로 빼서, loop 구조를 간결하게 만들면...

복잡한 코드로 인한 실수를 줄일 수 있습니다.

로직 흐름상 continue, break 등은 가급적 loop 의 시작부분이나 맨 뒤쪽에 위치시키는게 좋습니다.

자신의 코드에 스타일이 생기는 건 좋지만.. 일종의 강박관념 비슷한게 생겨버리면, 로직 구성이 경직되어 버립니다.

글로 로직을 표현할 때 별다른 제약을 느끼지 않듯이, 코드로 표현할 때에도 마찬가지입니다.

흐름을 방해하지 않는 선에서라면, 좀 더 유연하게 생각하셔도 좋을 것 같습니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

hongminhee의 이미지

함수형 프로그래밍 스타일을 좋아하면서도 C/C++ 계열 언어에서는 continue도 많이 쓰고 한 함수 안에서 return도 많이 쓰는 편입니다. goto가 없는 언어에서는 한 함수 안에서 예외 주고받고 해서 goto 비슷하게 짤 때도 있습니다. 어차피 외부 인터페이스만 직교적이면 괜찮다는 입장이라… 게다가 함수 하나를 길게 쓰지 않는 편이고요.

홍민희 (VLAAH, LangDev)

이응준의 이미지

최근 2년간 때때로 작성한 스크립트들 수십개를 살펴보았는데 (루비, 파이썬, bash, php) 딱 4번 썼네요.

필요하면 주저하지 않고 사용하지만, 필요할 일이 많지는 않았던 것 같습니다.

continue를 써야 하는 상황을 리팩토링이 필요하다는 신호로 받아들이고 있지도 않고요.

inamind의 이미지

..

inamind의 이미지

요즘은 하드웨어의 power 가 매우 막강해졌기 때문에
코드 자체를 보기 싫게 짜면서 까지 퍼포먼스를 올릴 필요성은 임베디드에서도 많이 못 느끼고 있습니다.
물론 다른 이유에서 코드를 복잡하게 짜는 경우도 있지만요..

코드를 논리 구조적으로 구현하면(혹은 함수만 잘 사용해도) 많은 depth 를 피하고도 간결하고 보기좋게 짤 수 있다고 믿습니다.
개인적인 생각이구요..

continue, return, break, goto 들은 존재 자체가 나쁘다는것이 아니라
해당 구문을 남발하게 되면 애러처리나 구조/기능 변경때 숙련된 프로그래머라고 할지라도 다양한 실수를 유발하기 쉽다고 생각합니다.

너무 복잡한 전처리기 등도 마찬가지 이겠지요.

가끔은(특히 mm쪽을 보면서..) 리눅스 커널이 C++ 이면 얼마나 좋을까 라고 상상합니다. ^^;

jick의 이미지

전 continue를 꽤 자주 쓰는 편인데, if를 쓰면 한번 쓸 때마다 계속 들여쓰기가 되니 continue가 오히려 가독성이 좋다고 느낍니다.

뭐 몇백줄짜리 코드를 루프 안에 넣는다면 문제가 되겠지만, 대여섯 줄을 함수로 빼자니 애매할 경우도 많고, 몇 년에 걸쳐 점점 커져서 몇백줄이 된 루프를 물려받으면 refactoring하기도 쉽지 않죠. (일단 "돌아가는 코드를 고치는" 게 간단한 일이 아닌지라...)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.