-
CS지식1 - 컴퓨터 그림의 큰그림CS지식 2024. 11. 9. 09:39
1. 원리를 모르는 개발자는 뛰어난 개발자가 아니다.
1.1. 일단 작동만 하는 코드 VS 제대로 작동하는 코드
프로그램의 실행 원리에 대한 이해를 생략한 채 '일단 작동만 하도록 만드는 것'과 프로그램의 실행원리를 이해하며 '제대로 작동하게 만드는 것' 둘 중 더 쉬운 것은 무엇일까? 언뜻 보기에는 '일단 작동만 하도록 만드는 것'이 더 쉬운 것처럼 보일수 있다. 하지만 개발된 프로그램을 사용하는 사람들이 생기고 프로그램의 유지보수까지 고려해야 할 시기가 되면, '일단 작동만 하도록 만든 프로그램'이 사실은 겉보기에만 작동하는 것처럼 보였을 뿐이었다는 사실을 깨닫게 된다. 언제든 개발자가 간과했던 지점이 발견될 수 있고, 때론 사용자들이 개발자의 의도와는 전혀다른 방향으로 프로그램을 사용할 수 있기 때문이다.
1.1.1. 프로그래밍 언어의 기초 문법이나 프레임워크, 라이프러리의 기초 사용법만을 학습한 개발자 지망생의 경우
이 지망생은 '일단 작동만 하는 프로그램 만들기'를 목적으로 프로그래밍 강의나 책에서 제시하는 소스코드를 무작정 따라 하면서 어느 정도 작동하는 웹사이트를 만들었다. 특정 기능을 추가하고 싶을 때는 무작위로 검색한 블로그의 소스 코드를 복사해 붙여넣기 하며 프로그램을 개발했다.
그러나 누구나 한 번에 완벽한 프로그램을 개발하기란 어렵듯, 예상했던 것보다 많은 버그를 만나게 된다. 문제의 원인이 무엇인지 특정하기조차 어려운 버그도 있었고 참고했던 강의나 책, 블로그에서는 접하지 못했던 버그도 있다. 또 프로그램 사용자가 예상하지 못한 추가 기능을 요구할 때도 있다.
일단 작동만 하는 프로그램을 만드는 것이 목표였던 이 지망생은 이런 상황에 당황할 수 밖에 없다. 본인이 작성한 코드가 어떤 과정을 거쳐서 실행되는지 개발한 자신조차 설명할 수 없기 때문이다.
이때 대부분은 구글링으로 문제를 해결하려고 한다. 문제는 프로그래밍 언어의 기초 문법이나 사용법 정도만 알고 있는 경우라면 해결 방법을 찾더라도 그 방법을 이해하지 못하는 경우가 많다는 것이다. 프로그래밍 언어의 기초 문법이나 프레임워크/라이브러리의 기초 사용법은 단순한 프로그램을 개발하기에는 충분한 지식이지만, 그를 확장/유지보수하거나 실행의 전 과정을 이해하는데에는 충분하지 않은 경우가 많기 때문이다. 내가 작성한 코드의 실행 과정을 나 조차 설명할 수 없는 경우에는 더 큰 어려움으로 다가오게 될 것이다.
예제를 복사 붙여놓은 코드는 갈수록 디버깅 시간이 길어지다가 뒤늦게 프로그램의 실행 원리를 파악하고 싶어도 어디서부터 손을 대야 할지 모르는 지경에 이르게 된다. 이렇게 만들어진 코드는 스파게티 코드(spaghetti code)라고 부른다. 작성한 코드가 어떤 과정을 거쳐 실행되는지 설명할 수 없는 상태로 개발을 지속하는 것은 결국 프로그램 개발을 점점 더 어렵게 만드는 방법이다.
뛰어난 개발자는 '일단 작동만 하는 프로그램'이 아니라 '제대로 작동하는 프로그램'을 만든다. 이들은 자신이 작성한 코드가 어떤 과정을 거쳐 실행되는지 명확하고 자세하게 설명할 수 있다. 자신이 개발하고 실행하는 프로그램의 원리를 이해하고 있기 때문에 문제를 맞닥뜨리더라도 어디가 문제인지, 어떻게 해결해야 하는지 빠르게 판단할 수 있다. 문제를 정의하고 해결하는 역량은 프로그램의 실행을 제대로 이해하는 것, 어떤 과정을 거쳐 프로그램이 실행되는지를 설명하는 것부터 시작된다.
1.1.2. 프로그램의 원리를 이해하기 위한 컴퓨터 과학
사과가 떨어지는 현상을 물리학으로 이해하듯, 프로그램의 작동은 컴퓨터 과학으로 이해할 수 있다. 단순히 프로그래밍 언어의 기초 문법이나 프레임워크/라이브러리의 사용법, 메서드의 종류를 암기하는 것만으로는 뛰어난 개발자가 되는데 한계가 있다. 즉, 단순 프로그래밍 언어의 기초 문법, 프레임워크/라이브러리의 사용법을 넘어 프로그램의 작동 원리를 이해하고 설명하기 위해서는 컴퓨터 과학(CS)에 대한 학습이 필요하다.
1.2. 컴퓨터 과학지도 그리기: 기술 면접에 대비하고 싶다면
운용하던 서버가 갑자기 작동하지 않거나 특정 지점에서 성능이 저하됐을 때, 잘 연결되던 네트워크가 끊어졌을 때는 어떻게 문제를 해결할 수 있을까? 사용자로부터 받아들인 수많은 정보를 저장하고 다뤄야 할 때, 어떤 형태로 저장해야 최적의 성을을 낼 수 있을까?
'컴퓨터 과학은 단순 암기 과목이 아니며, 프로그램의 실행 원리를 이해하는 것이 곧 실무의 문제 해결에 도움을 줄 수 있다'는 말을 잘 곱씹어 보면 '개발 실무를 위한 컴퓨터 과학'과 '기술 면접을 위한 컴퓨터 과학'이 다르지 않다는 것을 알 수 있다.
2. 컴퓨터 구조
2.1.1 컴퓨터가 이해하는 정보
프로그램을 개발하기 위해서는 프로그래밍 언어로 소스 코드를 작성해야 한다. 그런데 정작 컴퓨터는 자바, C++,파이썬과 같은 프로그래밍 언어를 직접 이해하지 못한다. 컴퓨터가 이해할 수 있는 정보는 따로 있다. 바로 데이터와 명령어이다. 작성된 소스 코드는 내부적으로 컴퓨터가 이해할 수 있는 데이터와 명령어의 형태로 변환된 뒤에 실행된다. 일반적으로 사용되는 명령어의 생김새는 대략 위와 같다. 컴퓨터의 명령어 역시 수행할 동작과 수행할 대상으로 이루어져 있다.
데이터는 숫자,문자,이미지,동영상과 같은 정적인 정보를 의미한다. 컴퓨터와 주고받는 정보나 컴퓨터에 저장된 정보 자체를 데이터라고 통칭하기도 한다. 가령 앞에서 예로든 명령어에서 '1'과 '2'라는 숫자나 "hello world"라는 문자열, 'cat,jpg'라는 파일명은 모두 데이터이다. 잘 살펴보면 데이터는 있는 그대로 정보를 말하고, 명령어는 이 데이터를 활용하는 정보라는 사실을 눈치챌 수 있다. 즉, 데이터는 명령어에 종속적인 정보 이며, 명령의 대상이자, 명령어의 재료라고 할 수 있다.
컴퓨터는 기본적으로 0과1만을 이해할 수 있으므로 데이터와 명령어 또한 0과 1로 이루어져 있다. 즉, 컴퓨터는 0과 1만으로 다양한 숫자(정수,실수)와 문자 데이터를 표현하며, 이 데이터를 활용해 명령어를 실행한다. 이 명령어를 이해하고 실행하는 주체가 CPU이다. 명령어를 이해하고 실행하는 주체가 CPU라는 말은 CPU의 종류에 따라 실행 가능한 세부적인 명령어의 종류와 처리의 양상이 달라질 수 있음을 의미한다. 하지만 큰 틀에서 보면 CPU의 종류와 무관하게 공통적으로 활용되는 명령어는 어느 정도 정해져 있다. 따라서 대표적인 명령어의 종류에는 어떤 것들이 있는지, CPU가 이러한 명령어를 처리하는 순서인 명령어 사이클이 무엇인지 알아보자.
2.1.2. 컴퓨터의 핵심 부품
세상에는 다양한 종류의 컴퓨터가 있다. 노트북, 데스크톱, 서버 컴퓨터, 스마트폰 모두 컴퓨터의 일종이라고 볼 수 있다. 하지만 컴퓨터를 작동시키는 컴퓨터의 핵심 부품은 크게 다르지 않다. 바로 CPU(중앙처리장치), 메모리(주기억장치), 캐시 메모리, 보조기억장치, 입출력장치이다.
CPU
컴퓨터가 이해하는 정보에는 크게 데이터와 명령어가 있다. 이러한 정보를 읽어 들이고, 해석하고, 실행하는 부품이 바로 CPU(Central Processing Unit)이다. 사람으로 비유하자면 두뇌에 해당하는 부품이라고 볼 수 있다. CPU는 대단히 정교한 부품이지만, 다행이도 개발자가 이 정교한 CPU의 내부 회로까지 모두 알아야하는 일은 드물다. 따라서 CPU의 주요 구성 요소와 빠른 명령어 처리를 위한 기술, 이 2가지를 집중학습하는 것이 좋다. CPU의 내부에는 다음과 같이 산술논리연산장치(이하 ALU)와 제어장치를 포함한 여러 레지스터들이 있다.
- 산술논리연산장치(ALU, Arithmetic and Logic Unit) : 사칙 연산, 논리 연산과 같은 연산을 수행할 회로로 구성되어 있는 일종의 계산기이다.
- 제어장치(CU, Control Unit) : 명령어를 해석해 제어 신호라는 전기 신호를 보내는 장치이다. 제어 신호(control signal)란 부품을 작동시키기 위한 신호를 말한다. CPU가 메모리를 향해 제어 신호를 보내면 메모리를 작동시킬수 있고, 입출력장치를 향해 제어 신호를 보내면 입출력장치를 작동시킬 수 있다.
- 레지스터(register) : CPU내부의 작은 임시 저장장치로, 데이터와 명령어를 처리하는 과정의 중간값을 저장한다. 여러개의 레지스터가 존재하명, 각기 다른 이름과 역활을 가지고 있다.
이 중 가장 중요한 구성 요소는 바로 레지스터이다. CPU가 처리하는 명령어는 반드시 레지스터에 저장되기 대문에 레지스터 값만 잘 관찰해도 프로그램이 어떻게 실행되는지 가장 낮은 단계에서 파악할 수 있다.
메모리와 캐시 메모리
두 번째 핵심 부품은 메인 메모리(주기억장치)이다. 메인 메모리는 흔히 메모리라고 줄여서 부른다. 메모리를 설명하기 전에 필요한 전제가 한가지 있다. 메인 메모리(main memory)역할을 하는 하드웨어에는 RAM과 ROM이 있고, 일반적으로 '(메인)메모리'라는 용어는 RAM을 지칭하는 경우가 많다는 점이다. 따라서 앞으로는 '메모리'가 RAM을 지친한다고 전제한다.
CPU가 읽어 들이고, 해석하고, 실행하는 모든 정보는 어딘가에 저장되어 있어야 하며, 이 정보를 저장하는 장치가 바로 메모리이다. 즉, 메모리는 현재 실행 중인 프로그램을 구성하는 데이터와 명령어를 제장하는 부품이다. 여기서 중요한 것은 '실행 중인' 프로그램을 저장한다는 것이다. 프로그램이 실행되려면 그 프로그램을 이루는 데이터와 명령어가 메모리에 저장되어 있어야 한다.
메모리(RAM)와 관련해 기억해야 할 중요한 배경지식 중 하나는 주소라는 개념이고, 다른 하나는 휘발성이라는 개념이다. CPU가 메모리에 접근할 때 컴퓨터가 빠르게 작동하기 위해서는 메모리속 데이터와 명령어가 중구난방으로 저장되어 있지 않아야한다. 즉 정돈되어 있어야 한다는 것을 의미한다. 그래서 사용되는 개념이 바로 주소 address이다. 실행활에서 원하는 목적지를 찾기 위해 주소가 필요하듯, 컴퓨터에서도 CPU가 원하는 정보로 접근하기 위해서는 주소가 필요하다.
위 그림은 1번지와 2번지에는 명령어, 3번지와 4번지에는 데이터가 저장되어 있고, 5번지와 6번지에는 아무것도 저장되어 있지 않은 상태의 메모리를 표현한 그림이다.
휘발성(volatile)은 전원이 공급되지 않을 때 저장하고 있는 정보가 지워지는 특성을 의미한다. 메모리(RAM)는 휘발성 저장장치로, 메모리에 저장된 정보는 컴퓨터의 전원이 꺼지면 모두 삭제된다. 이는 메모리를 이해하기 위한 중요한 특성이름로 기억해 두는 것이 좋다.
추가로, 메모리를 학습할 때 반드시 함께 알아 두어야 하는 저장장치가 있다. 바로 캐시 메모리이다. CPU와 메모리 사이에는 반드시 하나 이상의 캐시 메모리가 있다. 캐시 메모리(cache memnory)는 CPU가 조금이라도 더 빨리 메모리에 저장된 값에 접근하기 위해 사용하는 저장장치이다. 빠른 메모리 접근을 보조하는 저장장치인 셈이다. 캐시 메모리는 CPU안에 위치하기도 하고, CPU 밖에 위치하기도 하며, 여러 종류가 있다.
보조기억장치
앞서 메모리는 휘발성 저장장치라고 했다. 그래서 컴퓨터의 전원이 꺼지면 저장된 정보를 모두 잃는다. 이를 보조하기 위해 보조기억장치(secondary storage)를 사용하다. 즉, 보조기억장치는 전원이 꺼져도 저장된 정보가 사라지지 않는 비휘발성(non-volatie) 저장장치이다. CD-ROM이나 DVD,하드 디스크 드라이브, 플래시 메모리(SSD, USB메모리), 플로피 디스크와 같은 저장장치가 보조기억장치의 일종이다. 오늘날 컴퓨터에 자주 사용되는 보조기억장치는 하드 디스크 드라이브와 플래시 메모리 기반 SSD이다.
메모리가 현재 실행 중인 프로그램을 저장한다면, 보조기억장치는 보관할 프로그램을 저장한다고 할 수 있다. 유의할 점은 CPU가 보조 기억장치에 저장된 프로그램을 곧장 가져와 실행할 수 없다는 점이다. 어떠한 프로그램을 실행하려면 보조기억장치에서 보관하고 있는 프로그램을 메모리로 복사해야한다.
입출력장치
입출력장치(input/output device)는 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치를 말한다. 말 그대로 컴퓨터에 어떠한 입력을 할 때 사용하는 장치가 입력장치, 컴퓨터의 정보를 받기 위해 사용하는 장치가 출력장치이다. 이를 테면 마우스, 키보드, 마이크 등은 입력장치이고 스피커, 모니터, 프린터 등은 출력장치이다.
참고로, 보조기억장치와 입출력장치는 완전히 배타적인 개념이 아니다. 보조기억장치는 결국 메모리를 보조하는 임무를 수행하는 특별한 입출력장치로 볼 수 있다. 보조기억장치가 컴퓨터 내부와 정보를 주고받는 방식이 입출력장치와 크게 다르지 않기 때문에, 보조기억장치와 입출력장치를 주변장치(peripheral device)라고 통칭하기도 합니다.
메인 보드와 버스
앞에서 살펴본 컴퓨터의 핵심 부품들은 공중에 떠 있지 않는다. 이 부품들을 고정하고 연결한느 기판에 연결되어 있다. 이 기판을 메인 보드(main boared)혹은 마더 보드mother board라고 부른다. 메인 보드에는 컴퓨터의 핵심 부품을 비롯한 여러 부품들을 연결할 수 있는 슬롯과 연결 단자들이 있다.
메인 보드에 연결된 부품들은 각자의 역할을 적절히 수행하기 위해 서로 정보를 주고받는다. 이때 각 컴퓨터 부품들이 정보를 주고받는 통로를 버스(bus)라고한다. 버스 종류는 다양하지만, 앞서 설명한 핵심 부품들을 연결하는 시스템 버스(system bus)가 가장중요하다고 할 수 있다. 사람으로 비유하면 몸을 지탱하는 척추와 같다고 할 수 있다.
[출처 - 이것이 취업을 위한 컴퓨터 과학이다 저, 강민철]
https://www.hanbit.co.kr/store/books/look.php?p_code=B3079890360