development-logo
소프트웨어 개발자는 코드가 어떻게 실행되는지 정확히 이해해야 할 필요가 있습니다. 우리가 작성한 프로그램은 결국 하드웨어 위에서 동작하며, CPU가 명령어를 해석하고 메모리가 데이터를 관리하는 방식은 시스템 전체의 성능과 안정성에 직결되기 때문입니다. 이런 이유로 컴퓨터 구조를 학습하는 일은 단순한 이론 습득을 넘어, 코드와 하드웨어 간의 연결 고리를 명확히 이해하여 더 나은 설계를 하고 효과적으로 문제를 디버깅할 수 있는 토대를 마련해 줍니다.
이번 스터디에서는 “만들면서 쉽게 배우는 컴퓨터 구조”라는 강의를 통해 컴퓨터가 동작하는 원리와 그 구성 요소들을 단계별로 학습했습니다. 이번 주차에는 컴퓨터 구조의 기초 개념부터 시작해 CPU, 메모리, 주변 장치의 역할을 이해하고, 불 대수를 기반으로 논리 회로를 설계해 보는 과정을 경험했습니다. 특히 실습 환경에 직접 접속하여 간단한 게이트를 조합해 보는 하드웨어 시뮬레이션을 통해 전기 신호가 어떻게 논리적 0과 1로 변환되는지, 그리고 그것이 궁극적으로 프로그램 실행 흐름과 어떻게 연결되는지를 몸소 체득할 수 있었습니다.
본 블로그 포스트에서는 위 과정을 통해 배운 개념들을 기반으로 스터디 미션 수행 결과와 인사이트를 공유하려고 합니다.
이번 미션에서는 4개의 입력(A, B, C, D)을 가지는 AND, OR, NAND, NOR, XOR 연산의 진리표를 작성했습니다.
A | B | C | D | Q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
4입력 AND는 네 입력이 모두 1인 조합(마지막 행)에서만 출력이 1이 됩니다. 그 외 15개 조합에서는 단 한 개라도 0이 존재하므로 결과가 0입니다.
A | B | C | D | Q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
4입력 OR는 네 입력이 모두 0인 경우 첫 행에서만 출력이 0이고, 그 외 15개 조합에서는 적어도 한 입력이 1이므로 출력이 1입니다.
A | B | C | D | Q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 0 |
NAND는 AND의 보수이므로, 네 입력이 모두 1인 마지막 행에서만 출력이 0이 되고, 그 외 모든 조합에서 출력은 1이 됩니다.
A | B | C | D | Q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 0 |
NOR는 OR의 보수로, 네 입력이 모두 0인 첫 행에서만 출력이 1이 되며, 나머지 조합에서는 모두 0이 됩니다.
A | B | C | D | Q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 1 (1개) |
0 | 0 | 1 | 0 | 1 (1개) |
0 | 0 | 1 | 1 | 0 (2개) |
0 | 1 | 0 | 0 | 1 (1개) |
0 | 1 | 0 | 1 | 0 (2개) |
0 | 1 | 1 | 0 | 0 (2개) |
0 | 1 | 1 | 1 | 1 (3개) |
1 | 0 | 0 | 0 | 1 (1개) |
1 | 0 | 0 | 1 | 0 (2개) |
1 | 0 | 1 | 0 | 0 (2개) |
1 | 0 | 1 | 1 | 1 (3개) |
1 | 1 | 0 | 0 | 0 (2개) |
1 | 1 | 0 | 1 | 1 (3개) |
1 | 1 | 1 | 0 | 1 (3개) |
1 | 1 | 1 | 1 | 0 (4개) |
이번 미션을 통해 4개의 입력을 갖는 논리 게이트가 어떻게 동작하는지, 그리고 입력 조합이 많아질수록 직접 진리표를 작성하기 어려워진다는 사실을 깨달을 수 있었습니다.
이번 미션은 주어진 불 방정식들을 간략화 하는 미션입니다.
A( (BB)’ + 0A) + (CC)’ = (AB’) + C
단계별 간략화
BB = B (아이디엠포턴트 법칙: X·X = X)
→ (BB)’ = B’
식 전체는
A( B’ + 0A) + (CC)’
0A = 0 (제로 케리어: 0·X = 0)
→ B’ + 0 = B’
따라서
A B’ + (CC)’
CC = C (아이디엠포턴트 법칙: X·X = X)
→ (CC)’ = C’
결과
A B’ + C’
이제 “A B’ + C’”는 더 이상 축약 불가하므로
최종 결과는
A( (BB)’ + 0A) + (CC)’ = (AB’) + C’
(B’B’) + (AD’ + (CA)’)D = B’ + (D·C’) + (D·A’)
단계별 간략화
B’B’ = B’ (아이디엠포턴트 법칙: X·X = X)
식은
B’ + (AD’ + (CA)’)D
(CA)’ = C’ + A’ (드모르간 법칙: (X·Y)’ = X’ + Y’)
식은
B’ + (AD’ + C’ + A’)D
AD’ + A’ = A’ (흡수법칙: X + X·Y = X)
→ AD’ + C’ + A’ = A’ + C’
따라서
B’ + (A’ + C’)D
분배 → A’D + C’D
B’ + A’D + C’D
최종 결과
(B’B’) + (AD’ + (CA)’)D = B’ + (D·C’) + (D·A’)
(A’B) + B(B1 + BC) = B
단계별 간략화
B1 = B·1 (항등법칙: 1·X = X)
→ B1 = B
따라서
B(B1 + BC) = B(B + BC)
흡수법칙: B + BC = B
B(B + BC) = B
식은
A’B + B
흡수법칙: B + A’B = B
A’B + B = B
최종 결과
(A’B) + B(B1 + BC) = B
B’(1C + BD) + DB = (B’C) + (D·B)
단계별 간략화
1C = C (단위원 법칙: 1·X = X)
→ 1C + BD = C + BD
식은
B’(C + BD) + DB
분배 → B’C + B’B·D
B’C + B’B·D + DB
B’B = 0 (보수법칙: X′·X = 0)
→ B’B·D = 0
B’C + 0 + DB = B’C + DB
최종 결과
B’(1C + BD) + DB = (B’C) + (D·B)
이번 미션을 통해 Boolean 대수를 단계별로 적용하며 불 방정식이 어떻게 점점 단순해지는지 직접 확인할 수 있었습니다. 특히 흡수법칙과 드모르간 법칙을 적재적소에 활용하면 복잡해 보이던 식이 순식간에 깔끔한 형태로 바뀌는 점이 인상 깊었고, 논리 회로 설계나 프로그래밍 시 조건식을 최적화할 때도 같은 원리가 쓰인다는 것을 깨달았습니다. 앞으로 더 복잡한 논리식을 마주해도 두려움 없이 순서대로 법칙을 적용하며 간략화 과정을 밟아 나갈 자신이 생겼습니다.
처음엔 자릿값을 일일이 떠올리는 게 헷갈렸지만, 몇 번 반복하다 보니 이진수를 보고 곧바로 10진수로 바꿀 수 있게 되었습니다. 특히 11111100000₂ 처럼 긴 숫자도 자연스럽게 계산할 수 있게 되어 뿌듯했고, 앞으로 더 길고 복잡한 이진수도 자신 있게 다룰 수 있을 것 같습니다.
10진수를 2진수로 변환할 때, 나눗셈과 나머지를 반복해서 구하는 과정이 처음에는 헷갈렸지만, 몇 번 연습해보니 “가장 큰 2의 거듭제곱 찾기” 방식으로 빠르게 변환할 수 있게 되었습니다. 특히 516₁₀ 같은 큰 수도 2⁹(512)부터 차례로 빼나가면 자연스럽게 이진수가 나와서 편리했습니다. 앞으로도 숫자 체계 변환이 필요할 때 직관적으로 처리할 수 있을 것 같습니다.
이렇게 몇 가지 조합을 확인해 보니, 회로가 (B′·C) + (D·B) 대로 정확하게 동작했습니다.
이렇게 몇 가지 조합을 확인해 보니, 회로가 (AB’) +C 대로 정확하게 동작했습니다.
이렇게 몇 가지 조합을 확인해 보니, 회로가 B’ + (DC’) + (DA’) 대로 정확하게 동작했습니다.
이번 미션을 통해 Logisim에서 불 방정식을 하나하나 직접 회로로 구현해보면서, 이론과 실제가 연결되는 과정을 확실히 이해할 수 있었습니다. 특히 식을 분해해 게이트 단위로 설계하고, 다양한 입력 조합으로 검증해보니 불 회로 동작 원리가 더 명확해졌습니다. 블로그에 정리하면서 설명을 구체적으로 써두니, 나중에 복습하거나 다른 사람에게 공유할 때도 큰 도움이 될 것 같습니다.
이번 스터디 미션을 통해 진리표 작성, 불 대수 간략화, 진법 변환, 그리고 Logisim을 이용한 논리 회로 구현까지 직접 해보면서, 이론이 실제 회로와 어떻게 연결되는지 쉽게 체감할 수 있었습니다. 각 단계별로 손으로 직접 확인하고 검증해보니 논리 연산 원리가 머릿속에 더 선명하게 남았습니다. 앞으로도 이 경험을 바탕으로 새로운 논리 설계나 회로 구현에 자신 있게 도전해 나가겠습니다. 감사합니다.
들어가며 소프트웨어를 개발할 때 메모리 관리 방식은 프로그램의 안정성과 성능을 좌우하는 핵심 요소입니다. 특히 자바스크립트,…
서론 현대 웹 애플리케이션 아키텍처에서 웹 서버(Web Server) 와 웹 애플리케이션 서버(WAS, Web Application Server)…
HTTP 헤더(Header)란? HTTP(Header)는 클라이언트와 서버 간에 교환되는 메타데이터로, 요청(Request)과 응답(Response)에 부가적인 정보를 실어 나르는 역할을…
Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…
Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…
테스트 시 의존성 주입(Dependency Injection)과 Mockito Spring 애플리케이션을 개발하다 보면, 테스트 코드에서 실제 빈(Bean)을 사용하지…