본문 바로가기
[Naver Cloud Camp 7] 교육 정리

네이버 클라우드 캠프 20일차 230522

by 우기37 2023. 5. 22.

#1 교육정리

이번주부터는 인공지능의 2주 수업이 끝나고,

java 수업에 앞서 프로그래밍 개론부터 교육을 받았습니다.

 

1) 소프트웨어

2) System SoftWare vs Application SoftWare

3) Web Application

4) Web app + mobile

5) Application 실행

6) 컴파일 방식

 

 

 

#2 SoftWare

컴퓨터 소프트웨어는 고객이 시스템에서 작업할 수 있도록 하는 일종의 프로그램입니다. 시스템의 작동 및 책임을 알려줍니다. 기본적으로 사용자에게 수행 방법과 작업을 알려주는 일련의 지침 또는 명령 입니다.

 

출처 : https://www.geeksforgeeks.org/difference-between-system-software-and-application-software/

 

시스템 소프트웨어란)

컴퓨터 하드웨어 위에 위치하여 다양한 응용 프로그램 소프트웨어를 실행 할 수 있도록 설계된 컴퓨터 프로그램입니다. 따라서 시스템 소프트웨어는 응용 프로그램 소프트웨어를 설치하고 운영 할 수 있는 환경을 제공하고 유지합니다. 컴퓨터 하드웨어와 응용 프로그램 소프트웨어 사이의 중간 계층이며, 하드웨어와 시스템 구성 요소 사이를 조정하므로 저수준 소프트웨어라고도 합니다. 일반적으로 컴퓨터의 운영 체제(OS)를 말합니다.

ex) Windows, Linux, UNIX, OS X)

 

시스템 소프트웨어 종류)

  • 운영 체제: 운영 체제는 컴퓨터 시스템의 주요 부분입니다. CPU, 프린터, 하드 디스크 등과 같은 모든 리소스를 관리하는 책임이 있습니다. 또한 다른 많은 컴퓨터 소프트웨어에 서비스를 제공합니다. 운영 체제의 예로는 Linux, Apple, macOS, Microsoft Windows 등이 있습니다.
  • 언어 처리기: 시스템 소프트웨어는 사람이 읽을 수 있는 언어를 기계어로 변환하며 이는 언어 처리기 에 의해 수행됩니다 . 프로그램을 기계가 쉽게 읽을 수 있는 명령으로 변환합니다. 
  • 장치 드라이버: 장치 드라이버는 장치를 제어하여 기능을 수행하는 데 도움이 되는 프로그램 또는 소프트웨어입니다. 먼저 프로그램을 실행하기 위한 드라이버를 설치해야 합니다.

 

 

응용 소프트웨어란)

사용자 요청에 따라 실행되는 소프트웨어 유형입니다. 시스템 소프트웨어에서 제공하는 플랫폼에서 실행됩니다. 고급 언어는 애플리케이션 소프트웨어를 작성하는데 사용됩니다. 시스템 소프트웨어보다 더 많은 저장 공간이 필요하며, 각 애플리케이션 소프트웨어는 단일 작업만 수행합니다. 그리고 시스템 소프트웨어에 비해 구축하기 쉽습니다.

 

응용 소프트웨어종류)

  • 범용 소프트웨어: 이 애플리케이션 소프트웨어는 특정 작업에만 국한되지 않고 다양한 작업에 사용되는 작업을 수행하는 데 사용됩니다. 예를 들어 MS Word, MS Excel 등
  • 맞춤형 소프트웨어: 특정 조직을 위해 설계된 작업을 수행하는 데 사용됩니다. 예를 들어 철도 예약 시스템, 항공 예약 시스템 등
  • 유틸리티 소프트웨어: 컴퓨터의 아키텍처를 지원하는 데 사용됩니다. 시스템을 최적화 및 유지 관리하고 요구 사항을 처리하도록 설계되었습니다.

출처 : https://www.spaceo.ca/blog/difference-between-application-software-and-system-software/

 

SystemSoftware 와 Application Software의 차이점)

 

시스템 소프트웨어 응용 소프트웨어
시스템 리소스를 유지하고 응용 프로그램 소프트웨어가 실행될 경로를 제공합니다. 특정 작업을 위해 제작되었습니다.
저수준 언어 고급 언어
범용 소프트웨어 특정 목적의 소프트웨어
시스템 소프트웨어가 없으면 시스템이 중지되고 실행할 수 없습니다. 애플리케이션 소프트웨어 없이도 시스템은 항상 실행됩니다.
시스템이 켜지면 실행되고 시스템이 꺼지면 중지됩니다.
사용자의 요청에 따라 실행
예: 운영 체제, Device Driver(printer, scanner), Embedded 등입니다. 예: Photoshop, VLC 플레이어, Game, Web browser 등입니다.
애플리케이션 소프트웨어보다 더 복잡합니다. 시스템 소프트웨어에 비해 간단합니다.
개별 하드웨어 구성 요소 및 애플리케이션 소프트웨어를 제어, 통합 및 관리하도록 설계되었습니다. 사용자 시스템에 설치되고 특정 작업을 수행하도록 설계된 일련의 컴퓨터 프로그램
컴퓨터가 종료될 때까지 백그라운드에서 시스템을 작동합니다. 사용자의 요청에 따라 프런트 엔드에서 실행됩니다.
사용자와 상호 작용하지 않습니다. 하드웨어와 최종 사용자 간의 인터페이스 역할 사용자와 컴퓨터 사이의 중개자를 연결
독립적으로 실행 작동을 위해 설정된 플랫폼이 필요하기 때문에 시스템 소프트웨어에 의존

 

 

 

#3 Web Application

 

웹 애플리케이션이란)

웹 애플리케이션은 사용자의 웹 브라우저에서 실행되는 소프트웨어입니다.

비즈니스는 원격으로 정보를 교환하고 서비스를 제공해야 합니다. 그리고 웹 애플리케이션을 사용해 편리하고 안전하게 고객과 연결합니다.

장바구니, 제품 검색과 필터링, 인스턴트 메시징, 소셜 미디어 뉴스피드 등 일반적으로 사용되는 웹사이트 기능이 웹 애플리케이션을 기반으로 설계됩니다.

따라서 사용자가 소프트웨어를 설치하거나 구성하지 않고도 복잡한 기능을 이용할 수 있습니다.

쉽게 말해서 다운로드 받지 않고, 인터넷이나 인트라넷을 통해 웹 브라우저 위에서 이용할 수 있는 응용 소프트웨어 입니다.

 

웹 애플리케이션 장점)

  1. 수 많은 PC에 소프트웨어를 배포하여 설치하지 않아도 웹 애플리케이션을 유지 관리할 수 있습니다.
  2. 웹 메일, 온라인 전자상거래 및 경매, 인터넷 게시판, 블로그, 게임 등 다양한 기능을 구현할 수 있습니다.
  3. 웹 표준언어(ex. HTML5)로 제작하여 호환성, 비용면에서 좋습니다.

 

웹 애프리케이션 구성요소)

1) 웹 브라우저 (WEB Browser)

: 사용자가 요청한 웹 서버의 결과를 보여주기 위한 애플리케이션입니다.

IP주소를 웹 서버에 접속 요청보냅니다. ->  화면출력

  • 크롬, 파이어폭스, IE 등

 

2) 웹 서버 (WEB Server) = Remote

: 웹 브라우저의 요청에 대한 결과를 응답해주는 기능을 하며, 정적인 페이지(.html, .jpeg, .css 등) 처리해주는 역할을 합니다. -> 화면생성

  • Apache(아파치), Nginx, IIS 등

 

3) 웹 애플리케이션 서버 (WAS)

: 웹 서버만으로 할 수 없는 데이터베이스 조회, 다양한 로직처리와 같은 동적인 페이지를 처리합니다.

  • Tomcat(톰캣), Jeus ,웹로직, Web Sphere(웹 스파이어) 등

 

4) 데이터베이스 (DB)

: 데이터를 저장하는 저장소

 

 

 

#4 PC Web/Mobile Web/Native App/Hybrid App/Web App

 

PC Web)

PC의 브라우저를 통해서 접근 가능한 일반 웹 사이트

web server에 web browser를 실행하도록 요청하고 Remote인 web server는 이에 요청된 data를 통해 응답하여 화면에 출력 해줍니다.  사용하는 언어로는 HTML, CSS, JSON 등이 있습니다.

 

Mobile Web)

  • 모바일 디바이스에서 기존 PC Web을 보기 편하도록 재구성한 웹 사이트
  • 모바일의 브라우저를 통해서 접근 가능
  • 최근에는 PC Web과 Mobile Web 등 가변적인 스크린 사이즈에 동시 대응할 수 있는 반응형 웹 기술이 인기를 얻고 있습니다.

반응형 웹 예제 : http://mediaqueri.es

 

출처 : https://h9xstudy.wordpress.com/2012/08/16/pcweb_mobileweb_nativeapp_hybridapp_webapp/

 

 

Native App)

  • 모바일 디바이스가 지원하는 Native Language로 구성한 애플리케이션 (예시- iOS: objective C,swift / Android: Java, kotlin)
  • 장점 : 퍼포먼스, 오프라인 모드, 하드웨어 접근성, 유료화
  • 단점 : 여러 디바이스를 지원하는 서비스를 만들 경우, 디바이스의 플랫폼, 화면 사이즈, 해상도 별로 모두 대응해야 함
  • 예시 : 아스팔트 7 (Game App)

 

Web App)

  • 모바일 브라우저가 지원하는 Web Language(HTML, CSS 등)로 구성한 애플리케이션
  • 장점 : 플랫폼을 가리지 않고 브라우저를 지원하는 모든 디바이스에서 볼 수 있음
  • 단점 : 퍼포먼스, 하드웨어 접근성 (기존의 단점이었던 오프라인 모드 미지원, 하드웨어 접근 미지원, 유료화 등은 Device API 개발과 유료 회원 정책 등으로 완화됨)
  • http://www.apple.com/webapps
  • 예시 : 아사나 (Task App)

 

Hybrid App)

  • Native 로 만든 틀에 Web 언어로 만든 콘텐츠로 구성한 애플리케이션
  • 장점 : Native App과 Web App의 장점을 위주로 구성됨
  • 단점 : 적절함
  • 예시 : 페이스북 (SNS App)

 

 

 

#5 Application 실행 과정

 

 

 

 

#6 compile 방식

 

출처 : https://st-lab.tistory.com/176

 

Build란)

컴퓨터는 근본적으로는 0과 1밖에 모릅니다.

우리가 작성하는 코드들은 거의 대부분 고급언어를 사용하기 때문에 결국에는 컴퓨터(CPU)가 이해할 수 있도록 번역을 해주어야겠죠. (C, Java, C++ 등 어셈블리를 제외한 대부분 언어가 고급언어입니다.)

컴퓨터가 이해하는 언어를 기계어라고 하는데, 우리가 만든 소스 코드가 컴퓨터 입장에서는 해외판 책이 되는 것이고, 이 책을 기계어(machine code)로 번역하여 컴퓨터에서 이해할 수 있는, 즉 실행 가능한 파일로 만드는 과정을 빌드(Build) 라고 합니다.

 

우리가 만든 소스코드를 '빌드'라는 과정을 통해 실행 파일을 얻게 되는 것이죠. 그 실행파일은 exe, exec 등등 여러 종류가 있습니다. 이러한 실행파일은 기계어(Machine Code) 라고 언어(CPU가 읽을 수 있는 이진코드)로 이루어져 있습니다.

 

Compile Type)

우리가 작성한 소스코드를 한꺼번에 번역해서 실행파일로 만들어 줍니다. 한마디로 통번역입니다.

이렇게 한 번에 번역하는 언어들을 보통 Compile Language 라고 하는데, 대표적으로 C, C++, Go 언어가 있습니다.

 

위 그림을 보면 빌드 과정에 총 4가지 단계가 있습니다.

대부분 컴파일 언어가 위와 같은 과정을 거칩니다. (물론 언어별로 약간의 과정이 추가 또는 생략될 수 있습니다.)

그리고 화살표를 보면 두 개로 나뉘다가 링크 작업에서 하나로 합쳐지는데, 이 또한 의미가 있습니다.

 

- preprocessing (전처리)

'소스코드의 중심(main)이 실행되기 전에 사전준비 하는 과정'

 

책 번역과정으로 예를들자면 저자 이름, 책에서 정의하는 표현, 판권, 인용 등 이미 정해져 있는 것들을 먼저 처리하여 이후에 일일이 다시 찾아 쓸 필요 없이 정리해두는 과정이랑 비슷하죠.

 

프로그래밍 언어로 보자면 C언어나 C++ 에서 # 으로 시작하는 구문들(#include, #define 등)이 있을 겁니다.

 

- compilation (컴파일)

어떤 언어로 번역하느냐. 컴파일 하는 프로그램을 컴파일러(compiler)라고 합니다.

한마디로 번역가죠. C나 C++를 다뤄보셨다면 gcc, g++, Visual C++ 같은 단어를 들어보거나 보셨을 겁니다. 이런 것들이 바로 컴파일러입니다.

 

컴파일러가 컴파일 하면 바로 기계어(Machine Code)로 번역 될 것 같지만 아닙니다. 흔히 중간언어 또는 저수준 언어라고 하는 놈으로 번역됩니다. 보통은 어셈블리어(Assembly Language)로 번역됩니다.

 

기계어로 바로 번역하지 않고 저수준 언어로 번역되는 이유는 프로그래밍의 역사를 보면 쉽게 알 수 있는데, 과거에는 0과 1로만 작업을 했어야 하다보니 불편했습니다. 예로들어 'A'라는 문자를 표현하려면 1000001 이런식으로 했었어야 하니깐요. 이렇다 보니 이런 것들을 부호화(Symbolic) 한 것입니다.

단순히 부호화만 했기 때문에 기계어(Machine Code)와 1대1 매칭이 됩니다. 그렇다 하더라도 우리가 사용하는 Java, C 같은 고급언어처럼 사람이 읽기 쉬운 언어가 아닌 난해한 언어인지라 저수준 언어(low-level language)에 속하게 되는 겁니다.

 

한마디로 인간이 기계어를 이해하기 위해 고급언어와 기계어 사이에 중간단계인 저수준 언어로 번역하는 것입니다.

대표적인 C, C++ 모두 어셈블리어라는 저수준 언어로 번역되니 이 걸로 가정하고 가죠.

 

- assemble (어셈블)

저수준 언어, 어셈블리어를 기계어로 번역해주는 프로그램을 어셈블러(Assembler)라고 합니다.

 

이렇게 CPU가 이해할 수 있는 언어로 번역된 파일을 보통 Object File 이라고도 하는데, 직역하면 '객체 파일'이라고 하지만, 대부분은 객체라 하지 않고 '목적 파일'이라고 합니다.

 

"동작의 주체가 누군지 분류하여 동일성을 갖는 기능들을 하나의 묶음으로 만들어낸 하나의 실체"

 

어셈블리어에서 기계어로 번역된 Object File은 앞서 설명했듯 여러개의 연관된 파일을 빌드하면 '링크' 단계 전까지는 각 파일별로 번역되기 때문에 그 번역된 파일 하나하나가 실행하는 최종 파일의 일부분으로서의 객체가 된다고 보면 됩니다. 그래서 Object 라는 단어가 붙게 되는 겁니다.

 

좁은 의미로는 '소스코드를 저수준 언어로 변환해주는 과정'을 의미합니다. 그런데 조금만 생각해보면 어셈블도 번역하는 단계입니다.. 즉, 컴파일이라고 볼 수도 있습니다. 그래서 좀 더 넓은 의미로는 전처리 과정부터 어셈블 과정까지를 컴파일 단계라고 부르기도 합니다. 

 

- linkig (링크/링킹)

컴파일(어셈블 포함) 과정을 통해 각 파일들이 기계어로 번역되었다면 이제 하나로 연결해주어야 합니다.

 

Object File 들과 필요한 라이브러리들을 연결 시켜주고 최종적으로 하나의 'executable file (실행가능한 파일)'로 만들어줍니다. 우리가 흔히 어떤 프로그램을 사용할 때 .exe 라는 확장자를 갖는 파일을 실행시킵니다. 이 exe가 바로 executablue 의 줄임말입니다.

 

컴파일 언어의 장점 컴파일 언어의 단점
빌드가 완료된 실행가능한 파일은 실행 속도가 빠릅니다. 프로그램을 수정해야 할 경우 처음부터 빌드과정을 다시 거쳐야하기 때문에 특히나 대규모 프로그램에서는 생산성이 떨어집니다.
매번 번역할 필요 없이 실행 파일만 실행하면 되기 때문에 전체적인 시간면에서 효율적입니다. 플랫폼에 매우 의존적입니다.
ex) 윈도우 실행파일을 맥OS 에서 실행하지 못하는 상황을 생각하면 됩니다.

 

Interpreted Type)

 

 

소스코드를 통번역 하는 것이 아닌 한 명령 단위로 해석하면서 즉시실행하는 방법입니다. 좀 더 쉽게 생각하면 통역사를 생각하면 됩니다.

 

위 그림에서 컴파일 언어와 인터프리트 언어의 가장 큰 차이점은 바로 목적파일(Object File)을 생성하지 않고 바로(direct) 실행된다는 것이 가장 큽니다.

 

소스코드의 한 명령 세트마다 기계어(Machine Code)로 번역하면서 바로바로 실행해주는 방식을 인터프리트라고 합니다.

그리고 이렇게 번역해주는 프로그램(또는 환경)을 Interpreter(인터프리터)라고 합니다. 즉, 각 운영체제에 맞는 해당 언어의 인터프리터만 설치한다면 어느 운영체제에서든 해당 언어를 사용하더라도 동일한 결과를 얻을 수 있다는 것입니다. 한마디로 플랫폼에 독립적이라는 것입니다. 또한 이렇게 컴파일 과정 없이 인터프리터를 통해 바로 결과를 볼 수 있기 때문에 프로그램 수정에 매우 유리하다는 장점이 있습니다.

 

소스코드 그 자체가 실행가능한 파일이 되어 번역해줍니다. 다만, 소스코드를 번역해줄 수 있는 인터프리터를 설치해야합니다.

 

인터프리트 언어의 장점 인터프리트 언어의 단
컴파일과정 없이 바로 실행하기 때문에 수정, 디버깅에 유리합니다. 즉 개발속도에 유리합니다. 빌드 되어있는 컴파일 언어 프로그램보다 실행시간이 느립니다. -> 매번 부분씩 번역을 해야하기 때문
각 플랫폼에 지원하는 인터프리터만 있다면 실행 가능하기 때문에 플랫폼에 독립적입니다. 코드를 열면 다 보이기 때문에 보안에 좋지는 않다.

 

Hybrid Type)

컴파일 방식과 인터프리트 방식을 혼합한 방법입니다.

 

컴파일언어의 단점은 실행 가능한 파일이 플랫폼에 의존적이라는 것이지만 실행 속도가 빠릅니다. 반대로 인터프리터 언어의 단점은 실행속도는 느리지만, 플랫폼에 독립적이라 어느 플랫폼이든 번역기(인터프리터)만 있으면 실행 가능했습니다.

 

이 둘의 단점을 상호 보완하여 만들어 진 것이 바로 하이브리드 방식입니다.

흔히 '바이트 코드 언어(Byte Code Language)' 라고 하며, 가장 대표적인 언어로는 Java(자바)가 있습니다.

 

고급 언어로 작성된 소스코드를 바이트 코드(bytecode)로 변환합니다. 바이트 코드란 일종의 중간 언어라고 생각하면 됩니다. 그리고 VM(Virtual Machine : 가상머신) 이라는 프로그램에 의해 바이트코드를 기계어로 바꿔줍니다.

이 때 중요한 것은 바로 VM인데요. VM은 하나의 프로그램이라고 생각하시면 됩니다.

 

 

여기서는 실행가능한 파일이 바로 바이트 코드가 됩니다.

 

바이트코드는 기계어는 아니지만 어셈블리어처럼 '기계에 조금 더 가까운 언어'로 되어있습니다.

다만, 컴파일언어의 목적파일과 차이가 있다면 컴파일 언어에서는 하드웨어에 의해 처리되는 기계어로 되어있었다면 바이트 코드 파일의 경우 하드웨어가 직접 처리하는 것이 아닌 소프트웨어(가상 머신)에 의해 처리된다는 것입니다.

역으로 생각하자면 바이트코드는 해당 가상머신 전용 기계어라고 보면 됩니다.

 

마지막으로 VM입니다. VM 은 가상머신(Virtual Machine)의 줄임말인데, 쉽게 생각해서 가상 컴퓨터라고 보시면 됩니다.

바이트 코드는 이 가상머신이 이해할 수 있는 코드로 되어있다고 보면 됩니다. 그리고 그 가상머신 안에는 인터프리터 같은 해석기가 있어 이들이 바이트코드를 해석하여 각 OS에 맞게 명령어를 해석하고 작동하는 하나의 프로그램이라고 보면 됩니다.

 

가장 대표적인 VM은 Java Virtual Machine 인 JVM 이 있습니다. 또한 C#의 경우는 .NET의 CLR 이 있습니다.

VM을 통해 '플랫폼에 독립적'인 장점을 갖고왔고, 초기 컴파일 단계를 통해 바이트코드로 기계어에 더 가까운 언어로 번역을 한 번 해놓았기 때문에 속도도 기존 인터프리터 언어에 비해 더 빠르다는 장점 또한 갖고오게 되었습니다.

 

하이브리드 언어의 장점 하이브리드 언어의 단
각 플랫폼에 지원하는 가상머신 있다면 실행 가능하기 때문에 플랫폼에 독립적입니다.  컴파일 언어처럼 하드웨어를 직접 제어하는 작업은 불가능하다.

 

글 참고 : https://st-lab.tistory.com/176