Java

논리 연산자

논리 연산자

조건문 수업에서 Boolean에 따라서 프로그램이 다르게 동작하도록 하는 방법을 배웠다. 이번 시간에는 Boolean의 값을 결합해서 코드를 좀 더 간결하게 만들 수 있는 논리 연산자(Conditional Operator)에 대해서 알아보자. 뒤에서는 조건문 수업의 예제에 논리 연산자를 결합해 볼 것이다. 

&&

&&는 좌항과 우항의 값이 모두 참(true)일 때 참이 된다. And라고 읽는다. 다음 예제를 보자. 결과는 1이다. and의 좌우항이 모두 true인 것은 첫 번째 조건문 밖에 없기 때문이다. (실행)

package org.opentutorials.javatutorials.conditionaloperator;

public class AndDemo {

    public static void main(String[] args) {
		if (true && true) {
			System.out.println(1);
		}

		if (true && false) {
			System.out.println(2);
		}

		if (false && true) {
			System.out.println(3);
		}

		if (false && false) {
			System.out.println(4);
		}

	}

}

논리 연산자를 이용한 사례를 살펴보자. 다음 예제는 논리 연산자를 이용해서 이전 예제를 개선한 것이다.

package org.opentutorials.javatutorials.conditionaloperator;

public class LoginDemo3 {
    public static void main(String[] args) {
		String id = args[0];
		String password = args[1];
		if (id.equals("egoing") && password.equals("111111")) {
			System.out.println("right");
		} else {
			System.out.println("wrong");
		}
	}
}

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

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

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

||

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

package org.opentutorials.javatutorials.conditionaloperator;

public class OrDemo {

    public static void main(String[] args) {
		if (true || true) {
			System.out.println(1);
		}
		if (true || false) {
			System.out.println(2);
		}
		if (false || true) {
			System.out.println(3);
		}
		if (false || false) {
			System.out.println(4);
		}

	}

}

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

package org.opentutorials.javatutorials.conditionaloperator;

public class LoginDemo4 {
    public static void main(String[] args) {
		String id = args[0];
		String password = args[1];
		if ((id.equals("egoing") || id.equals("k8805") || id.equals("sorialgi"))
				&& password.equals("111111")) {
			System.out.println("right");
		} else {
			System.out.println("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가 된다. 아래의 결과는 2다. (실행)

package org.opentutorials.javatutorials.conditionaloperator;

public class NotDemo {

    public static void main(String[] args) {
		if (!true) {
			System.out.println(1);
		}
		if (!false) {
			System.out.println(2);
		}

	}

}

댓글

댓글 본문
작성자
비밀번호
  1. J_Project
    감사합니다!
  2. 170315
    감사합니다.
  3. 김인섭
    감사합니다.^^
  4. 오오
    감사합니다ㅎㅎㅎ
  5. 내이름은이한샘
    @이고잉 선생님~ 동영상 강의 잘 듣고 있습니다! 감사합니다.!!!
  6. 초보늦깍이30살
    아 이번 강의도 너무나 감사히 잘들었습니다!!!!
    감사합니다 정말 ㅎㅎ
  7. 리브
    ㅇ...액셀 어려운데용,.,ㅠㅠ
    대화보기
    • 라떼
      감사합니다!!
    • 감사합니당
    • 친절한 강의굿.
    • ㅎㅎㅎ
      if 뒤에 괄호 ()가 빠졌네요~~
      대화보기
      • 445번째 시청자 입니다.
        초등학교3학년 이후로 수포자로 살아왔는데 이고잉 덕분에
        수학까지 재밌어 졌네요 ^^
      • 감사합니다!
      • 짧고굵게
        감사히 보고 있습니다.
      • JustStudy
        고맙습니다
      • somnium
        감사합니다~~
      • yskioi
        감사합니다.
      • 현벨
        감사합니다!
      • 조현수
        감사합니다.
      • Devani0310
        감사합니다
      • 감사합니다^^
      • 오빠는다르다
        감사합니다!!!!
      • 박첩구드
        감사합니다 ㅎㅎ
      • 황진섭
        이해가 잘 되게 설명해주셔서 감사합니다 ㅎㅎ
      • Byunghawk Lee
        수고하셨습니다
      • 허니버터
        잘보고 넘어 갑니다.
      • 조현권
        안녕하세요. 좋은 예제를 보여주셔서 감사합니다..

        다름이 아니라 맨 위에 표기하신 Conditional Operator은 '? :'를 이용한 삼항연산자를 뜻하고
        논리 연산자는 Logical Operator입니다.

        저도 부족하지만 올바른 표기를 위해서 댓글 남깁니다.
      • 이종영
        if ( (id) && password )
        이기 때문에 위의 문장이 맞아요.
        아래 문장은 && 바로 앞의 ) 하나가 놀게되고요.
      • 이근창
        if ((id.equals("egoing") || id.equals("k8805") || id.equals("sorialgi"))
        && password.equals("111111"))

        if (id.equals("egoing") || id.equals("k8805") || id.equals("sorialgi"))
        && password.equals("111111"))

        // if 앞에 괄호 하나를 빼야 하지 않나요? ~
        // 강의 정말 재미있게 잘보고 있습니다
        // 자바가 점점 엑셀처럼 쉬워지고 있어요 ^ ^
      • onions
        하나도 몰랐는데 점점 알아가고 있습니다!
        진짜 감사합니다
      • jeyul
        if~else if~구문은 조건이 참이 되는 if문의 블럭만을 처리하고 if~else if~구문을 끝냅니다.
        OrDemo 예제를 if~else if~문으로 수정했다면, 첫번째 if문의 조건이 참이 되기 때문에
        1을 출력하고 끝나겠죠.
        그리고 OrDemo는 단지 or 연산의 결과가 궁금해서 작성된 예제라서
        4가지의 경우를 다 체크해 봐야 합니다.
        if~else if~문을 사용하면 정확한 결과를 얻을 수 없습니다.
        대화보기
        • old 막내
          저 orDemo 구문을 else if 적용이 될 줄 알고 작성해 봤는데 결과 값이 1만 출력 되더군요.

          or 를 적용 시켰기 때문에 1, 2, 3 이 출력 되야 할 것 같은데 1 만 출력된 이유가 있나요?
        • 민백홍
          OR 부분을 ()묶지 않아서 우선순위가 바뀐것 같습니다.
          대화보기
          • egoing
            아래와 같이 괄호로 묶어주시면 될 것 같은데요.


            if((id.equals("korea")||id.equals("orea")||id.equals("rea")) && password.equals("1234")){

            }
            대화보기
            • Dontuto
              안녕하세요. 좋은 강의 감사합니다. 질문할 내용은

              String id = args[0];
              String password = args[1];

              if(id.equals("korea")||id.equals("orea")||id.equals("rea") && password.equals("1234")){
              System.out.println("Welcome to Korea Bank");
              }else{
              System.out.println("Your id or Password is wrong");
              }

              에서 파스워드를 1 또는 2 또는 123 등으로 틀린 input 을 해도 your id or password is wrong 으로 프린트가 되지않고
              welcome to korea bank 가 프린트아웃이 되는데 원인을 알고 싶습니다.
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기