논리 연산은 오직 불리언 값(true /false)만 다루며, ‘조건이 성립하는지 판단’하는 데 사용합니다. 최종 결과는 두 가지밖에 없습니다: true(참, 조건 만족), false(거짓, 조건 불만족).
코드 안의 모든 if, while/for 반복문 조건 판단, switch 분기 조건은 내부적으로 전부 논리 연산으로 구현됩니다.
주요 연산자는 세 가지입니다: AND, OR, NOT
| 연산자 | 이름 | 기능 설명 |
|---|---|---|
&& | 논리곱(AND) | 양쪽 값이 모두 true일 때만 결과가 true; 단락 평가 지원 |
| || | 논리합(OR) | 한쪽이라도 true면 전체 결과가 true; 단락 평가 지원 |
!expr | 논리 부정(NOT, 반전) | 불리언 값 반전: true는 false로, false는 true로 바꿈 |
논리곱, 논리합, 부정은 중학교 물리에서 배운 직렬회로, 병렬회로와 원리가 비슷합니다. 직렬회로가 논리곱, 병렬회로가 논리합에 해당합니다.
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 && true | true |
true && false | false |
false && true | false |
false && false | false |
양쪽이 모두 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 || true | true |
| true || false | true |
| false || true | true |
| false || false | false |
예시를 보겠습니다
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)
계산 순서:
- 괄호 내부:
col == 0 || col == 3먼저 계산(열이 0 또는 3인지 확인) !done부정 연산 실행- 두 결과를
&&로 논리곱 연산
예시
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)