중첩된 선택문
if는 둘, else는 하나. 이 else는 누구의 짝일까?
중첩
else의 짝이 두 가지로 읽힙니다
if 안에 if가 들어 있는 것을 중첩이라고 합니다. 들여쓰기만 보면 else는 바깥 if의 짝처럼 보입니다. 하지만 else가 어느 if와 짝인지는 따로 정해 두어야 합니다.
이 강의가 따르는 교재의 Java 예제입니다. ==는 두 값이 같은지 견주는 연산자입니다.
Java의 규칙
가장 가까운 앞의 if가 짝입니다
Java는 else를 가장 가까운 앞의 if와 짝짓습니다. 그래서 이 else는 안쪽 if의 것입니다. Java에서 들여쓰기는 뜻을 정하지 않으므로, 눈에 보이는 모양과 실제 뜻이 다를 수 있습니다.
이 규칙은 Java의 정적 의미론 규칙입니다. 문법과 따로 정해 두고 실행 전에 검사하는 규칙을 그렇게 부릅니다.
왜 중요한가
짝이 바뀌면 결과가 바뀝니다
sum이 0이고 count가 5일 때를 따라가 봅니다. else가 안쪽 if의 짝이면 result에 1이 들어가고, 바깥 if의 짝이면 아무 일도 일어나지 않습니다. 글자는 같은데 결과가 다릅니다.
값은 예시입니다. Java의 규칙으로는 왼쪽이 맞습니다.
해결 ① 중괄호
안쪽 if를 중괄호로 가둡니다
else를 바깥 if와 짝지으려면 안쪽 if를 중괄호로 감싸 복합문으로 만듭니다. 안쪽 if가 중괄호 안에서 끝나 버리므로 else는 바깥 if의 짝이 됩니다. C, C++, C#이 쓰는 방법입니다.
복합문은 2편에서 본, 여러 문장을 하나로 묶은 것입니다.
해결 ② end
Ruby는 if마다 end로 닫습니다
Ruby는 절을 문장의 나열로 쓰고 if마다 end로 닫습니다. else가 안쪽 if와 그 end 사이에 있으므로 안쪽 if의 짝이라는 것이 구문만으로 분명합니다.
해결 ③ 들여쓰기
Python은 깊이가 곧 짝입니다
Python은 들여쓰기가 곧 문법입니다. else가 안쪽 if와 같은 깊이면 안쪽 if의 짝이고, 바깥 if와 같은 깊이로 옮기면 바깥 if의 짝이 됩니다. 중괄호나 end 없이도 짝이 분명합니다.
선택자 식
if가 값을 내는 언어도 있습니다
ML, F#, Lisp에서는 선택문이 문장이 아니라 값을 내는 식, 곧 선택자 식입니다. 거짓일 때도 낼 값이 있어야 하므로 else 절이 꼭 있어야 하고, 두 절이 내는 값의 타입은 같아야 합니다.
F#의 let y = ...는 값에 y라는 이름을 붙입니다. 값을 내지 않는 if는 else를 빼도 되고, 그때는 '값 없음'인 유닛(unit) 타입이 됩니다. x는 예시 값입니다.
다음 편