Computer Science/프로그래밍 언어론

프로그래밍 언어론 - 조건문

Beomsu Koh 2023. 5. 30.

프로그래밍 언어론 - 조건문

조건문을 사용하면 조건에 따라 둘 이상의 실행 경로 중 하나를 선택할 수 있습니다.
프로그래밍에서 의사 결정 논리를 구현하기 위한 수단을 제공합니다.

두 가지 일반적인 유형의 조건문이 있습니다.

  1. “if” 문
    • if 문은 조건이 참인지 거짓인지에 따라 특정 실행 경로를 선택합니다.
    • if 문은 FORTRAN 프로그래밍 언어에서 처음 도입되었습니다.
  2. “case” 또는 “switch” 문
    • case 또는 switch 문을 사용하면 서로 다른 조건에 따라 여러 경로 중 하나를 선택할 수 있습니다.
    • 표현식을 평가하고 값을 다른 케이스 레이블과 일치시킵니다.
    • 일치하는 경우에 따라 해당 코드 블록이 실행됩니다.

If 문

FORTRAN

If 문은 FORTRAN에 도입 처음 도입하였습니다
식의 결과에 따라 다른 레이블(L1, L2 등)로의 분기를 지원했습니다.

1. if(식) L1, L2
2. if(식) L1, L2, L3
  1. 식이 참이면 레이블 L1로 분기하고, 거짓이면 레이블 L2로 분기
  2. 식의 값이 음수이면 레이블 L1로, 0이면 레이블 L2로, 그리고 양수이면 레이블 L3으로 분기

새롭게 도입 된 if 문

if (식) 문장

식이 참이면 문장을 실행하고 거짓이면 문장을 실행하지 않는 if 문이 포트란에 새로 등장하였다.

if(I,GT,10) K = 20의 경우

  • 참인 경우에 한 문장만 실행 가능
  • 조건식이 참인 경우 실행 될 문장이 여러 개면 Go To 문을 활용해야 한다
    Go To 문 문제 보완, FORTRAN 77
    블록 if 문을 추가하여 Go To 문제를 보완했다

C

if(exp)
	문장 1;
else
	문장 2;

  • 중괄호를 사용한다
    • 식이 참이거나 거짓인 경우에 실행 될 문장이 여러 개라면 중괄호로 묶은 복합 문 사용
if(식) {
	문장1;
	문장2;
	⋮
} else {
	문장n;
	문장n+1;
	⋮
}

C의 dangling else 문제

  • else가 어떤 if와 연결되는지 모호한 문제가 있다
  • Pascal과 C
    • else는 연결된 else가 없는 가장 가까운 if와 결합한다’는 규칙을 적용
    • 첫 번째 if와 연결을 시키려면 중괄호로 두 번째 if 문을 묶음
      if 절에는 의미있는 문장을 배치!
  • 조건이 거짓인 경우에 문장을 처리하는 경우
  • if 조건을 부정, 처리해야 할 문장을 if 절로 이동, else 절을 지우기

Ada

  • FORTRAN과 유사하게 if 문 끝에 endif 위치
  • then 절과 else 절에는 둘 이상의 문장이 올 수 있음

Case 문과 Switch 문

  • 조건에 따라 여러 경로 중 하나를 선택한다

ALGOL W에서 처음 도입

  • 식의 값이 1이면 문장 1
  • 2명 문장 2, n이면 문장 n이 선택되어 실행 되도록 작동한다

C와 JAVA

  • 식의 값이 상수1이면 문장들 1, 문장들 2, …, 문장들 n이 실행
  • 상수 2이면 문장들2, …, 문장들 n이 실행
    • 일치하는 상수가 없을 경우에는 문장들 n이 실행
  • default가 없으면 아무 일도 하지 않고 switch 구조를 빠져나옴

Ada

  • when others는 생략 가능

  • 선택 리스트들이 식에서 나타날 수 있는 결과를 모두 포함하고 있어야 함

  • 만약 모든 결과를 선택리스트에 나타낼 수 없으면 others를 이용

  • 상수는 물론 3|5|7과 같은 상수들의 나열, 90…100과 같은 범위도 가능

  • 일치하는 선택리스트가 없을 때 아무 작업도 실행하고 싶지 않다면 null을 이용

with Ada.Text_IO;
use Ada.Text_IO;

procedure Case_Grade is
   package Int_IO is new Ada.Text_IO.Integer_IO (Integer);
   use Int_IO;
   
   subtype Score_Range is Integer range 0..100;
   Score : Score_Range;
   Grade : Character;
begin
   Put("Score: ");
   Get(Score);
   
   case Score is
      when 90..100 =>
         Grade := 'A';
      when 80..89 =>
         Grade := 'B';
      when 70..79 =>
         Grade := 'C';
      when 60..69 =>
         Grade := 'D';
      when 0..59 =>
         Grade := 'E';
   end case;
   
   Put(Grade);
end Case_Grade;

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

댓글