Dart 논리 연산자

논리 연산은 오직 불리언 값(true /false)만 다루며, ‘조건이 성립하는지 판단’하는 데 사용합니다. 최종 결과는 두 가지밖에 없습니다: true(참, 조건 만족), false(거짓, 조건 불만족).

코드 안의 모든 if, while/for 반복문 조건 판단, switch 분기 조건은 내부적으로 전부 논리 연산으로 구현됩니다.

주요 연산자는 세 가지입니다: AND, OR, NOT

연산자이름기능 설명
&&논리곱(AND)양쪽 값이 모두 true일 때만 결과가 true; 단락 평가 지원
||논리합(OR)한쪽이라도 true면 전체 결과가 true; 단락 평가 지원
!expr논리 부정(NOT, 반전)불리언 값 반전: truefalse로, falsetrue로 바꿈

논리곱, 논리합, 부정은 중학교 물리에서 배운 직렬회로, 병렬회로와 원리가 비슷합니다. 직렬회로가 논리곱, 병렬회로가 논리합에 해당합니다.

1. 논리 부정 !

단일 불리언 표현식의 값을 반전시킵니다.

사용법:

!불리언 표현식

예시

void main() {
  bool isMale = false;
  print(!isMale); // true

  bool flag = true;
  print(!flag); // false
}Code language: PHP (php)

위 코드의 isMale와 flag는 원래 false, true였지만 부정 연산자를 거치면 반대 값이 됩니다.

전체 표현식에 적용할 수도 있습니다. 예를 들어

void main() {
  int age = 12;
  print(!(age>18)); // true
}Code language: JavaScript (javascript)

원래 age > 18의 결과는 false지만 앞에 !를 붙여 반전되면서 true로 출력됩니다.

2. 논리곱 &&

표현식결과
true && truetrue
true && falsefalse
false && truefalse
false && falsefalse

양쪽이 모두 true여야 결과가 true이고, 어느 한쪽이라도 false면 결과는 false입니다.

단락 평가 특징:왼쪽 값이 false일 경우 오른쪽 코드는 실행하지 않고 바로 false를 반환합니다.

두 스위치가 모두 닫혀야(true) 전구가 켜지고(true), 한쪽이라도 열려있으면(false) 전구가 꺼집니다(false). 왼쪽이 false로 판명되면 오른쪽을 검사할 필요가 없습니다.

void main() {
  bool fun1() {
    print("함수가 실행되었습니다!");
    return true;
  }

  bool left = false;
  // 왼쪽이 false이므로 오른쪽 fun1()은 실행되지 않음
  bool res = left && fun1();
  print("최종 결과:$res");
}Code language: PHP (php)

실행 결과

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
최종 결과:false
Code language: JavaScript (javascript)

fun1 내부에 오류나 예외가 존재해도 함수 자체가 실행되지 않으므로 에러가 발생하지 않습니다.

논리곱 사용 예시

void main() {
  String name = 'admin';
  String password = '123321';

  // && 양쪽 모두 true일 때만 조건 충족
  if (name=='admin' && password =='456654') {
    print("로그인 성공");
  } else {
    print("아이디 또는 비밀번호가 틀렸습니다");
  }
}Code language: JavaScript (javascript)

실행 결과

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
아이디 또는 비밀번호가 틀렸습니다Code language: CSS (css)

3. 논리합 ||

왼쪽 값이 true일 경우 오른쪽 코드를 실행하지 않고 바로 true를 반환합니다.

표현식결과
true || truetrue
true || falsetrue
false || truetrue
false || falsefalse

예시를 보겠습니다

void main() {
  bool fun1() {
    print("함수 실행");
    return true;
  }
  // 왼쪽이 true라 단락 평가 발생, fun1() 실행 X
  bool res = true || fun1();
  print(res); // true
}Code language: PHP (php)

||의 왼쪽이 true이므로 오른쪽 fun1은 실행되지 않습니다.

두 스위치 중 하나라도 닫히면 true이고 전구가 켜집니다.

void main() {
        bool isParentAgree = true;
	int age = 12;
	if(age>=13 || isParentAgree){
	  print("입장 가능");
	}
}Code language: JavaScript (javascript)

정리

A && B:A가 false이면 바로 false 반환, B는 실행 및 검사하지 않음

A || B:A가 true이면 바로 true 반환, B는 실행 및 검사하지 않음

실행 속도를 높일 뿐만 아니라 오류를 방지할 때 자주 활용합니다(null 판단에서 자주 사용)

예시:

String? name;
// name이 null이 아닐 때만 length 호출, 단락 평가로 null 참조 오류 방지
if(name != null && name.length > 0) 
{

}Code language: JavaScript (javascript)

위 코드에서 직접 name.length를 호출하면 name이 null이므로 오류가 발생합니다. 먼저 name != null을 검사하고 name이 null이면 첫 조건 자체가 false이므로 뒤 로직은 실행되지 않아 오류가 생기지 않습니다.

세 논리 연산자의 우선순위

! > && > ||

수학 연산과 마찬가지로 우선순위 높은 연산자부터 계산하며, 계산 순서를 바꾸고 싶으면 ()로 묶습니다.

if (!done && (col == 0 || col == 3)) {
  // ...처리 로직...
}Code language: JavaScript (javascript)

계산 순서:

  1. 괄호 내부:col == 0 || col == 3 먼저 계산(열이 0 또는 3인지 확인)
  2. !done 부정 연산 실행
  3. 두 결과를 &&로 논리곱 연산

예시

void main() {
  bool done = false;
  int col = 3;

  // 공식 예제
  if (!done && (col == 0 || col == 3)) {
    print("실행 로직:완료되지 않았고 열이 0 또는 3");
  }

  // 논리 부정 ! 데모
  bool isFinish = true;
  print(!isFinish); // false

  // && 논리곱 데모
  int a = 10, b = 20;
  if (a > 5 && b > 10) {
    print("a는 5보다 크고 b는 10보다 크다");
  }

  // || 논리합 데모
  int score = 55;
  if (score < 60 || score > 90) {
    print("점수가 불합격이거나 우수점수");
  }

  // 단락 평가 데모
  bool func() {
    print("함수 실행됨");
    return true;
  }
  false && func(); // 왼쪽 false, func 출력 X
  true || func(); // 왼쪽 true, func 출력 X
}Code language: PHP (php)

실행 결과

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
실행 로직:완료되지 않았고 열이 0 또는 3
false
a는 5보다 크고 b는 10보다 크다
점수가 불합격이거나 우수점수Code language: JavaScript (javascript)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다