검수요청.png검수요청.png

"논리연산자"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
(개요)
 
(같은 사용자의 중간 판 7개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''논리 연산'''(logical operation, logical connective) 혹은 '''불 연산'''(boolean operation)은 진리값으로 불리는 참, 거짓 두 가지 원소만 존재하는 집합(환으로 불림)에서의 연산이다. [[논리합]](OR, ∨), [[논리곱]](AND, ∧), [[부정]](NOT, ~/¬), 배타적 논리합(XOR, ⊕), 명제, 동치 등이 있다. 수학의 [[논리학]]이나 [[프로그래밍 언어]]에서 사용한다. 프로그래밍 언어에서는 비트연산이라고도 한다.
+
'''논리 연산'''(logical operation, logical connective) 혹은 '''불 연산'''(boolean operation)은 진리값으로 불리는 참, 거짓 두 가지 원소만 존재하는 집합(환으로 불림)에서의 연산이다. [[논리합]](OR, ∨), [[논리곱]](AND, ∧), [[논리부정]](NOT, ~/¬), 배타적 논리합(XOR, ⊕), 명제, 동치 등이 있다. 수학의 [[논리학]]이나 [[프로그래밍 언어]]에서 사용한다. 프로그래밍 언어에서는 비트연산이라고도 한다.
  
 
==개요==
 
==개요==
논리식을 구성하는 요소이며 부정이나 논리곱, 논리합 등을 들 수 있다. 즉, 하나 또는 그 이상의 오퍼랜드에 적용되는 논리 기능을 갖는 단어나 기호. 부정이라 부르는 단항 연산에서는 오퍼랜드의 앞에 오지만 2항 연산에서는 오퍼랜드 중간에 온다.
+
[[논리 연산자]]는 두 개의 논리 값을 연산하여 참 또는 거짓을 결과로 얻는 연산자로 '!(not), &&(and), ∥(or)'이 있다. 피연산자로 boolean형 값을 결과로 하는 조건식만을 허용하며 '&&'가 '∥' 연산보다 우선순위가 높으므로 한 조건식에 '&&'와 '∥'가 함께 사용될 때는 괄호를 사용하여 우선순위를 명확하게 해주어야 한다. '&&'는 AND 연산자로 피연산자 양쪽 모두 참(True)이면 참이다. '∥'OR 연산자로 피연산자 중 어느 한 쪽이 참(True)이면 참이다. 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있으며, '&&'의 경우에는 연산결과가 거짓(False)일 확률이 높은 피연산자를 연산자의 좌측에 놓아야 더 빠른 연산결과를 얻을 수 있다.<ref name="논리 연산자">〈[https://programmer-seva.tistory.com/9 논리 연산자 및 비트 연산자]〉, 《세바의 코딩교실》, 2016-01-28</ref>
<ref name="논리연산자란">〈[https://terms.naver.com/entry.nhn?docId=1603652&cid=50372&categoryId=50372 논리연산자란]〉, 《네이버 지식백과》</ref><br>
 
 
 
==등장배경/역사==
 
불 대수(Boolean algebra)는 19세기 중반 영국의 수학자 조지 불(George Boole, 1815년 11월 2일 ~ 1864년 12월 8일)이 고안하고 형식화한 대수 체계를 의미한다.<ref name="논리연산자의 역사">〈[https://namu.wiki/w/%EB%85%BC%EB%A6%AC%20%EC%97%B0%EC%82%B0#fn-1 논리연산자의 역사]〉, 《나무위키》</ref><br>
 
논리 연산(logical operation, logical connective)으로도 불린다. 수리 논리학이나 컴퓨터공학과에서, 두 개의 상태인 참(1, T, True)과 거짓(0, F, False)으로 불 연산(Boolean expression)이라 한다. 불 대수의 출현 이후로 논리학은 기호논리학의 성향이 강해지기 시작한다.
 
  
프로그래밍에서는 조건에 의한 분기나 반복을 만드는 데 이용되고, 디지털 논리 회로를 배울 때 유용하게 사용된다. 디지털 회로의 신호는 0과 1로만 구성되어 있기 때문이다. 전자계통에선 논리 연산을 하는 소자를 게이트(Gate)라고 하며 트랜지스터 여러 개를 조합해서 만들 수 있다.
 
 
이산수학에서는 속(Lattice) 중 Complementary Lattice이며 Distributive Lattice인 Lattice를 불 속(Boolean Lattice)이라 하며 이를 대수(Algebra)식으로 나타낸 것을 불 대수(Boolean Algebra)라고 한다. 불 속의 원소 개수는 해당 원자(atom) 개수 n에 대해 2n개이다. 즉, 불 속의 원소 개수는 2의 제곱수대로 올라간다고 보면 된다.
 
 
==특징==
 
 
===종류===
 
==== 논리합(OR; ||) ====
 
두 명제 중 어느 한 명제만 참이어도 참값을 돌려준다.<ref name="논리연산자의 역사"/> C언어의 영향을 받은 프로그래밍 언어에서는 일반적으로 |를 논리합 연산자로 사용한다. 불 대수에서는 OR는 덧셈과 동치여서, 논리합(Boolean Addition)으로 부른다. 아래에서 보듯 1 + 1 = 1 임을 주의해야 한다. A+B로 표시한다.<br><br>
 
OR 연산자는 두 개의 수직선 기호로 만들 수 있다.<ref name="논리연산자 종류">〈[https://ko.javascript.info/logical-operators 논리 연산자 종류]〉, 《JS》, 2020-01-08</ref><br>
 
전통적인 프로그래밍에서 OR 연산자는 불린값을 조작하는 데 쓰인다. 인수 중 하나라도 true이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
 
 
:{|class=wikitable width=300 style="background-color:white"
 
|+
 
!align=center colspan="2"|AND 연산 결과
 
|-
 
|align=center|입력값
 
|align=center|반환값
 
|-
 
|align=center|0, 0
 
|align=center|1
 
|-
 
|align=center|0, 1
 
|align=center|1
 
|-
 
|align=center|1, 0
 
|align=center|1
 
|-
 
|align=center|1, 1
 
|align=center|1
 
|-
 
|}
 
 
==== 논리곱 (AND; &&) ====
 
두 명제가 모두 참이어야 참값을 돌려준다.<ref name="논리연산자의 역사"/> C언어의 영향을 받은 프로그래밍 언어에서는 일반적으로 &를 논리곱 연산자로 사용하며, 불 대수에서는 AND는 곱셈과 동치이다. 불 곱(Boolean Multiplication) 혹은 논리곱이라 부른다. 아래의 연산결과를 보면 왜 곱셈과 동치인지 쉽게 알 수 있을 것이다. AB 또는 A·B로 표시한다.<br><br>
 
두 개의 앰퍼샌드를 연달아 쓰면 AND 연산자 &&를 만들 수 있다.<ref name="논리연산자 종류"/><br>
 
전통적인 프로그래밍에서 AND 연산자는 두 피연산자가 모두가 참일 때 true를 반환한다. 그 외의 경우는 false를 반환한다.
 
 
:{|class=wikitable width=300 style="background-color:white"
 
|+
 
!align=center colspan="2"|AND 연산 결과
 
|-
 
|align=center|입력값
 
|align=center|반환값
 
|-
 
|align=center|0, 0
 
|align=center|0
 
|-
 
|align=center|0, 1
 
|align=center|0
 
|-
 
|align=center|1, 0
 
|align=center|0
 
|-
 
|align=center|1, 1
 
|align=center|1
 
|-
 
|}
 
 
==== 부정 (NOT; !) ====
 
말 그대로 부정(否定)이다.<ref name="논리연산자의 역사"/> 즉, 참과 거짓을 뒤집는다. C언어의 영향을 받은 프로그래밍 언어에서는 일반적으로 !를 부정 연산자로 사용하며, 그 외에 ~A도 많은 프로그래밍 언어에서 사용되며, 필기나 서적 등에서는 A' 또는 A 위에 ㅡ를 그려넣은 <math>\bar{A} </math> 기호가 주로 쓰인다. 불 보수(Boolean Complement)로도 불린다. 이 연산을 하는 회로는 따로 보수기(inverter)라는 이름으로 불린다.
 
논리 연산자 NOT은 느낌표 !를 써서 만들 수 있다.<br><br>
 
NOT 연산자는 인수를 하나만 받고, 다음 순서대로 연산을 수행한다.<ref name="논리연산자 종류"/><br>
 
1. 피연산자를 불린형(true / false)으로 변환한다.<br>
 
2. 1에서 변환된 값의 역을 반환한다.
 
 
:{|class=wikitable width=300 style="background-color:white"
 
|+
 
!align=center colspan="2"|NOT 연산 결과
 
|-
 
|align=center|입력값
 
|align=center|반환값
 
|-
 
|align=center|0
 
|align=center|1
 
|-
 
|align=center|1
 
|align=center|0
 
|-
 
|}
 
==== 진리표 ====
 
 
:{|class=wikitable width=700 style="background-color:white"
 
:{|class=wikitable width=700 style="background-color:white"
|+
+
|+논리 연산자
!align=center style="background-color:ashgray"|A
+
!align=center style="background-color:ashgray"|x
!align=center style="background-color:ashgray"|B
+
!align=center style="background-color:ashgray"|y
!align=center style="background-color:ashgray"|A and B(A&&B)
+
!align=center style="background-color:ashgray"|x∥y
!align=center style="background-color:ashgray"|A or B
+
!align=center style="background-color:ashgray"|x && y
!align=center style="background-color:ashgray"|A xor B
 
!align=center style="background-color:ashgray"|!A<ref name="진리표">〈[http://tcpschool.com/php/php_operator_logic 진리표]〉, 《TCPSCHOOL》</ref><br>
 
 
|-
 
|-
 
|align=center|true
 
|align=center|true
103번째 줄: 15번째 줄:
 
|align=center|true
 
|align=center|true
 
|align=center|true
 
|align=center|true
|align=center|false
 
|align=center|false
 
 
|-
 
|-
 
|align=center|true
 
|align=center|true
|align=center|false
 
 
|align=center|false
 
|align=center|false
|align=center|true
 
 
|align=center|true
 
|align=center|true
 
|align=center|false
 
|align=center|false
 
|-
 
|-
 
|align=center|false
 
|align=center|false
 +
|align=center|true
 
|align=center|true
 
|align=center|true
 
|align=center|false
 
|align=center|false
|align=center|true
 
|align=center|true
 
|align=center|true
 
 
|-
 
|-
 
|align=center|false
 
|align=center|false
124번째 줄: 30번째 줄:
 
|align=center|false
 
|align=center|false
 
|align=center|false
 
|align=center|false
|align=center|false
 
|align=center|true
 
|-
 
 
|}
 
|}
 +
논리식을 구성하는 요소이며 부정이나 논리곱, 논리합 등을 들 수 있다. 즉, 하나 또는 그 이상의 오퍼랜드에 적용되는 논리 기능을 갖는 단어나 기호. 부정이라 부르는 단항 연산에서는 오퍼랜드의 앞에 오지만 2항 연산에서는 오퍼랜드 중간에 온다.
 +
<ref name="논리연산자란">〈[https://terms.naver.com/entry.nhn?docId=1603652&cid=50372&categoryId=50372 논리연산자란]〉, 《네이버 지식백과》</ref><br>
  
==== 부정 논리곱 (NAND; ↑) ====
+
==등장배경/역사==
Not AND. 논리곱의 결과값을 부정한 것이다.<ref name="논리연산자의 역사"/> , 두 명제가 모두 참이면 거짓값을 돌려주고 그 외에는 참값을 돌려준다. 참고로 NAND만을 통해 다른 논리 연산식을 모조리 구현할 수 있기 때문에 현재 사용되는 플래시 메모리들은 대부분이 NAND 회로로 구성되어 있다.
+
불 대수(Boolean algebra)는 19세기 중반 영국의 수학자 조지 불(George Boole, 1815년 11월 2일 ~ 1864년 12월 8일)이 고안하고 형식화한 대수 체계를 의미한다.<ref name="논리연산자의 역사">〈[https://namu.wiki/w/%EB%85%BC%EB%A6%AC%20%EC%97%B0%EC%82%B0#fn-1 논리연산자의 역사]〉, 《나무위키》</ref><br>
 +
논리 연산(logical operation, logical connective)으로도 불린다. 수리 논리학이나 컴퓨터공학과에서, 두 개의 상태인 참(1, T, True)과 거짓(0, F, False)으로 불 연산(Boolean expression)이라 한다. 불 대수의 출현 이후로 논리학은 기호논리학의 성향이 강해지기 시작한다.
  
:{|class=wikitable width=300 style="background-color:white"
+
프로그래밍에서는 조건에 의한 분기나 반복을 만드는 데 이용되고, 디지털 논리 회로를 배울 때 유용하게 사용된다. 디지털 회로의 신호는 0과 1로만 구성되어 있기 때문이다. 전자계통에선 논리 연산을 하는 소자를 게이트(Gate)라고 하며 트랜지스터 여러 개를 조합해서 만들 수 있다.
|+
 
!align=center colspan="2"|NAND 연산 결과
 
|-
 
|align=center|입력값
 
|align=center|반환값
 
|-
 
|align=center|0, 0
 
|align=center|1
 
|-
 
|align=center|0, 1
 
|align=center|1
 
|-
 
|align=center|1, 0
 
|align=center|1
 
|-
 
|align=center|1, 1
 
|align=center|0
 
|-
 
|}
 
  
==== 부정 논리합 (NOR; ↓) ====
+
이산수학에서는 속(Lattice) 중 Complementary Lattice이며 Distributive Lattice인 Lattice를 불 속(Boolean Lattice)이라 하며 이를 대수(Algebra)식으로 나타낸 것을 불 대수(Boolean Algebra)라고 한다. 불 속의 원소 개수는 해당 원자(atom) 개수 n에 대해 2n개이다. 즉, 불 속의 원소 개수는 2의 제곱수대로 올라간다고 보면 된다.
Not OR. 논리합의 결과값을 부정한 것이다.<ref name="논리연산자의 역사"/>  즉, 두 명제가 모두 거짓이면 참값을 돌려주고 그 외에는 거짓값을 돌려준다. NAND와 마찬가지로 NOR만으로 다른 논리 연산식을 모조리 구현할수 있기에 초기 플래시 메모리들은 대부분이 NOR 회로로 구성하였다. 근데 NAND 회로가 값이 싸다보니 이쪽은 자연스럽게 안 쓰게 됐다.
 
  
:{|class=wikitable width=300 style="background-color:white"
+
==특징==
|+
+
=== AND (&&) ===
!align=center colspan="2"|NAND 연산 결과
+
&&는 좌항과 우항의 값이 모두 참(true)일 때 참이 된다. And라고 읽는다. 다음 예제를 보자. 결과는 1이다. and의 좌우항이 모두 true인 것은 첫 번째 조건문 밖에 없기
|-
+
때문이다.
|align=center|입력값
 
|align=center|반환값
 
|-
 
|align=center|0, 0
 
|align=center|1
 
|-
 
|align=center|0, 1
 
|align=center|0
 
|-
 
|align=center|1, 0
 
|align=center|0
 
|-
 
|align=center|1, 1
 
|align=center|0
 
|-
 
|}
 
  
==== 배타적 논리합 (XOR; ⊕) ====
+
if (true && true) {
두 명제 중 정확히 하나만 참이어야, 혹은 두 명제의 참거짓 여부가 다를 때 참값을 돌려준다. A'B+AB'와 동치이다. <ref name="논리연산자의 역사"/> C언어의 영향을 받은 프로그래밍 언어에서는 ^를 배타적 논리합 기호로 사용한다. 다만 일반적인 경우에는 ^가 제곱으로 사용되기 때문에 처음 프로그래밍 언어를 배우는 사람들은 제곱을 하려고 ^ 기호를 사용했다가 안드로메다로 가는 경우가 있다.() 이 방식으로 특정 '키'를 이용해 암호화를 하면 그 '키'로 복호화가 가능해서, 암호화 기법으로도 널리 사용된다. 비교 대상의 비트가 0이든 1이든 상관 없이 같기만 하면 0을 돌려준다는 특성을 이용하여 어셈블리어 등의 언어에서 어떤 레지스터나 변수를 0으로 초기화할 때 사용되기도 한다. 이런 특성때문에 XOR을 이용해 임시변수 없이 변수를 스왑하는 기법은 메모리사용량에서야 좀 이득을 보겠지만 실제론 거의 사용되지 않는다. 스왑하는 값이 같은 주소를 참조한다면 엉망이 되기 때문.
+
    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);
 +
}
  
결합법칙이 성립하므로 n항연산으로 일반화 가능하다. 이 경우 n개의 입력중 참의 개수가 홀수이면 출력이 참이 되는 연산으로 정의된다.
+
* 1 출력<br><br>
 +
=== OR (||) ===
 +
||(or)는 좌우항 중에 하나라도 true라면 전체가 true가 되는 논리 연산자다. 다음 예를 보자. 결과는 1,2,3이 출력된다. 마지막 조건문의 or는 좌항과 우항이 모두 false이기 때문에 false가 된다.
  
:{|class=wikitable width=300 style="background-color:white"
+
if (true || true) {
|+
+
    System.out.println(1);
!align=center colspan="2"|XOR 연산 결과
+
}
|-
+
|align=center|입력값
+
if (true || false) {
|align=center|반환값
+
    System.out.println(2);
|-
+
}
|align=center|0, 0
+
|align=center|0
+
if (false || true) {
|-
+
    System.out.println(3);
|align=center|0, 1
+
}
|align=center|1
+
|-
+
if (false || false) {
|align=center|1, 0
+
    System.out.println(4);
|align=center|1
+
}
|-
 
|align=center|1, 1
 
|align=center|0
 
|-
 
|}
 
  
 +
* 1, 2, 3 출력<br><br>
 +
=== NOT (!) ===
 +
!는 부정의 의미로 not이라고 읽는다. Boolean의 값을 역전시키는 역할을 한다. true에 !를 붙으면 false가 되고 false에 !을 붙이면 true가 된다. <ref name="논리연산자">〈[https://opentutorials.org/course/1223/5365 논리연산자 java 코드]〉, 《생활코딩》</ref>
  
==== 동치 (EQV; =) ====
+
if (!true) {
두 명제가 다 참이거나 다 거짓이면, 즉 두 명제의 진리값이 같으면 참값을 돌려준다.<ref name="논리연산자의 역사"/> 배타적 논리합(XOR)의 부정이라고 할 수 있으므로 배타적 부정 논리합 (XNOR) 또는 배타적 논리곱이라고도 한다. 수학적으로는 크로네커 델타(<math>\delta_{ij} = \left\{\begin{matrix} 0 \; \; \; \text{if} \; \; \; i \neq j \\ 1 \; \; \; \text{if} \; \; \; i = j \end{matrix}\right.</math>)로 정의돼 있다. [[C언어]] 및 그 파생 언어에서 '='는 대입(:=)을 의미하므로 동치 연산자를 '=='로 표기한다. (A⊕B)'=(AB)와 동치이다. XOR과 달리 결합법칙이 성립하지 않는다.
+
    System.out.println(1);
 
+
}
:{|class=wikitable width=300 style="background-color:white"
+
if (!false) {
|+
+
    System.out.println(2);
!align=center colspan="2"|EQV 연산 결과
+
}
|-
 
|align=center|입력값
 
|align=center|반환값
 
|-
 
|align=center|0, 0
 
|align=center|1
 
|-
 
|align=center|0, 1
 
|align=center|0
 
|-
 
|align=center|1, 0
 
|align=center|0
 
|-
 
|align=center|1, 1
 
|align=center|1
 
|-
 
|}
 
=== 활용 ===
 
==== 항등원(identity) ====
 
군론을 비롯한 대수학에서, 항등원(恒等元, 영어: identity element 또는 neutral element,단위원)이란 임의의 수 a에 대하여 어떤 수를 연산했을 때 처음의 수 a가 되도록 만들어 주는 수를 말한다.<ref name="항등원">〈[https://ko.wikipedia.org/wiki/%ED%95%AD%EB%93%B1%EC%9B%90 항등원]〉, 《위키백과》</ref>
 
  
:{|class=wikitable width=300 style="background-color:ashgray"
+
* 2 출력<br><br>
|+
 
|align=center| A·1 = A = 1·A
 
|-
 
|align=center|A+0 = A = 0+A
 
|-
 
|}
 
 
 
==== 교환법칙 / 결합법칙 / 분배법칙 ====
 
산수와 거의 비슷하다. <ref name="논리연산자의 역사"/> 다만 여기서 주의할 점은 분배 법칙에서 A+(B·C)=(A+B)·(A+C)가 된다는 것이다. 드모르간의 법칙 하단의 설명을 보면 쉽게 이해할 수 있다. 또한 NXOR을 포함하여 NAND, NOR 등 모든 부정 연산은 결합법칙이 성립하지 않는다.
 
 
 
'''교환법칙'''
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center|A+B=B+A
 
|-
 
|align=center|A·B=B·A
 
|-
 
|align=center|A⊕B = B⊕A
 
|}
 
 
 
'''결합법칙'''
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center|(A+B)+C=A+(B+C)
 
|-
 
|align=center|(A·B)C=A·(B·C)
 
|-
 
|align=center|(A⊕B)⊕C = A⊕(B⊕C)
 
|}
 
 
 
'''분배법칙'''
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center|A·(B+C)=A·B+A·C
 
|-
 
|align=center|A+(B·C)=(A+B)·(A+C)
 
|-
 
|align=center|A·(B⊕C) = A·B⊕A·C
 
|}
 
 
 
==== 동일법칙(idempotent) ====
 
계산하려는 두 숫자가 똑같으면 결과도 그 똑같은 값이 나온다는 뜻이다. <ref name="논리연산자의 역사"/> A에 0을 대입했을 때도 성립하고 1을 대입했을 때도 성립하는 것으로 해당 성질을 증명할 수 있다.
 
 
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center| A·A = A
 
|-
 
|align=center|A+A = A
 
|-
 
|}
 
 
 
==== 흡수법칙(absorption) ====
 
전기 회로에서 곱연산을 직렬로, 합연산을 병렬로 생각해보면 이해가 쉽다.<ref name="논리연산자의 역사"/> 아래 식에서 B는 A와 병렬이라서 B가 끊어졌어도 A가 이어져 있으면 그대로 전기가 흐르기 때문에 사실상 B는 없는 것이나 다름없고, A를 직렬로 두 개 단 것과 똑같기 때문에 식이 저렇게 A로 흡수되는 것이다.
 
 
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center| A+A·B = A
 
|-
 
|align=center|A·(A+B) = A
 
|-
 
|}
 
 
 
수학적 증명은
 
 
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center| A·(A+B)
 
|-
 
|align=center|A·A + A·B (∵분배법칙)
 
|-
 
|align=center|A + A·B (∵동일법칙 A·A = A)
 
|-
 
|align=center|A·1 + A·B (∵항등원 A·1 = A)
 
|-
 
|align=center|A·(1 + B) (∵분배법칙)
 
|-
 
|align=center|A·1 (∵ B + 1 = 1)
 
|-
 
|align=center|A (∵항등원 A·1 = A)
 
|}
 
위 식의 증명은 위의 증명에서 3번째 줄부터 같다.
 
 
 
==== 이중부정 법칙(involution) ====
 
이중 부정(二重否定)은 언어학이나 논리학에서 '한 문장이나 문구에서 부정소가 두 번 사용되어 내용적으로 긍정이 되는 부정법'을 가리킨다.<ref name="이중부정">〈[https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%A4%91%EB%B6%80%EC%A0%95 이중부정]〉, 《위키백과》</ref> 이러한 이중부정의 방법은 한 번 부정한 것을 다시 한번 부정하여 긍정을 나타내는 논리식의 중요한 형식중 하나이다. 기호로는 Double Negation의 약자인 DN 이다
 
 
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center|(A')' = A
 
|-
 
|}
 
 
 
==== 드모르간 법칙(De Morgan law) ====
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center| (A·B)'=A'+B'
 
|-
 
|align=center|(A+B)'=A'·B'
 
|-
 
|}
 
식을 깔끔하게 정리할 때 가장 많이 사용되는데다가 NAND 연산, NOR 연산과 밀접한 연관이 있는 만큼 불 대수에서 상당히 중요하게 다뤄지는 성질이다. 오죽하면 대부분 교재에서 이 법칙 하나만 불 대수 파트에서 분리해서 따로 가르칠 정도. <ref name="논리연산자의 역사"/>
 
 
 
사실 머리를 좀 굴려보면 AND와 OR은 같은 구조의 함수지만(항등원끼리 연산하면 항등원, 나머지 경우는 항등원이 아닌 것) AND는 항등원이 1(=0')이고 OR은 항등원이 0(=1')일 뿐이라는 걸 알 수 있는데, 다시 말해 NOT은 ({0 , 1}, AND)에서 ({0, 1}, OR)로 가는 Isomorphism이다. 이중 부정규칙을 이용하면 동시에 NOT은 ({0 , 1}, OR)에서 ({0, 1}, AND)로 가는 Isomorphism이므로 결론적으로 NOT은 ({0 , 1}, AND, OR)에서 ({0, 1}, OR, AND)로 가는(연산이 서로 바뀌었다) Isomorphism이다.
 
 
 
이걸 이용해 드모르간 법칙을 쉽게 증명할 수 있을 뿐만 아니라 성질 항목에 나와있는 한쌍의 공식이 서로를 유도할 수 있다는 걸 쉽게 보일 수 있다.
 
 
 
==== 합의(Consensus) 법칙 ====
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center| AB + BC + CA' = AB + CA'
 
|-
 
|align=center|(A + B)(B + C)(C + A') = (A + B)(C + A')
 
|-
 
|}
 
자세히 보면 가운데 마디가 사라진 것을 볼 수 있다. <ref name="논리연산자의 역사"/><br>
 
위 식의 증명은
 
 
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center| BC
 
|-
 
|align=center|1·BC (∵항등원 A·1 = A)
 
|-
 
|align=center|(A+A')·BC (∵A+A' = 1)
 
|-
 
|align=center|ABC + A'BC (∵분배법칙)
 
|-
 
|align=center|ABC + CA'B (∵교환법칙)
 
|}
 
이것을 이용하여
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center|AB + BC + CA'
 
|-
 
|align=center|AB + ABC + CA'B + CA'
 
|-
 
|align=center|(AB + AB·C) + (CA'·B + CA') (∵결합법칙)
 
|-
 
|align=center|(AB + AB·C) + (CA' + CA'·B) (∵교환법칙)
 
|-
 
|align=center|AB + CA' (∵흡수법칙 A+A·B=A)
 
|}
 
아래의 식도 비슷하다.
 
 
 
=== 연산 우선 순위 ===
 
대수학에서 곱셈 연산이 덧셈 연산보다 우선이듯이, 논리 연산에서도 논리곱(AND)이 논리합(OR) 보다 연산 순위가 높다.<ref name="논리연산자의 역사"/>
 
<br><br>
 
분배법칙의 아래 두 식 중에 첫 번째 식의 우변에는 괄호가 없다. 이는 AND가 OR보다 연산 우선 순위가 높기 때문이다. 괄호가 생략된 것이라 보아도 되는데 A·B와 A·C에 대한 괄호의 존재 여부는 우변의 결과에 영향을 미치지 않는다.
 
:{|class=wikitable width=300 style="background-color:ashgray"
 
|+
 
|align=center|A·(B+C)=A·B+A·C
 
|-
 
|align=center|A+(B·C)=(A+B)·(A+C)
 
|}
 
A·(B+C)=(A·B)+(A·C)=A·B+A·C
 
<br>
 
그리고 부정(NOT) 연산은 AND와 OR보다 연산 우선 순위가 높다.
 
<Br>
 
결국 NOT > AND > OR의 연산 순서가 된다.
 
 
{{각주}}
 
{{각주}}
  
395번째 줄: 100번째 줄:
 
* 〈[https://terms.naver.com/entry.nhn?docId=1603652&cid=50372&categoryId=50372 네이버 지식백과]〉
 
* 〈[https://terms.naver.com/entry.nhn?docId=1603652&cid=50372&categoryId=50372 네이버 지식백과]〉
 
* 〈[https://namu.wiki/w/%EB%85%BC%EB%A6%AC%20%EC%97%B0%EC%82%B0#fn-1 나무위키 : 논리연산]〉
 
* 〈[https://namu.wiki/w/%EB%85%BC%EB%A6%AC%20%EC%97%B0%EC%82%B0#fn-1 나무위키 : 논리연산]〉
* 〈[https://ko.javascript.info/logical-operators js : 논리연산자]〉
+
* 〈[https://ko.javascript.info/logical-operators js : 논리연산자]〉, 2020년 1월 8일
 
* 〈[http://tcpschool.com/php/php_operator_logic TCPSCHOOL : 논리연산자]〉
 
* 〈[http://tcpschool.com/php/php_operator_logic TCPSCHOOL : 논리연산자]〉
 
* 〈[https://ko.wikipedia.org/wiki/%ED%95%AD%EB%93%B1%EC%9B%90 위키백과 : 항등원]〉
 
* 〈[https://ko.wikipedia.org/wiki/%ED%95%AD%EB%93%B1%EC%9B%90 위키백과 : 항등원]〉
 
* 〈[https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%A4%91%EB%B6%80%EC%A0%95 위키백과 : 이중부정]〉
 
* 〈[https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%A4%91%EB%B6%80%EC%A0%95 위키백과 : 이중부정]〉
 +
* 〈[https://opentutorials.org/course/1223/5365 생활코딩 : 논리연산자]〉
  
 
==같이 보기==
 
==같이 보기==

2020년 8월 10일 (월) 15:19 기준 최신판

논리 연산(logical operation, logical connective) 혹은 불 연산(boolean operation)은 진리값으로 불리는 참, 거짓 두 가지 원소만 존재하는 집합(환으로 불림)에서의 연산이다. 논리합(OR, ∨), 논리곱(AND, ∧), 논리부정(NOT, ~/¬), 배타적 논리합(XOR, ⊕), 명제, 동치 등이 있다. 수학의 논리학이나 프로그래밍 언어에서 사용한다. 프로그래밍 언어에서는 비트연산이라고도 한다.

개요[편집]

논리 연산자는 두 개의 논리 값을 연산하여 참 또는 거짓을 결과로 얻는 연산자로 '!(not), &&(and), ∥(or)'이 있다. 피연산자로 boolean형 값을 결과로 하는 조건식만을 허용하며 '&&'가 '∥' 연산보다 우선순위가 높으므로 한 조건식에 '&&'와 '∥'가 함께 사용될 때는 괄호를 사용하여 우선순위를 명확하게 해주어야 한다. '&&'는 AND 연산자로 피연산자 양쪽 모두 참(True)이면 참이다. '∥'는 OR 연산자로 피연산자 중 어느 한 쪽이 참(True)이면 참이다. 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있으며, '&&'의 경우에는 연산결과가 거짓(False)일 확률이 높은 피연산자를 연산자의 좌측에 놓아야 더 빠른 연산결과를 얻을 수 있다.[1]

논리 연산자
x y x∥y x && y
true true true true
true false true false
false true true false
false false false false

논리식을 구성하는 요소이며 부정이나 논리곱, 논리합 등을 들 수 있다. 즉, 하나 또는 그 이상의 오퍼랜드에 적용되는 논리 기능을 갖는 단어나 기호. 부정이라 부르는 단항 연산에서는 오퍼랜드의 앞에 오지만 2항 연산에서는 오퍼랜드 중간에 온다. [2]

등장배경/역사[편집]

불 대수(Boolean algebra)는 19세기 중반 영국의 수학자 조지 불(George Boole, 1815년 11월 2일 ~ 1864년 12월 8일)이 고안하고 형식화한 대수 체계를 의미한다.[3]
논리 연산(logical operation, logical connective)으로도 불린다. 수리 논리학이나 컴퓨터공학과에서, 두 개의 상태인 참(1, T, True)과 거짓(0, F, False)으로 불 연산(Boolean expression)이라 한다. 불 대수의 출현 이후로 논리학은 기호논리학의 성향이 강해지기 시작한다.

프로그래밍에서는 조건에 의한 분기나 반복을 만드는 데 이용되고, 디지털 논리 회로를 배울 때 유용하게 사용된다. 디지털 회로의 신호는 0과 1로만 구성되어 있기 때문이다. 전자계통에선 논리 연산을 하는 소자를 게이트(Gate)라고 하며 트랜지스터 여러 개를 조합해서 만들 수 있다.

이산수학에서는 속(Lattice) 중 Complementary Lattice이며 Distributive Lattice인 Lattice를 불 속(Boolean Lattice)이라 하며 이를 대수(Algebra)식으로 나타낸 것을 불 대수(Boolean Algebra)라고 한다. 불 속의 원소 개수는 해당 원자(atom) 개수 n에 대해 2n개이다. 즉, 불 속의 원소 개수는 2의 제곱수대로 올라간다고 보면 된다.

특징[편집]

AND (&&)[편집]

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

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);
}
  • 1 출력

OR (||)[편집]

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

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);
}
  • 1, 2, 3 출력

NOT (!)[편집]

!는 부정의 의미로 not이라고 읽는다. Boolean의 값을 역전시키는 역할을 한다. true에 !를 붙으면 false가 되고 false에 !을 붙이면 true가 된다. [4]

if (!true) {
    System.out.println(1);
}
if (!false) {
    System.out.println(2);
}
  • 2 출력

각주[편집]

  1. 논리 연산자 및 비트 연산자〉, 《세바의 코딩교실》, 2016-01-28
  2. 논리연산자란〉, 《네이버 지식백과》
  3. 논리연산자의 역사〉, 《나무위키》
  4. 논리연산자 java 코드〉, 《생활코딩》

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 논리연산자 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.