소스코드리뷰(II) 논리연산을 간결히 하라
[목차(도우미)]
같은 결과를 얻는 것으로 만족하지 말고 최적화된 소스코드를 작성할 수 있도록 연구해야 한다.
논리적으로 명쾌한 소스코드는 에러가 적고 유지보수가 간결하다. 그리고 실행 속도를 높이는 결과로 이어진다.흔히 사용하는 판단문의 예
if (p = True) then
if (q = True) then
Z := I //expression
else
Z:= II; //expression
else begin
if (q = True) then
Z := III //expression
else
Z:= IV; //expression
end;
여기서 ( p = True) 는 p 와 진리값이 같으므로 if p then 만으로 충분하다.
그러나 간단한 논리연산식을 사용하면 실행 속도를 높일수 있다. 그리고 복잡한 판단을 피하고 기계적 연산을 수행함으로 소스가 간단해 진다.
위의 판단문은 행렬 형식으로 배열해 보면 다음과 같아진다.
Z |
q=T | q=F |
p=T | I | II |
p=F | III | IV |
위 경우 논리식은 Z := I Or II Or III Or IV
I, II, III, IV가 동시에 성립할 수 없으므로 합사건이고 각각의 p, q는 곱사건으로 해석할수 있다.
*이제부터는 논리연산을 대수연산으로 고쳐서 기술한다. Or = +, And = * 또는 생략, Not = ' (작은 따옴표, 프라임 기호)
(참조: 가법표준형)
그러면 p Or F = p 임에 착안하면 True인 경우만 논리합을 구하면 결과식이 구해진다.
예를 들어 (I, II, III, IV) = (T, T, T, F)라면,
Z |
q=T | q=F |
p=T | T | T |
p=F | T | F |
Z: |
= I Or II Or III |
= I + II + III | |
=p*q + p*q' + p'*q |
(양: 너무 어려워서 그냥 잘래요.)
카르노법을 이용하는 방법
이식을 간단히 하는 방법이 있는데, 연산 법칙을 써서 간단히 하기 보다는 카르노도(Karnaugh 도)를 만들었으니 그방법을 사용하는 것이 더욱 간편하다. 카르노법을 이용하는 근본적인 원리는 p + p' = T, p*T = p를 이용하는 것이다.Example I
행렬로 표현한 식 = |
|
= |
|
+ |
|
= p + q |
좀더 확장하여 3가지 변수 p, q, r의 경우라면, 총 8가지 경우의 수가 가능하고 4*2 행렬을 이용하면 된다.
예를 들면 쉽다.
Example II
(p, q) |
r=T |
r=F |
|
TT |
T |
T |
|
TF |
F |
T |
|
FF |
F |
F |
<----- 이 FT 가 아닌 FF 순서에 주의 |
FT |
T |
F |
<----- 이 FT 순서에 주의 |
Z:= | TT FT FF TF |
= |
TF FF FF TF |
+ | FT FT FF FF |
=qr + pr' 임을 쉽게 알수 있다. |
첫번째 요소는 p에 무관하고 (q=T) And (r= T)이므로 qr이 된다.
두번째 요소는 q에 무관하고 (p=T) And (r = F)이므로 pr'이 된다.
결과적으로 8가지 패턴을 가지는 3중 판단문을 한가지 논리식으 로 이어주면 된다!
여기서의 설명을 잘 모르겠으면 불 대수, 카르노도, 카르노맵등을 참고하기 바란다.
'연구개발 이야기' 카테고리의 다른 글
웹프로그램 연구(I) 전체개괄 (0) | 2010.05.23 |
---|---|
소스코드리뷰(III) 다중 중첩을 제거하라 (0) | 2010.05.21 |
소스코드리뷰(I) 변수명의 명명법에 숙달하라 (1) | 2010.05.21 |
소스코드 리뷰에 관하여 (1) | 2010.05.21 |