스탠포드식 쉬운 프로그래밍 / 코딩 첫걸음 (7) - for & while (반복문)

스탠포드식 쉬운 프로그래밍 / 코딩 첫걸음 (7) - for & while (반복문) 본문

Developer Projects

스탠포드식 쉬운 프로그래밍 / 코딩 첫걸음 (7) - for & while (반복문)

KRONNA 2016.07.01 10:02


아무리 먼 길도 한 발짝씩 걸어가면 언젠가는 도달할 수 있습니다. 이걸 프로그래머의 관점에서 해석하자면 "한발짝 걷는다"는 명령을 계속 반복하면 언젠가는 문제를 해결할 수 있다고도 말할 수 있죠. "한 발짝 걷는다", "한 발짝 걷는다", "한 발짝 걷는다"처럼 어색하게 여러번 같은 명령을 내리는 것보다 "한 발짝 걷는다"라는 명령은 한번만 적고 얼만큼 반복할 것인지를 적는 것이 훨씬 간결합니다. 그리고 그게 바로 반복문이 존재하는 이유입니다.




우리는 오늘 두가지 반복문을 배울 예정인데요, 첫번째 반복문은 바로 "for loop (for 루프)"입니다. for loop는 보기에 복잡해 보이지만 사실 한 부분만 수정하면 되기 때문에 걱정하실 필요는 없어요. for 루프는 이렇게 작성합니다:


for (int i = 0; i < count; i++) {

실행할 명령

}


for 루프는 명령을 정확히 몇번 반복하고 싶은지 미리 알고 있을 때 사용하는 반복문입니다. 만약 move();를 5번 실행하고 싶다면 아래처럼 작성합니다:


for (int i = 0; i < 5; i++) {

move();

}



"미치광이는 같은 행동을 반복하면서 다른 결과가 나오기를 기대하는 사람이다" - 알버트 아인슈타인


아인슈타인은 같은 행동을 반복하면서 다른 결과가 나오기 기대하는 사람을 미치광이라 불렀지만, 프로그래밍에선 사실 같은 명령을 반복하다보면 다른 상황이 나오긴 나옵니다. 지금 카렐 앞에 벽이 없다고 해도 move();를 계속 반복하다 보면 언젠가는 카렐 앞에 벽이 있는 상황이 나오게 되죠. 우리가 배울 두번째 반복문인 "while loop (while 루프)"는 바로 이런 사실을 이용하는 반복문입니다. while 루프는 이렇게 작성합니다:


while ([어떤 상황]) {

실행할 명령

}


위 코드는 이런 의미를 가지고 있습니다: "[어떤 상황]인 경우, 실행할 명령을 실행하고, [어떤 상황]인지 다시 확인하여라. 만약 [어떤 상황]이면 다시 반복하라." 한번 예제를 살펴볼까요?


while (frontIsClear()) {

move();

}


위 코드를 실행하면 카렐은 앞에 벽이 있는지 없는지 확인합니다. 만약 벽이 없다면 앞으로 한칸 전진하고 다시 앞에 벽이 있는지 확인하죠. 아직 벽이 없다면 다시 전진, 그래도 벽이 없다면 다시 전진, 이렇게 전진할 때마다 앞에 벽을 확인하고 전진을 반복합니다. 여기서 잠깐! 연습 문제 하나 풀고 가시죠!


연습 문제: 카렐에게 "동쪽을 보고 있지 않다면 계속 반복해서 왼쪽으로 회전하라!"고 명령하려면 어떤 코드를 써야할까요? 


정답은 댓글에 적어두겠습니다.




반복문은 정말 강력한 도구입니다. 없이는 풀지 못 할 크고 어려운 문제들도 쉽게 풀 수 있게 해주는 반복문이지만, 그렇게 강력하기 때문에 코드에 "버그"도 만들어낼 수 있습니다. 우리 일상 대화에서도 자주 쓰이는 "버그"라는 단어는 프로그래밍에서 논리적 오류를 의미합니다. (쉽게 말해 문제를 해결하기 위해선 카렐이 이런 행동을 해야하는데 실수로 다른 행동을 명령하는 것이죠). 버그를 찾고 고치는 과정은 "debug (디버그)"라고 합니다.


for 루프와 while 루프에서 나타날 수 있는 두가지 버그를 배워두면 나중에 쉽게 알아보고 고칠 수 있습니다. 


for 루프에 나타나는 버그: OBOE (Off-By-One-Error) 

OBOE 오프-바이-원-에러는 for 루프로 정확히 10번 반복해야 풀 수 있는 문제에서 실수로 9번만 반복하거나 모르고 11번 반복하는 버그를 의미합니다. 


while 루프에 나타나는 버그: Infinite Loop (인피니트 루프)

무한 반복이라는 의미의 인피니트 루프는 while 루프의 실행 조건인 [상황]에 while 루프의 명령을 실행해서는 절대 바꿀 수 없는 상황을 적은 버그를 의미합니다. 예를 들어 상하좌우에 벽이 없는 카렐에게 아래 명령을 내린다면 카렐은 영원히 왼쪽으로 회전하기만 하겠죠:


while (앞에 벽이 없다면) {

왼쪽으로 회전하라




프로그래밍은 직접 코드를 쓰면서 자기 코드가 실행되는걸 볼 수 있어야 정말 재밌는데, 조건문과 반복문을 재밌는 과제 없이 설명만 드려서 죄송합니다. 하지만 카렐과 함께 정말 재미있는 문제들을 같이 풀어보기 위해선 조건문과 반복문을 꼭 배워둬야만 했답니다. 다음 강의에선 스탠포드의 부서진 건물들을 수리하는 "기둥 수리" 카렐을 직접 프로그래밍 하시게 될겁니다. ^^


Stanford CS106A 수업에 대한 모든 권리는 스탠포드 대학교가 가지고 있습니다. "스탠포드식 쉬운 프로그래밍 / 코딩 첫걸음"은 스탠포드 대학교의 CS106A 수업을 남녀노소 누구나 쉽게 배울 수 있도록 각색하고 한국어로 번역한 내용이며, 본글에 대한 모든 권리도 스탠포드 대학교가 가지고 있습니다. CS106A 수업에 사용되는 교재인 Karel the Robot Learns Java와 The Art & Science of Java를 작성해주신 Eric Roberts 교수님과 CS106A 수업을 가르치고 계시며 해외로 수업 내용 반출을 허락해주신 Mehran Sahami 교수님 그리고 Marty Stepp 교수님께 감사드립니다.


스탠포드 대학교에서 컴퓨터 과학을 전공중인 박준원이라고 합니다. 질문은 junwonpk@stanford.edu로 보내주시면 24시간 내로 답변 드리겠습니다. 설명을 따라했는데도 똑같이 작동하지 않거나 설명에 이해하기 어려운 부분이 있으면 주저하지 말고 질문 보내주세요! ^^

저작자 표시 비영리 변경 금지
신고
3 Comments
댓글쓰기 폼
Prev 1 ... 13 14 15 16 17 18 19 20 21 ... 351 Next