본문 바로가기
코드잇 대학생 코딩캠프

[2월 24일] 코드잇 대학생 코딩 캠프 6,7일차 기록 : 컴퓨터개론 코스 끝!

by manywisdom 2021. 2. 25.

컴퓨터 개론 - 토픽4 : 소프트웨어 이해하기 

□ 오늘의 학습내용

① 컴파일러와 인터프리터

 

(1) 애플리케이션 : 프로그램을 만드는 사람(개발자)이 아닌, 실제 사용자(소비자)가 직접 사용하는 프로그램

→ ex) 카톡, 크롬, 엑셀, ppt, 포토샵 등 / 리모컨이나 버튼으로 조작이 가능한 에어컨, tv, 선풍기 등 

º 프로그래밍 코드를 실제 동작하는 프로그램(=애플리케이션) 으로 바꾸어 주는 역할이 컴파일러와 인터프리터!

 

(2) 컴파일러 = 프로그래밍 언어의 번역기 

- 고수준 언어(사람이 이해하기 쉬운 코드)를 기계어(machine code)로 번역해야 하는데, 이렇게 한 언어를 다른 언어로 번역해 바꿔주는 것을 컴파일러라고 한다. 

- 컴파일러의 작동방식 : 개발자 컴퓨터에서 고수준 언어를 컴파일러를 통해 머신코드로 바꾼 후, 사용자 컴퓨터에는 머신코드만을 넘겨주어 사용자는 실행만 하면 된다. 

- 단점 : 일부 기능을 수정하려면, 고급언어를 다시 수정하고, 컴파일 해주어 코드를 실행해야하는 번거로움과 시간소요가 있기 때문에 빠르게 개발할 수 없다.

- C, C++ 같은 저수준에 가까운 언어들은 컴파일 방식으로 실행됨!

 

(3) 인터프리터 = 실시간 코드 실행기 

- 컴파일 과정 없이 고급언어를 바로 실행할 수 있는 방법을 찾아 개발한 것이 인터프리터! 인터프리터는 한 줄씩 즉흥적으로 프로그램을 실행해주는 프로그램이다. 인터프리터는 코드를 한 줄씩 즉시 실행하기 때문에 코드를 고치고 나서 컴파일의 과정 없이도 바로 결과를 확인할 수 있다. 

- 인터프리터의 작동방식 : 바로 실행할 수 있는 기계어를 사용자 컴퓨터에 넘겨주는 것이 아니라, 개발자컴퓨터에서 작성된 프로그래밍 코드 자체를 보내주게 된다. 사용자의 컴퓨터에서 코드를 기계어로 바꾸는 번역과정을 실시간으로 거치게 된다. 즉, 사용자 컴퓨터에 코드를 실행할 수 있는 인터프리터가 설치되어 있어야 한다.

- 단점 : 실행속도가 느리다. 프로그래밍 코드가 그대로 전달되므로, 코드가 유출될 위험성도 있다.

- 고수준 언어에서 저수준 언어로 갈수록 코드길이가 길어지는데, 따라서 컴파일러 보다 인터프리터 방식의 프로그램 용량이 더 작다. 

- 파이썬, 루비 같은 고수준 언어들은 인터프리터 방식으로 실행됨!

 

② 운영체제 OS (Operating System)

 

   (1) 운영체제

º 정의 : 애플리케이션이 하드웨어와 잘 연결되도록 도와주는 것이 운영체제! 운영체제의 역할이 우리 눈에 보이지는 않지만 컴퓨터나 휴대폰을 매일 쓰고 있다는 것은 운영체제를 매일 쓴다는 의미와 같다.

 [사용자 - 애플리케이션 - 운영체제 - 키보드,마우스,저장장치,스피커 같은 하드웨어]

º 종류 : 컴퓨터 운영체제로는 윈도우10, MacOS, Linux 등이 있고, 휴대폰 운영체제로는 안드로이드, iOS 등이 있다. 

(쉽게 말하면 연주의 지휘자 혹은 축구 심판, 감독하는 사람 같은 역할이랄까..? 하나의 경기와 연주가 잘 마무리 되려면 이들의 역할이 중요하듯, 앱이 하드웨어에서 잘 구현되려면 운영체제의 역할이 매우 중요하다! )

 

   (2) 운영체제의 역할

º 1. 입력과 출력을 관리한다. 

 - 모니터, 키보드, 마우스, 헤드셋 등 하드웨어는 각 제조 회사마다 모-두 기기가 다르다. 이런 다양한 하드웨어들의 조합과 경우의 수를 애플리케이션이 다 고려할 수는 없기에, 운영체제가 여러가지 제조사, 연결방식 등을 다 고려해 정리한 후, 애플리케이션에 신호를 넘겨준다. 입출력 하드웨어 장치와 애플리케이션을 '운영체제'가 "연결"해주기 때문에 애플리케이션은 안정적으로 하드웨어를 사용할 수 있다!

º 2. 저장과 불러오기에 대한 판단과 운영을 한다.  

 - 컴퓨터의 저장장치 : Ram, SSD, 하드디스크 등등

 - 컴퓨터의 저장장치 종류의 구분 기준 : 휘발성인가 비휘발성인가, 속도가 빠른가 느린가, 데이터의 수정이 가능한가 불가능한가

 - 컴퓨터 안에는 정말 여러 종류의 저장장치들이 있고, 이 저장공간을 효율적으로 상황과 목적에 맞게 사용해야하기 때문에 저장과 불러오기를 할 때, "이때는 이런 저장장치를 사용해야해!" 라는 복합적인 판단과 운영을 운영체제가 해준다.

º 3. 컴퓨터의 빠른 멀티태스킹이 가능하도록 한다.

 - 멀티태스킹 : 여러 프로그램들을 동시에 실행되는 것

 - 여러 프로그램을 실행하다보면, 저장장치가 여러 요청을 받다보니 혼란이 생길 수 있다. 그 혼란을 중재해주기 위해, 실행 중인 여러 앱이 각각 사용할 저장공간을 배치해주거나 일의 순서나 분량을 정해주는 것을 운영체제가 한다.

 

   (3) 운영체제의 종류 

º 용도에 따라 데스크톱&랩톱, 모바일, 서버, 임베디드 4가지로 나눌 수 있다. 

 - 데스크톱 & 랩톱 운영체제 : 윈도우, 맥, 리눅스 등

 - 모바일 (스마트폰, 테블릿, 스마트워치) 운영체제 : 안드로이드, ios 등

 - 서버 (기업에서 대용량 데이터를 관리하거나 웹사이트 등을 운영할 때 사용하는 컴퓨터 ex. 구글서버) 운영체제 : unix, ubuntu, redHat 등

 - 임베디드 운영체제 : 컴퓨터가 아닌 기계들 (atm,카메라,엘레베이서,tv 등)에 들어가는 운영체제로, 종류나 환경에 따라 다양하지만 실시간 운영체제가 많이 사용된다. 실시간 운영체제는 무조건 빠른 속도보다, 정해진 시간 내에 안정적이고 확실하게 끝내는 것을 보장해주는 용도의 운영체제이다. 

 

   (4) 운영체제의 역사

º UNIX : at&t라는 회사에서 처음 만들었고, 컴퓨터,서버,모바일 운영체제의 근간이 되는 근본 운영체제이다. 많은 운영체제들이 이 unix라는 하나이 운영체제에서 출발됨!

º POSIX : unix를 시작으로 unix를 모방한 다양한 운영체제들이 생겨나게 되었는데, 이를 표준화하기 위해 등장한 규칙, 규격이 POSIX ! 이 posix 조건을 만족하면 공식 버전으로 인증이 되는 것이다. 

º GNU : 아무래도 UNIX가 회사 소유이다보니, 사용할 때 많은 제약과 비용이 들었는데 많은 사람들이 이에 불편을 느끼고, "'다같이 공유할 수 있는' 운영체제를 만들자!" 해서 만든 것이 unix를 닮은 운영체제를 만드는 프로젝트인 GNU 이다. GNU is Not Unix 라는 문구의 앞글자를 따와서 만든 이름이다. unix와 유사하지만 unix 코드를 한 줄도 사용하지 않고 만든 운영체제이기 때문에 unix-likes 라고 불리기도 한다.

º GNU/LINUX : GNU 프로젝트가 리눅스 커널(kernel : 운영체제의 핵심부분) 과 합쳐지기 시작하면서 리눅스 운영체제는 역사상 가장 많은 사람들이 참여하게 된 공개 프로젝트가 되었다. 누구나 사용가능하고 누구나 변형 가능하며 반드시 오픈소스(코드 공개)를 해야한다. 지금도 여러 기업에서 개발에 힘쓰고 있다! 리눅스 운영체제 계열에서 시작된 운영체제들로는 안드로이드, 크롬 등이 있다.

 

③ native app VS web app

  (1) 플랫폼 

º 플랫폼 : 프로그램이 실행되는 하드웨어 및 소프트웨어 기반 환경을 말하며, 즉 운영체제는 애플리케이션의 플랫폼이고 하드웨어는 운영체제의 플랫폼인 셈이다. 프로그램을 만들 때에는 각 플랫폼에 맞게 만들어야 한다. 마치 삼성과 애플기기를 사용할 때 윈도우용/맥용 프로그램이 따로 존재하듯이. 

º 플랫폼 의존성 : 프로그램을 만들 때, 실행할 때 플랫폼의 영향을 받게 되는 것을 의미한다. 이 문제는 위쪽 단계로 갈수록 복잡해지는데, 애플리케이션에서 가장 많은 고충을 겪는다. 앱은 하위에 소속된 운영체제와 하드웨어라는 플랫폼을 모두 고려해야 하니까..! 예를들어 인스타그램 앱 하나를 만들려고 해도, 맥 운영체제와 아이폰 1,2,3...세대 아이패드 1,2,3...세대 등등의 하드웨어들을 고려해야하고, 안드로이드 운영체제와 삼성,LG,화웨이에서 생산하는 모바일 기계들을 고려해야하게 된다. 그런 경우의 수들이 너무 많다보니 아예 몇 개의 플랫폼들은 포기하는 경우도 있다. 예를 들어 오래된 아이패드 모델에서는 최신 앱을 다운받아도 실행되지 않는 경우랄까. 이런 상황을 보고 플랫폼이 '파편화' 되었다고 말하기도 한다. 

º 개발자들은 참지않긔! 이 플랫폼 파편화 문제를 해결하기 위해 노력했다.

  | . 표준화 : 제품 제조사 상호 간에 '우리 이런 부분은 공통되게 이렇게 만들고 사용하자' 라고 규칙을 정해놓음

  || . 크로스 플랫폼 : 여러 운영체제와 하드웨어에서 동일하게 실행할 수 있는 환경을 말한다.

    - 가상머신 : 개발자들은 가상의 컴퓨터를 만들어 다양한 컴퓨터 위에 켜놓아, 마치 모두 동일한 컴퓨터를 실행하고 있는 것처럼 하게했다. 따라서 프로그램 개발자들은 가상의 동일한 컴퓨터 한 대에만 신경쓰며 프로그램을 만들면 된다. 마치 usb, HDMI 단자와 같이 하나의 규격(표준화)을 만든 것과 마찬가지로, 어댑터와 같은 기능을 가상의 컴퓨터가 하고 있다고 생각하면 된다. 현재 가장 잘 알려진 가상 컴퓨터는 JVM으로 java라는 프로그램 언어로 만든 가상 컴퓨터이다. 

    - 웹(web) : 가상머신처럼 다양한 기기와 프로그램을 연결해주는 소프트웨어 표준 규격을 정해 모든 환경에서 동일하게 사용할 수 있도록 만든 것이 web이다. html이나 javascript (js) 같은 언어로 웹페이지를 작성하고, 크롬이나 사파리 같은 웹 브라우저로 실행한다. 웹은 '반응형 웹 디자인'이 가능한 것처럼 더 간편하게 각 기기에 맞는 크로스 플랫폼을 만들 수 있다. JVM은 자바에 국한된 규격인데, 웹은 국제 표준화 기구에 등록된 규격으로, 웹 표준이 정해져있다보니 웹의 활용도가 높아졌고, 모든 것을 웹기술로 만들자는 움직임이 활발하다. 웹의 단점은 브라우저 호환성 문제가 있다는 것. 브라우저에 따라 코드가 다르게 동작하기 때문에 브라우저에 따라 문제가 발생할 수도 있다. 

 

java -> java프로그램 -> JVM -> 플랫폼

html/javascript -> 웹페이지 -> 브라우저 -> 플랫폼

 

  (2) 네이티브 앱 vs 웹 앱

º 웹 애플리케이션 : 과거이 웹은 단순히 글과 그림을 보여주는 용도에 그쳤지만, 점차 발전하면서 웹페이지를 통해 영화를 보거나, 옷을 주문하는 등 일반적인 앱에 준하는 동작을 할 수 있게 되었다. 웹을 활용해 애플리케이션처럼 동작하게 하는 것을 웹 애플리케이션이라 한다.

º 네이티브 애플리케이션 : 웹 앱과 구분하기 위해 , 기기의 운영체제에서 바로 실행할 수 있는 애플리케이션을 Native application 이라 한다. 동작은 웹 앱, 네이티브 앱 모두 같지만, 실행방식은 다르다. 네이티브 앱은 기기의 운영체제에서 바로 실행할 수 있기에 기기에 내장된 여러 기능을 활용할 수 있지만, 설치 및 배포라는 과정을 거쳐야 한다. (앱스토어에서 우리가 앱을 다운받아야 사용가능 하듯이). 웹은 설치나 배포과정 없이 주소만 가지고 있으면 접근이 가능하고, 업데이터에 있어서도 실시간으로 반영된다. 이 때문에 웹은 네이티브 앱보다 적은 투자와 노력으로 서비스 런칭이 가능하다.

º 웹을 앱처럼 구현하는 3가지 방법 : single-page applicatoin (페이지 이동 및 생성이 없는 웹사이트) , Hybrid web application (일반적인 native app의 일부를 웹사이트로 대체하는 것 : ex모바일 앱 내에서 광고 배너가 계속 바뀌는 것), Progressive Web Application (web app과 native app의 장점만 합치려는 시도에서 만들어진 앱)  

 

 

 

 공부하면서 느낀 점들

컴퓨터, 모바일, 웹 등에 대한 나름의 개발 흐름과 역사들을 살펴보는게 이렇게 재미있을 수 있나 싶었다. 사실 대부분의 우리들은 소비자의 위치에서 서비스나 제품을 사용하는 데에 그친다. 그러나 스마트폰, 노트북과 같이 사용이 매우 일반화된 제품, 서비스에 대해선 이따금씩 '도대체 사람이 이걸 어떻게 만들었을까..' 라는 생각이 들 때가 있다. 스마트폰이 일반화된 시대에 태어나서 '이것은 당연히 존재하는 것이다' 라고 느낄 수 밖에 없을지도 모르지만, 지금의 인공지능 같은 it 개발도 사실 근본적으론 필요에 의해 무에서 유를 창조하는 과정에 해당한다고 생각하기 때문에, 긴 생명의 역사를 생각하면, 인간이 참 대단하다고 느껴진다. "컴퓨터, 기계어" 라는 걸 만들게 된 결정적인 태초의 원인은 무엇일까 라는 생각?....ㅎ 심지어, 이제는 인간과 유사한, 인간을 대체할 기술들을 만들고자 노력하고 있는 세상에서, 우리는 궁극적으로 무엇을 얻고자하여 점차 고수준의 기술을 개발해오고 있는지 생각해 볼 필요가 있다는 생각이 든다. '필요성'에 집중해보자면 자본주의, 돈, 편리함 등 답은 의외로 간단할 수 있겠지만, 무언가를 알아가려고 하는 '호기심'과 그로인해 무언가를 끊임없이 만들고자 하는 '창작' 에 그 본질이 있는 것 같기도 하다. 우리는 유한한 존재니까, 우리의 흔적을 세상에 남기기 위한 노력일지도...(ㅇ_ㅇ 너무 진지했나..헷..) 아무튼 [컴파일러, 인터프리터, 운영체제, 플랫폼, 애플리케이션, 웹, 가상머신] 이 7가지는 남에게 설명해줄 수 있을 정도로 자세하게 배워서 뿌듯하다! 다음 코스는 이제 진짜 내가 하고싶던 데이터 사이언스 입문이다~! 화이팅~~!