본문 바로가기

Back-End/Ruby

[Ruby] Codecademy - 3. 루비에서의 흐름제어(Control Flow)

1. 작동 원리

루비에서 우리가 지금까지 작성했던 프로그램들이 그렇게 유연하지만은 않다는 것을 눈치채셨을 겁니다. 맞습니다. 이들 프로그램은 사용자로부터 입력값을 받을 순 있지만, 항상 같은 결과값만을 내놓죠; 작성된 프로그램들은 현재 환경(environment)(주어진 어떤 시점에 프로그램 안에 존재하는 모든 변수와, 여기에 할당된 값의 모음)의 변화에 따라 반응하지 않습니다.

흐름제어(Control Flow)는 우리가 찾고있는 유연성을 코드에 부여해 줍니다. 사용자의 입력값이나 계산 결과, 또는 프로그램의 다른 부분에서 반환된 값에 따라 각기 다른 결과값을 선택할 수 있습니다.


2. if 구문

루비의 if 명령문은 하나의 수식(expression)을 갖는데요, 이는 값을 갖는 간단한 단어입니다(예를 들어 4true, 또는 pants 등). 만약 해당 수식이 true(참)이라면, 루비는 if 다음의 코드 블록을 실행합니다. 수식이 참이 아니라면(즉, false), 루비는 코드 블록을 실행하지 않고 건너뛰어, 다음 내용으로 넘어갑니다.

if 명령문의 작동 예제입니다:

if 1 < 2
  print "I'm getting printed because one is less than two!"
end

루비는 공백(whitespace)(공백과 비어있는 줄)을 신경쓰지 않기 때문에, if 다음 코드 블록의 들여쓰기 여부는 필수가 아닙니다. 하지만 이는 루비 사용자들이 따르는 관례이므로, 지금부터 들여쓰기하는 습관을 들이는 것이 좋습니다. if 다음 코드 블록을 두 칸의 공백만큼 들여쓰기하도록 하세요.

if 명령문 작성을 끝마쳤을 땐 반드시 end라고 써 넣어야 합니다.


3. Else 구문

else 명령문은 if 명령문의 파트너입니다. if/else 명령문은 루비에게 이렇게 전달합니다: "만약(if) 이 수식이 참(true)이면, 해당 코드 블록을 실행해; 참이 아니라면, else 명령문 다음의 코드 블록을 실행해." 예제는 다음과 같습니다:

if 1 > 2
  print "I won't get printed because one is less than two."
else
  print "That means I'll get printed!"
end


4. Elsif 구문

만약 두 가지 경우보다 더 많은 경우의 수를 만들고 싶을땐 어떻게 해야할까요? elsif를 사용하면 됩니다! elsif 명령문은 원하는 만큼 얼마든지 if/else 명령문에 다음과 같이 추가할 수 있습니다:

if x < y  # x와 y 모두 정의되었다고 가정
  puts "x는 y보다 작습니다!"
elsif x > y
  puts "x는 y보다 큽니다!"
else
  puts "x와 y는 같습니다!"
end


5. Unless 구문

흐름 제어를 사용할 때, 수식이 참인지를 확인하기 보다, 거짓인지를 확인하도록 만들고 싶을 때가 종종 있습니다. 작성한 if/else 문을 반대로 바꿔도 되지만, 루비에는 보다 더 나은 방법이 있습니다: 바로 unless 명령문을 사용하는 것입니다.

예를 들어 여러분은 배가 고프지 않는 한(unless), 음식을 먹지 않을거라고 해봅시다. 즉, 여러분이 배고프지 않는 동안은 프로그램을 작성하겠지만, 만약 여러분이 배가 고프면 음식을 먹을 겁니다. 이를 루비로 나타내면 다음과 같습니다:

unless hungry
  # 계속 프로그램을 작성
else
  # 음식을 먹음
end


6. 같거나, 또는 같지 않거나

루비에서는 할당 연산자(assignment operator)인 등호(=)를 이용하여 변수에 값을 할당합니다. 그렇다면 만약 어떤 것들끼리 서로 같은지를 확인할 때에는 어떤 기호를 사용해야 할까요? 이 경우에는 ==를 사용하며, 이는 비교 연산자(comparator)에 속합니다. ==의 의미는 "~와 ~가 같다" 입니다. 아래의 예시를 살펴보세요:

x = 2
y = 2
if x == y
  print "x와 y는 같습니다!"
end

위의 코드는 다음과 같은 의미입니다: "만약(if) x가 y와 같다면, 문자열 'x와 y는 같습니다!'를 출력". 마찬가지로 비교 연산자 !=를 사용하여 두 개의 값이 서로 같지 않은지 여부를 확인할 수 있습니다.


7. 작거나, 또는 크거나

또한 어떤 수가 다른 수에 비해 작거나, 작거나 같은지, 또는 크거나, 크거나 같은지 여부를 비교할 수 있습니다. 이 연산자들은 다음과 같습니다.

  • 작거나: <
  • 작거나 같음: <=
  • 크거나: >
  • 크거나 같음: >=


8. AND(논리곱) 연산자

비교연산자만이 루비에서의 유일한 연산자인 것은 아닙니다. 논리(logical), 또는 불린 연산자(boolean operators)라고 불리는 것들 또한 연산자에 속하는데, 총 세 가지 종류가 있습니다: AND 연산자 (&&), OR 연산자 (||), NOT 연산자(!). 불린 연산자들은 결과로 불린값, true 또는 false 값을 반환합니다.

AND(논리곱) 불린 연산자(&&)는 수식의 양변이 모두 일 경우에만 결과로 true 값을 반환합니다. &&연산자는 다음과 같이 작동합니다:

true && true # => true
true && false # => false
false && true # => false
false && false # => false

예를 들어, 1 < 2 && 2 < 3라는 코드는 연산자를 기준으로 수식의 양변이 모두 참이므로, 결과값은 true가 될 것입니다.


9. OR(논리합) 연산자

루비에는 OR(논리합) 연산자(||) 또한 포함되어 있습니다. 루비의 || 연산자는 수식의 양변 중 어느 한 변만 이어도 결과로 true값을 반환하기 때문에, 포함적 논리합(inclusive or)이라고 불립니다. 다음을 확인해 보세요:

true || true # => true
true || false # => true
false || true # => true
false || false # => false


10. NOT(논리부정) 연산자

마지막으로, NOT(논리부정) 연산자(!) 입니다. 이 연산자는 true값은 false로, fales 값은 true로 변환시킵니다.

!true # => false
!false # => true


11. 불린 연산자(Boolean Operators) 결합하기

아래에 보이는 것과 같이, 수식 안에서 불린 연산자들을 결합하여 사용할 수 있습니다.

(x && (y || w)) && z

위의 코드는 유효한 수식일 뿐만 아니라, 프로그램 작성에 매우 유용한 수식입니다.

수식의 판별 순서를 제어하기 위해 언제나 소괄호(())를 사용하시기 바랍니다. 소괄호 안의 수식은 소괄호 밖의 어떤 수식보다도 더 먼저 판별됩니다.



Ruby 실습하기 : https://www.codecademy.com/en/tracks/ruby-ko