선생님을 위한 프로그래밍 수업

조건문

토픽 선생님을 위한 프로그래밍 수업 > 웹 애플리케이션 만들기 > PHP

Boolean

'비교 수업'에서 비교 연산의 결과로 참(true)이나 거짓(false)을 얻을 수 있다고 배웠다. 여기서 참과 거짓은 '숫자와 문자 수업'에서 배운 숫자와 문자처럼 언어에서 제공하는 데이터 형이다. 이를 Boolean(불린)이라고 부르고 불린으로 올 수 있는 값은 true와 false 두가지 밖에 없다. 불린은 조건문에서 핵심적인 역할을 담당한다.

조건문

조건문이란 주어진 조건에 따라서 에플리케이션을 다르게 동작하도록 하는 것이다.

조건문의 문법

if

조건문은 if로 시작한다. if 뒤에 괄호가 오고, 괄호 안에 조건이 위치한다. 조건이 될 수 있는 값는 Boolean이다. Boolean의 값이 true라면 조건을 감싸고 있는 괄호 다음의 중괄호 구간이 실행된다.

아래 예제의 실행결과는 'result : true'다. if 뒤에 true가 왔기 때문이다.

/condition/1.php

https://github.com/egoing/phpeverybody/blob/master/condition/1.php

<?php
if(true){
    echo 'result : true';
}
?>

다음 예제는 아무것도 출력하지 않을 것이다. if 뒤에 false가 왔기 때문이다.

/condition/2.php

https://github.com/egoing/phpeverybody/blob/master/condition/2.php

<?php
if(false){
    echo 'result : true';
}
?>

다음 예제를 보자. 결과는 12345를 출력할 것이다.

/condition/3.php

https://github.com/egoing/phpeverybody/blob/master/condition/3.php

<?php
if(true){
    echo 1;
    echo 2;
    echo 3;
    echo 4;
}
echo 5;
?>

다음 예제를 실행해보자. 결과는 5만 출력될 것이다.

/condition/4.php

https://github.com/egoing/phpeverybody/blob/master/condition/4.php

<?php
if(false){
    echo 1;
    echo 2;
    echo 3;
    echo 4;
}
echo 5;
?>

조건이 false이기 때문에 조건문의 중괄호 구간이 실행되지 않았고, 조건문 뒤에 따라오는 echo 5만 실행된 것이다.

else

if만으로는 좀 더 복잡한 상황을 처리하는데 부족하다. 아래 예제를 보자. 결과는 1이다.

/condition/5.php

https://github.com/egoing/phpeverybody/blob/master/condition/5.php

<?php
if(true){
    echo 1;
} else{
    echo 2;
}
?>

다음 예제의 결과는 2다.

/condition/6.php

https://github.com/egoing/phpeverybody/blob/master/condition/6.php

<?php
if(false){
    echo 1;
} else{
    echo 2;
}
?>

else 뒤에 따라오는 중괄호는 주어진 조건이 false일 때 실행될 로직이 위치한다. 참일 때와 거짓일 때 각각 다른 동작을 하도록 하는 기능이다.

else if

else if를 이용하면 조건문을 좀 더 풍부하게 할 수 있다. 아래 예제를 보자. 결과는 2다.

/condition/7.php

https://github.com/egoing/phpeverybody/blob/master/condition/7.php

<?php
if (false){
    echo 1;
} else if (true){
    echo 2;
} else if (true){
    echo 3;
} else {
    echo 4;
}
?>

다음 예제의 결과는 3이다.

/condition/8.php

https://github.com/egoing/phpeverybody/blob/master/condition/8.php

<?php
if (false){
    echo 1;
} else if (false){
    echo 2;
} else if (true){
    echo 3;
} else {
    echo 4;
}
?>

다음 예제의 결과는 4다.

/condition/9.php

https://github.com/egoing/phpeverybody/blob/master/condition/9.php

<?php
if (false){
    echo 1;
} else if (false){
    echo 2;
} else if (false){
    echo 3;
} else {
    echo 4;
}
?>

else if는 좀 더 다양한 케이스의 조건을 검사할 수 있는 기회를 제공한다. else if의 특징은 if나 else와는 다르게 여러개가 올 수 있다는 점이다. elif의 모든 조건이 false라면 else가 실행된다. else는 생략 가능하다.

변수와 비교연산자 그리고 조건문

앞서 배운 변수와 비교연산자 그리고 조건문을 결합해보자. 간단한 형태의 로그인 에플리케이션을 구현해보자. 우선 아이디를 입력할 수 있는 HTML 폼을 만든다. 그리고 HTML 폼에서 전송한 데이터를 처리 할 PHP 에플리케이션을 만든다.

/condition/10.html

https://github.com/egoing/phpeverybody/blob/master/condition/10.html

<html>
<body>
    <form method="get" action="11.php">
		<input type="text" name="id" />
		<input type="submit" />
	</form>
</body>
</html>

이번에는 PHP 에플리케이션을 만든다. 이 예제에서 PHP 에플리케이션은 반드시 HTML 문서와 같은 디렉토리에 위치하고 있어야 하고, 파일명은 11.php로 해야 한다.

/condition/11.php

https://github.com/egoing/phpeverybody/blob/master/condition/11.php

<?php
if($_GET['id'] === 'egoing'){
    echo 'right';
} else {
    echo 'wrong';
}
?>

HTML 페이지에서 ID의 값으로 egoing을 입력해보고, 다른 값도 입력해보자. 조건문은 이런 경우에 사용한다. 여기하 $_GET을 정확하게 이해하기 위해서는 뒤에서 공부 할 배열이라는 데이터 형식을 이해해야 한다. 우리는 아직 배열을 배우지 않았기 때문에 $_GET['id'] 는 HTML 폼에서 GET 방식으로 전송한 값 중에 이름이 id인 값을 의미한다고 생각하자. 지금은 이것으로 충분하다.

그리고 지금까지 배운 것을 이용해서 실용적인 PHP 에플리케이션을 처음으로 만들어보았다! HTML만으로는 사용자가 입력한 정보를 판단해서 적절한 행위를 하는 것이 불가능하다. 이런 이유로 PHP와 같은 서버측 스크립트를 사용하는 것이다.

조건문의 중첩

위의 예제에서 아이디와 비밀번호를 모두 검증해야 한다면 어떻게 하면 될까? 다음 예제를 보자. 우선 HTML 폼의 코드를 조금 바꾸자.

/condition/12.html

https://github.com/egoing/phpeverybody/blob/master/condition/12.html

<html>
<body>
    <form method="post" action="13.php">
		id :  <input type="text" name="id" />
		password : <input type="text" name="password" />
		<input type="submit" />
	</form>
</body>
</html>

폼에서 전송한 아이디와 비밀번호를 받아서 처리 할 PHP 에플리케이션을 만든다. 주의할 것은 PHP 파일의 이름을 13.php로 해야 한다.

/condition/13.php

https://github.com/egoing/phpeverybody/blob/master/condition/13.php

<?php
if($_POST['id'] === 'egoing'){
    if($_POST['password'] === '111111'){
		echo 'right';
	} else {
		echo 'password wrong';
	}	
} else {
	echo 'id wrong';
}
?>

if문 안에 다시 if문이 등장했다. 즉 사용자가 입력한 값과 아이디의 값이 일치하는지를 확인한 후에 일치한다면 비밀번호가 일치하는지 확인한 것이다. 이렇게 조건문은 조건문 안에 중첩적으로 사용될 수 있다. 또한 이전 예제가 $_GET을 사용한 반면 이번 예제는 $_POST를 사용했다. 전송된 데이터가 POST이기 때문에 이런 경우 $_POST를 사용한다.

논리 연산자

이제 논리 연산자를 알아보자. 논리 연산자는 조건문을 좀 더 간결하고 다양한 방법으로 구사할 수 있도록 도와준다.

and

and는 좌항과 우항이 모두 참(true)일 때 참이된다. &&를 사용해도 된다. 다음 예제를 보자. 결과는 1이다. and의 좌우항이 모두 true인 것은 첫번째 조건문 밖에 없기 때문이다.

/condition/14.php

https://github.com/egoing/phpeverybody/blob/master/condition/14.php

<?php
if (true and true) {
    echo 1;
}
if (true and false) {
    echo 2;
}
if (false and true) {
	echo 3;
}
if (false and false) {
	echo 4;
}
?>

논리 연산자를 이용한 사례를 살펴보자. 다음 예제는 논리 연산자를 이용해서 이전 예제를 개선한 것이다. HTML 폼은 아래와 같다. 데이터를 전송할 PHP 에플리케이션의 이름만 변경했다.

/condition/15.html

https://github.com/egoing/phpeverybody/blob/master/condition/15.html

<html>
<body>
    <form method="post" action="16.php">
		id :  <input type="text" name="id" />
		password : <input type="text" name="password" />
		<input type="submit" />
	</form>
</body>
</html>

아래는 PHP 에플리케이션이다.

/condition/16.php

https://github.com/egoing/phpeverybody/blob/master/condition/16.php

<?php
if($_POST['id'] === 'egoing' && $_POST['password'] === '111111'){
    echo 'right';
} else {
	echo 'wrong';
}
?>

중첩된 if문을 하나로 줄였다. 덕분에 코드의 복잡성도 낮아졌다. and는 아래와 같은 의미를 만든다.

"id의 값이 egoing이고 password의 값이 111111이면 참이다"

즉 and 연산자의 좌항과 우항이 모두 참일 때 전체가 참이 되는 것이다.

or

/condition/17.php

https://github.com/egoing/phpeverybody/blob/master/condition/17.php

or는 or의 좌우항 중에 하나라도 true라면 true가 되는 논리 연산자다. 다음 예를 보자. 결과는 1,2,3이 출력된다. 마지막 조건문의 or는 좌항과 우항이 모두 false이기 때문에 false가 된다.

<?php
if (true or true) {
    echo 1;
}
if (true or false) {
    echo 2;
}
if (false or true) {
	echo 3;
}
if (false or false) {
	echo 4;
}
?>

다음 예제는 id 값으로 egoing, k8805, sorialgi 중의 하나를 입력하면 right가 출력되고, 그 외의 값을 입력하면 wrong를 출력하는 예제다.

/condition/18.html

https://github.com/egoing/phpeverybody/blob/master/condition/18.html

<html>
<body>
    <form method="post" action="19.php">
		id :  <input type="text" name="id" />
		<input type="submit" />
	</form>
</body>
</html>

/condition/19.php

https://github.com/egoing/phpeverybody/blob/master/condition/19.php

<?php
if($_POST['id'] === 'egoing' or $_POST['id'] === 'k8805' or $_POST['id'] === 'sorialgi'){
    echo 'right';
} else {
	echo 'wrong';
}
?>

위의 예제에서는 논리 연산자를 3개 사용했다. 2개만 사용하는 것이 아니라는 것을 보여주기 위한 예제다.

다음 예제는 id 값으로 egoing, k8805, sorialgi 중의 하나를 사용하고 비밀번호는 111111을 입력하면 right 외의 경우에는 wrong를 출력하는 예다.

/condition/20.html

https://github.com/egoing/phpeverybody/blob/master/condition/20.html

<html>
<body>
<form method="post" action="21.php">
id : <input type="text" name="id" />
password : <input type="text" name="password" />
<input type="submit" />
</form>
</body>
</html>

/condition/21.php

https://github.com/egoing/phpeverybody/blob/master/condition/21.php

<?php
if(
    ($_POST['id'] === 'egoing' or $_POST['id'] === 'k8805' or $_POST['id'] === 'sorialgi')
	and
	$_POST['password'] === '111111'
){
	echo 'right';
} else {
	echo 'wrong';
}
?>

위의 예제에서는 or와 and를 혼합해서 사용하는 방법을 보여준다. id 값을 테스트 하는 구간을 괄호()로 묶었다. 사용자가 id의 값으로 egoing 비밀번호를 111111을 입력했다면 연산의 순서는 아래와 같이 된다.

  1. (id==="egoing" or id==="k8805" or id==="sorialgi") : true가 된다.
  2. password==='111111' : true가 된다.
  3. true(1항) and true(2항) : true가 된다.

사칙 연산을 할 때 괄호부터 계산하는 것과 같은 원리다.

!

!(not)는 부정의 의미로, Boolean의 값을 역전시킨다. true를 false로 false를 true로 만든다. 아래의 결과는 4다. not을 사용하는 것이 편리할 때가 있다.

/condition/22.php

https://github.com/egoing/phpeverybody/blob/master/condition/22.php

<?php
if (!true and !true){
    echo 1;
}
if (!true and !false){
    echo 2;
}
if (!false and !true){
    echo 3;
}
if (!false and !false){
	echo 4;
}
?>
고급내용

boolean의 대체제

 

01

조건문에 사용될 수 있는 데이터 형이 꼭 불린만 되는 것은 아니다. 관습적인 이유로 0는 false 0이 아닌 숫자는 true를 대체할 수 있다. 다음 예제를 보자.

/condition/23.php

https://github.com/egoing/phpeverybody/blob/master/condition/23.php

<?php
if (1 and 1) {
    echo 1;
}
if (1 and 0) {
    echo 2;
}
if (0 and 1) {
    echo 3;
}
if (0 and 0) {
	echo 4;
}
?>

0외에 값이 없는 배열, 빈문자열, NULL, 문자 0 등도 0으로 간주된다.

참고

댓글

댓글 본문
  1. DreamBoy
    2023.10.24. PHP - 조건문 파트 수강했습니다.
  2. dueto park
    2022.06.29. 조건문 수강 완.
  3. 코드파괴자
    22.05.19 complete.
  4. 늘랑파파
    어렵다..완료
  5. 드림보이
    2022.01.14. 조건문 파트 수강완료
  6. ggyuker
    21.12.30 수강완료
  7. jeisyoon
    2021.07.25 Condition - OK
  8. 자바바
    HTML에서 Log in 해서 PHP로 회신 되도록 작성 했습니다. 재미 있습닏다.
  9. 조성호
    2020.01.01 완료
    감사합니다.!
  10. 햄릿슈
    and와 &&, or과 || 둘다 사용가능하다니 신기합니다!
  11. wico
    감사합니다.
  12. choon
    감사합니다.
  13. 호두
    고맙습니다
    형변환 표를 참고해야겠네요
  14. 형변환에서 갑자기 너무 어렵게 느껴지네요 ㅠㅠ
  15. 알람
    감사합니다
  16. dosamo
    완료
  17. jjung
    조건 반복문!!!
  18. 송성태
    수학에서 배웠던 명제의 진리값이 이렇게 쓰이는군요.
    막연하게 생각했던 진리값이 어떻게 프로그램에서 쓰이는지 잘 보았습니다.
    감사합니다!
  19. 얼음띄운사이다
    잘들었습니다. 감사합니다
  20. 다시시작
    완료
  21. giback
    잘듣고갑니다.!!
  22. orez
    감사합니다!
  23. kimjs9105
    잘 보았습니다앙~~~
  24. sheis
    잘 봤어요^^
  25. 심화평
    17-07-11 감사합니다~
    ===
  26. 긍정아빠
    and와 or에서 보통 &&나 ||로 작성하는게 맞다고 생각했는데, 선택의 문제였다는 ㄷㄷㄷ
    잘봤습니다. ^^
  27. jhkwak313
    두번째 동영상에서 html에 아이디값을 쳐서 제출을 했는데 넘어가서는 php에서 작성한 코드가 그대로 나오는건 왜그런거죠?
    동영상처럼 안나오고 php에 작성한 코드가 다 나와버려요
  28. 김세창
    오늘도 정말 잘 들었습니다. 고맙습니다.
    17.03.30
  29. 이병정
    정망 설명 쉽게 질 하시네요.^^
  30. NamJin Kim
    감사합니당ㅎㅎ
  31. lee kyoo
    감사에 감사...
    뇐네도 이해가 되네요.
  32. 신입1
    감사합니다.
  33. sean
    감사합니다.
  34. Kim Jeehwan
    최고입니다. egoing님을 소프트웨어기술부 장관으로 추천합니다 !
  35. 김윤권
    역시 언제나 지루하지않게 차근차근 좋은 설명을 해주시네요 !! 항상 감사히 듣고있습니다
    대화보기
    • 최고의 강의
      그런 의문이 안 드시는 이유는, 피곤하셔서 그런겁니다.
      에서 빵 터졌습니다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

      대한민국에서 독보적인 프로그래밍 무료강의입니다. 아니 유료 포함해도 그럴 듯.
      입문자 프로그래밍 강의는 = 생활코딩!

      감사합니다 egoing님!
    • JustStudy
      고맙습니다
    • 최동희
      예전에 php 책 보고 공부한 걸로 짠 조건문이 의도한 것과는 상당히 다르게 동작해서 고생한 적이 있는데, 마지막 강의 동영상 내용이 그 원인 설명을 깔끔하게 해주는군요.
    • 감사합니다.
      처음에 이곳을 알게된건 기본게시판 소스에 이미지 업로드가 가능한 갤러리형 게시판으로 바꿔보고 싶고 그러자니 이미지 업로드 방법을 찾아보면서 기웃거리던중 방문하게 됫습니다.

      아.. 기본부터 다시배우자 하는 느낌으로 처음부터 동영상 정주행중입니다. 다봐도 3번은 다시 볼 생각입니다. 좋은강의 너무 쉽고 깔끔하게 정리해주셔서 거듭감사드립니다.
    • 고고1
      마지막 강의 듣다 보니 어지럽네여 ~_~;;
    • 진돌
      정말 재미있는 강의입니다.
      프로그램에 아무런 관심이 없었는데...
      회사일로 이고잉님 강의 듣게 되었어요.
      아이고...어렵겠다..라고 막연히 생각했었는데,
      강의를 들을 때마다 신기하고 재미납니다.
      감사합니다!
    • 강의다듣기도전!
      ㅋㅋㅋㅋㅋㅋ강의 너무 재미있어요!!
      호기심이 생기면 소질이 있고
      생기지 않으면 피곤한거라니 ㅋㅋㅋㅋ
      평생 피곤하면 어쩌죠.... ㅠ
    • 2015-11-16(월요일)
      자바스크립트에서 한 것과 거의 같아서 이해하기 쉬워요,
      다만 데이터 타입 비교의 경우 여전히 애매모호하네요.
      음..... 분명히 공부했었는데....
      머릿속에서는 404 error출력... 찾을 수 없음 ㅎㅎ
    • 코딩!
      감사합니다!!
    • 이용주
      이전 강의까지의 php가 바다였다면 이번 강의를 통해 바다에 떠있는 섬을 발견한거 같군요. 이제야 php가 하는일 그리고 할수 있는 일들이 보이기 시작합니다. ^^ 사랑합니다. 이고잉님
    • 쭈야
      감사합니다^^
    • HLEE
      강의 잘 보고갑니다.
      좋은 강의 마련해주셔 감사드립니다.
    • mkjk
      감사합니다!!
      대화보기
      • eric
        id 값과 password 값을 "egoing" 과 "1111111" 지정하시고 진행 하셨는데, 만약 처음 계정을 생성하고, 그 생성한 id 와 password 를 가지고 로그인시 입력한 id 와 password 를 대조하여 같으면 right 틀리면 wrong 으로 하려면 어떻게 해야 하나요? 즉 if($_POST['id'] === 'egoing' && $_POST['password'] === '111111') 여기의 'egoing' 과 '111111' 에 들어갈 함수는 무엇인가요?
      • 행복부자
        조건문 강의 마지막 언급처럼 ... 대단원의 막이 내려졌네요.
        백지 같던 ... 머릿속에 이제서야 ... 프로그램이 무엇인지 맛을 쬐끔 보게 되었네요.
        이후로의 강의도 기대하고 보겠습니다.

        수고에 감사 드립니다.