C# 언어의 논리연산자를 기반으로 정리
논리연산자
- 참과 거짓(논리)을 나타내는 숫자 1과 0만을 이용해서 연산을 수행하게 하는 기호? 상징?을 논리 연산자라고 한다.
The logical(참과 거짓) Boolean(불 타입, 0과 1 또는 true와 false) bool타입의 피연산자를 대상으로 논리적인 연산을 수행한다.
논리연산자에는 단항(unary) 논리 부정 연산자인 !, 이항 논리 연산자인 AND(&), OR(|) 그리고 exclusive OR(^) → 배타논리합(지수?) 그리고 이항 조건 논리 연산자 AND(&&) 그리고 OR(||) 이 있다. 이항 논리 연산자와(AND(&)와 OR(|)) 이항 조건 논리 연산자( AND(&&) 와 OR(||)) 차이가 헷갈림.
- binary (이항 → 연산을 당할 대상: 피연산자를 2개 갖는) &(논리연산자 AND)와 |(논리연산자 OR) 그리고 ^(배타논리합 XOR) 연산자들은 항상 두 개의 피연산자들을 모두 평가한다.
- binary (이항을 갖는) && (conditional logical AND → 조건부의; (...을) 조건으로 한 논리연산자 AND) 그리고
|| (conditional logical OR) 연산자들은 오른쪽 피연산자를(the right-hand operand) 오직 평가가 필요할 때만 평가하는 방식이다.
예를 들어 AND 연산자(&&)의 경우 A && B 라는 식이 있을 때 A가 거짓이면 B의 값을 평가할 필요가 없다. AND 연산은 두 항이 모두 참이어야 결과가 참이기 때문에 A가 거짓이라면 이미 결과는 거짓이기 때문에 B를 평가하지 않고 바로 결과를 반환한다.
또 OR 연산자(||)의 경우 A || B 라는 식이 있을 때 A가 true라면, OR 연산자는 둘 중 하나만 참이면 전체 결과가 참이기 때문에
B를 판단하지 않고 바로 결과를 반환한다. conditial logical operator는 성능 최적화에 유리할 수 있다.
단항(피연산자가 1개 = 연산해야할 대상이 1개 = 하나의 항)에 사용되는 논리 부정 연산자 !(NOT)
논리 부정 연산자는(Logical negation operator) 단항에 사용되며, 연산해야할 대상 즉, 단항 앞에 !(논리 부정 연산자) 를 붙이면, 해당하는 단항의 (현재) 논리를 부정하는 연산이 수행된다. 다시 말해서 ( That is, ) 피연산자가 거짓(false)로 평가될 때, true를 반환한다 → it produces true, if the operand evaluates to false,
Logical AND operator & → 논리 AND 연산자(&): 오퍼랜드(&)가 하나일 때는 (그냥) 논리 연산자다.
&(AND) 연산자는 & 연산자가 갖는 피연산자들의 논리으로 AND 인지를? 연산한다. 만약 x 와 y 가 true 로 평가된다면
x & y 의 결과는 true 가 된다. 그렇지 않으면 결과는 false가 된다. & 연산자는 항상 두 개의 피연산자들을 평가한다.
좌항의 피연산자가(the left-hand operand) false로 평가될 때 연산 결과는 거짓(false)이 된다 → & 연산자를 사용해서 두 항을 연산할 경우 좌항, 우항 모두 참이어야 결과는 참이 되는데, 좌항의 피연산자를 먼저 연산했을 때 결과가 false라면 전체결과는(즉 이 연산의 전체결과는) false가 된다. regardless of the value of the right-hand operand: (좌항의 결과가 false라면) 우항의 피연산자의 값과 상관없이 전체적인 결과의 값은 false가 된다. 그러나 전체결과는 이미 정해졌음에도 우항의 피연산자는 평가된다. & 연산자를 사용했을 때 좌항의 값이 false 여서 반환될 값이 정해졌다할지라도 우항의 피연산자 또한 평가된다는 것이 핵심이다.
***& 연산자를 사용했을 때 (좌항의 피연산자가 false로 평가되어 전체식의 결과가 false인 상황에서) 우항의 피연산자가 메서드 호출일 때, 좌항의 피연산자의 값과 관계없이 우항의 메서드 호출이 수행된다.
Logical exclusive OR operator ^ → 배타논리합
^연산자는 배타논리합을 연산한다. ^연산자는 논리 XOR이라고도 알려져 있다. ^ = 논리 XOR
x가 true로 평가되고, y가 false로 평가되면 x^y의 결과는 true다.
논리 OR 연산자(|)
| 연산자는 | 연산자를 중심으로 양 옆의 피연산자들을 대상으로 논리 OR을 연산한다.
x 또는 y가 true로 평가된다면 → x와 y중 아무거나 하나(이상의)가 true라면 x | y 의 결과는 true가 된다.
그렇지 않으면 ( x 그리고 y 모두 false라면) 결과는 false가 된다. The | operator ( | 연산자)는 항상 피연산자들을 모두 평가한다.
좌항의 피연산자의 결과가 true라면 우항의 피연산자의 결과에 상관없이 전체 결과는 true다. 그러나 (이미 전체 식에 대한 결과가 결정 났다고 할지라도) 우항의 피연산자는 평가된다 → 피연산자중 하나라도 true라면 true의 값이 반환되는 &연산자의 특성, 좌항의 피연산자를 평가했을 때 값이 true라면 전체 식의 결과는 true가 된다. 하지만 전체 식의 결과가 결정됐다 할지라도 우항의 피연산자는 평가된다는 것이 중요 포인트다.
conditional logical OR 연산자: 조건 논리 연산자인 OR(||)의 경우, || 이 연산자의 피연산자들은 논리 OR 연산이 수행된다.
그러나 좌항의 피연산자가 true로 평가된다면 우항의 피연산자를 평가하지 않는다는 특징이 있다. 아주 중요함.
conditional logical AND 연산자 (&&)
조건 논리 AND 연산자(&&)는 "short-circuiting" 논리 AND 연산자라고도 알려져 있다, &&의 피연산자들을 논리 AND로 연산한다.
만약 x와 y가 모두 true로 평가된다면 x && y 의 결과는 true가 된다. 그렇지 않으면(x와 y중 둘 중 하나라도 false라면) 결과는 false다. x가 false라고 평가된다면 y는 평가되지 않는다 → 아주 중요한 포인트
-----------------------------------------------
일반적으로 bool타입은 true와 false의 값만 가질 수 있다.
bool타입의 변수에 true와 false의 값, 2가지만 저장될 수 있는데,
bool? 타입의 경우 true와 false, 그리고 null의 값을 가질 수 있다.
bool?은 nullable bool타입, null의 값을 허용할 수 있는 bool타입이라는 것
bool? 타입은 논리형 타입, true, false, null 3가지 값을 갖을 수 있다.
예를 들어 bool? test = null; 이렇게 코드를 작성해도 허용된다.
& (논리 AND) 와 |(논리 OR) 연산자들은 3가지 값(false, true, null)을 지원한다.
그래서 &와 | 연산자는 3가지 값을 갖는 논리형 타입인 bool?타입 또한 연산이 가능하다.
- &연산자는 & 연산자의 피연산들이 모두 true로 평가되어야 true를 반환한다.
(평가된 피연산자중에 true는 없고, false가 있다면 null이 있다고 할지라도 결과는 false다)
true와 null만 있다면 결과는 null이다. 모두 null로 평가된다면 결과는 null이다.
3개의 피연산자중 하나라도 null로 평가된다면 결과가 null로 반환됨.
- |연산자는 |연산자의 피연산자가 모두 false로 평가되어야 false를 반환한다.
x또는 y가 (하나라도) true로 평가된다면 x|y의 결과는 true를 반환한다.
둘 중 하나의 피연산자중 true로 평가된다면 다른 하나가 null일지라도 true를 반환한다.
그런데 둘 중 하나는 false이고, 다른 하나는 null이라면 null을 반환한다.
논리 연산자는 연산방식에 따라 논리 연산자와 조건 논리 연산자가 있고,
피연산자의 개수에 따라 단항 연산자와 이항 연산자로 나뉠 수 있고,
피연산자가 null값을 갖을 수 있는지의 여부에 따라 나뉠 수 있는 것 같다.
참고:
1. Boolean logical operators - AND, OR, NOT, XOR:
'공부기록용' 카테고리의 다른 글
[ Java ] 직렬화 개념 맛보기, I/O 클래스 (2) | 2024.10.14 |
---|---|
[ Javascript ] truthy와 falsy, null check, Java의 Serializable 인터페이스 맛보기 (3) | 2024.10.13 |
[ Python ] 정보처리기사 파이썬 문법 정리하다가 파이썬을 다시 공부하는 중...오늘 공부한 내용 정리 ( 실습 위주 ) (6) | 2024.10.11 |
[ 정보처리기사 ] 프로그래밍 언어(Python) (8) | 2024.10.10 |
[ 정보처리기사 ] 프로그래밍 언어(Java) (2) | 2024.10.10 |