04
06

03-3 프로그래밍 언어 분류

컴파일 언어, 인터프리터 언어

1)  컴파일 언어  : 실행되기 전 다른 형식으로 번역되는 언어

  •  컴파일  : 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 번역하는 과정
  •  컴파일러  : 소스 코드를 다른 언어나 형태로 번역해 주는 프로그램
    ex. C언어 -> 기계어, 자바 -> 자바 바이트코드, 타입스크립트 -> 자바스크립트 등
  •  정적 타입  : 자료형이 고정됨
  • 장점 : 오류를 미리 발견해서 문제 방지, 배포된 후에는 빠르게 실행됨
  • 단점 : 빌드 과정이 번거롭고 시간 오래 소요

2)  인터프리터 언어  : 작성된 코드 그대로 통역되어 실행되는 언어

  •  인터프리터  : 소스 코드를 바로 실행하는 컴퓨터 프로그램
  •  동적 타입  : 자료형이 고정되지 않음
  • 장점 : 프로그래밍, 배포, 오류 수정이 수월함
  • 단점 : 프로그램 실행 속도가 느림

 

절차지향, 객체지향 프로그래밍

1)  절차지향 프로그래밍  : 소스 코드를 위에서부터 차례대로 읽고 실행하는 방식

  • 장점 : 실행 속도가 빠름
  • 단점 : 작은 부분이 전체에 영향을 미치고, 순서에 따라 결과가 달라질 수 있음
    ex. C언어

2)  객체지향 프로그래밍  : 프로그램을 객체 단위로 나누어 프로그래밍하는 방식

  •  객체  : 프로그램에서 어떤 역할을 수행하는 요소를 데이터와 기능으로 묶은 단위
  • 장점 : 유지 보수가 쉽고, 생산성이 좋음
  • 단점 : 설계에 많은 시간 소요, 처리 속도가 느림, 언어 난이도가 높음 (ex. C++)

3)   클래스  : 객체의 설계도 즉, 객체의 스펙을 정의하는 명세서

  • 객체의 데이터와 기능을 미리 클래스로 정의했기 때문에
    중복되는 객체의 경우(ex. 버튼 A, B, C) 각 버튼의 역할을 가져와서 생성하면 됨

4)  상속  : 공유되는 스펙 물려주기

  • 상속은 부모 클래스의 기능자식 클래스가 물려받아 기존 클래스에 기능을 추가하거나 재정의하는 것을 의미함
  • 객체지향 프로그래밍에서는 Button이 가진 기본 속성을 '물려받고'
    그 위에 각 버튼만의 기능을 추가하는 방법으로 중복을 줄인 코드를 작성할 수 있음
  • 장점 : 코드 재사용을 통한 중복 최소화, 상위 하위 연결에 따른 유지 보수 시간 단축

 

함수형 프로그래밍

 함수형 프로그래밍 변수 사용을 최소화함으로써 스파게티 코드의 오류를 줄이는 프로그래밍을 뜻한다.

 스파게티 코드 는 정상적으로 작동하긴 하지만, 코드의 구조를 파악하기 어려운 코드를 뜻한다.

  • 함수형 프로그래밍의 예시로 배열 안의 요소들을 순서대로 출력하는 경우
    index = 0에서 숫자를 높이며 배열의 요소에 접근하는 방법보다 (변수 사용)
    forEach 메소드를 호출하여 그 안에 요소를 출력하는 함수를 넣는 방법을 말함 (변수 미사용)
  • 함수형 프로그래밍의 특징은 함수를 다른 함수(forEach, filter, map) 안에 인자로 넣을 수 있다는 점임

ex. 스칼라, 하스켈, 클로저, F# 등

 

매니지드 언어, 언매니지드 언어

1)  매니지드 언어  : 언어 자체에서 메모리를 관리해주는 언어

ex. 자바, 파이썬 등

2)  언매니지드 언어  : 개발자가 직접 메모리를 관리해야 하는 언어

ex. C, C++, 어셈블리어 등

  • C언어는 포인터를 통해 메모리 위의 데이터를 관리함
  •  포인터  : 변수의 메모리 공간의 주소를 가리키는 변수

 

자바와 자바 가상 머신과의 관계

 자바 운영체제에 종속적이지 않은 프로그래밍 언어이다.

자바 소스 코드(.java)를 자바 컴파일러로 번역하면 자바 바이트코드(.class)가 생성되는데,

이는 모든 운영체제의 컴퓨터가 이해할 수 있는 언어가 아니기 때문에 (기계어가 아님)

 JVM (= Java Virtual Machine, 자바 가상 머신) 이 각각의 운영체제에 맞게 바꿔주는 역할을 한다.

 

03-4 오류라는 위험에 대비하기

컴파일 오류, 런타임 오류

1)  컴파일 오류  : 소스 코드를 컴파일하는 과정에서 발생하는 오류

  • 프로그램을 사용자에게 배포하기 전에 발견할 수 있는 오류
  • 오류 발생 원인을 뚜렷하게 파악 가능 (ex. 세미콜론의 부재, Syntax 오류)
  •  신택스 오류  : 프로그래밍 언어의 사용법에 맞지 않는 코드로 인해 발생하는 오류

2)  런타임 오류  : 프로그램 실행 도중 발생하는 오류

  • 컴파일 과정이 없는 인터프리터 언어에서 발생하는 모든 오류
  • 컴파일 언어에서 컴파일 과정에 잡아내지 못한 오류
  • 런타임 오류는 설계상의 결함, 개발자의 의도와 다른 사용자의 행동,
    연계된 다른 프로그램의 장애, 시스템상의 문제 등의 요인으로 인해 발생함
  • 따라서 수많은 가능성에 대비한 체계적인 테스트, 통제불가능한 요소에 대한 대책을 마련해야 함

런타임 오류의 대표적인 종류는 다음과 같다.

더보기

1)  Null에 의한 오류 

  • null은 해당 변수가 메모리상의 어떤 데이터도 가리키고 있지 않음을 의미함
  • 0이나 공백(" ")은 자리는 갖고 있지만, null은 아예 자리 자체가 없는 상태
  • 따라서 null을 대입한 변수에 1을 더하는 등의 사칙연산을 실행하면 런타임 오류가 발생함
  • 자바에서는 이런 상황을 null pointer exception이라 부름

2)  0으로 나눠서 생기는 오류 

  • 0으로 나눈 값을 무한으로 인식하는 언어도 있지만(자바스크립트)
    자바 같은 언어에서는 런타임 오류가 발생함
  • 사용자의 입력 등 외부 요소에 따라 분모 변수가 0이 될 상황에 대해 대비해야 함

3)  의도하지 않은 무한 루프 

  • 알고리즘 설계 과정에서 무한루프가 발생할 수 있음
  • 프로그램 실행 중에 무한 루프에 걸리면 프로그램이 기약 없이 돌아가거나
    반복마다 추가로 메모리를 사용하는 경우 메모리가 가득 차서 프로그램이 강제로 종료됨

추가로, 오류와 버그에 대한 구분 기준은 다음과 같다.

더보기

1)  문제의 주체 

  • 버그 : 개발자에 의해 발생
  • 오류 : 프로그램 사용자에 의해 발생

2)  버그를 오류의 결과로 보는 관점 

  • 개발자가 작성한 코드에 결함이 있으면 '오류',
    그 결과로 프로그램이 의도와 다르게 작동하는 것을 '버그'라고 부름

 

논리 오류

 논리 오류 컴파일과 실행 모두 성공하지만 실행 결과가 올바르지 않은 오류를 뜻한다.

논리 오류는 알고리즘상의 논리적 결함, 코드상의 문제로 인해 발생한다.

 

예외 처리

 예외 처리 오류 발생 시에도 프로그램을 끄거나 리셋하지 않고 프로세스를 지속시키는 방법을 뜻한다.

예외 처리를 위한 대표적인 방법은 try-catch 구문을 사용하는 것이다.

try문 안에 오류 발생 가능성이 있는 코드를 작성하고, (오류 예상)

catch문 안에는 오류가 발생할 경우에 실행할 명령문을 입력한다. (오류 대처 방법 명시)

예외 처리 구문의 종류는 다음과 같다.

더보기

1)  try-catch  : C++, C#, 자바스크립트, 코틀린 등

2)  try-except  : 파이썬

3)  rescue  : 루비

 

메모리 누수, 가비지 컬렉션

1)  메모리 누수  : 사용하지 않는 데이터가 비워지지 않고 메인 메모리 공간에 쌓여있는 현상

  • C, C++ 같은 언매니지드 언어에서는 다 쓴 메모리를 개발자가 일일이 치워줘야 함

2)  가비지 컬렉션  : 메인 메모리상 불필요한 데이터를 자동으로 치우는 기능

  • 자바, 파이썬 같은 매니지드 언어에서는 메모리 관리를 자동으로 처리해 주는 기능이 있음
  •  가비지 컬렉터  : 메모리를 정리하는 프로그램
  • 한계 : 불특정 시점에 프로그램의 중단 가능성, 데이터 판단 과정에 시간 소요 및 정확도 떨어짐
    => C, C++에서처럼 개발자가 직접 메모리를 비우는 것보다 프로그램 성능이 떨어짐
    => 매니지드 언어를 사용하더라도 가비지 컬렉터의 작동 원리 등에 대한 공부가 필요함

 

03-5 개발에 필요한 여러 가지 도구

패키지 매니저

 패키지 매니저 라이브러리의 설치, 업데이트, 삭제 등을 관리하는 소프트웨어 도구이다.

엄밀히는  패키지 는 여러 모듈의 묶음이고,  라이브러리 는 여러 패키지의 묶음이다.

하지만 numpy package, numpy library 등으로 혼용해서 쓰기도 한다. (출처1 / 출처2)

(책에서는 라이브러리와 패키지가 코드 작성, 코드 배포의 목적에 따라 구분되는 개념이라고 언급함)

패키지 매니저는 운영체제, 프로그래밍 언어에서 사용하는 종류로 각각 나뉜다.

더보기

1)  운영체제 패키지 매니저 

  • 컴퓨터에서 사용할 프로그램들을 관리함
    ex. 리눅스 - apt-get, yum, pacman => 파이썬이나 NginX 서버 프로그램 다운로드
    ex.  - Homebrew => 여러 소프트웨어(구글 크롬, 카카오톡 등)를 한 줄로 설치하고 관리
    ex. 윈도우 - chocolatey => 여러 소프트웨어를 한 줄로 설치하고 관리 (출처)
# install 명령으로 비주얼 스튜디오 설치
brew install visual-studio

# search 기능으로 크롬 설치 여부 확인
brew search google-chrome

# list 명령으로 설치한 소프트웨어 목록 확인
brew list

2)  프로그래밍 언어 패키지 매니저 

  • 소프트웨어를 개발할 때 사용함
    ex. 파이썬 - pip / 자바 - Maven, Gradle / 자바스크립트 - NPM, Yarn / 루비 - RubyGems

패키지 매니저의 장점은 다음과 같다.

더보기

1. 라이브러리의 설치, 업데이트, 삭제를 간편하게 할 수 있다.

2. 설치한 라이브러리를 새로운 버전으로 저장해서 프로젝트를 다른 환경으로 이동해도
같은 라이브러리를 사용할 수 있도록 관리해 준다.

3. 프로그램을 디버그, 실행, 빌드하는 등 개발에 필요한 다양한 기능을 제공한다.

 

환경 변수

 환경 변수 프로그램이 컴퓨터에서 작동할 때 환경과 관련된 변수를 뜻한다.

윈도우, 리눅스 같은 운영체제의 환경변수는 시스템 실행 파일의 디렉터리를 지정하는 등의 역할을 한다.

즉, 운영체제의 깊숙한 곳에 있는 응용 프로그램을 쉽게 쓰기 위해

응용 프로그램의 경로를 미리 변수에 등록해 놓는 것이다.

환경 변수의 용도는 크게 세 가지로 나뉜다.

더보기

1)  필요한 프로그램의 실행 경로 

  • 프로그래밍 언어, 프로그램이 환경 변수에 적힌 값들을 보고 실행에 필요한 프로그램을 찾아 활용
    ex. 자바 프로그래밍시 JDK 환경 변수를 지정해줘야 컴퓨터가 자바가 설치되어 있는 위치 정보를 받아 컴파일 및 실행
  • 이처럼 컴퓨터에서 작동하는 프로그램을 필요로 하는 다른 프로그램이나 라이브러리 위치를 모두가 접근할 수 있는 곳에 적어 두는 용도로 사용하는 환경 변수를  path 환경 변수 라고 함

2)  개발 환경 용도 구분 

  • 백엔드 프로그램을 개발하는 경우 개발용 데이터베이스, 서비스용 데이터베이스를 구분하여
    코드를 작성해야하는데 이 경우 환경 변수를 사용해서 프로그램이 작동할 환경의 용도를 구분
import os

# 개발 환경일 경우
# True : 개발용 데이터베이스에 연동
if os.environ['DEV'] == True:
	print('개발 환경')

# 서비스 환경일 경우
# False : 서비스용 데이터베이스에 연동
else:
	print('실제 서비스 환경')

3)  민감한 요소의 보안 

  • 백엔드 프로그램을 데이터베이스와 연동할 시 아이디, 비밀번호 같은 개인정보가 필요함
  • 따라서 프로그램을 실행할 서버와 개발 및 테스트할 컴퓨터에 환경 변수(DB_ID, DB_PASSWORD)를 지정해서 아이디와 비밀번호를 지정해둠
  • 프로그램은 지정된 컴퓨터에서만 해당 환경 변수 값을 사용해서 데이터베이스에 접속할 수 있음
// 환경 변수에서 아이디와 비밀번호를 가져와 상수에 저장
const databaseAccess = {
	id: process.env.DB_ID,
    pw: process.env.DB_PASSWORD
}

 

런타임 환경

 런타임 환경 (= 런타임 시스템)은 프로그램이 작동할 수 있도록 해주는 프로그램을 뜻한다.

ex. JRE(Java runtime environment, 자바 런타임 환경) : 자바로 작성한 소스코드를 컴파일했을 때 생성된 자바 바이트코드를 실행할 수 있도록 해주는 소프트웨어로서 자바 바이트코드를 기계어로 통역해주는 프로그램인 JVM을 포함

=> 자바 프로그램을 실행하려면 환경 변수에 JRE의 경로를 입력해 주어야 함

ex. Node.js : 컴퓨터에서 직접 자바스크립트를 돌릴 수 있도록 해주는 런타임 환경

C, C++은 기계어로 바로 컴파일 되기 때문에 런타임 환경이 필요하지 않지만, 

공통적으로 많이 사용하는 기능을 수행하기 위해  런타임 라이브러리 라는 요소를 제공함 

 

SDK

 SDK (= Software Development Kit) 는 특정 언어나 환경의 소프트웨어를 개발할 수 있도록 제공되는 키트이다.

SDK에는 각각의 특성에 따라 라이브러리, 런타임 환경, 편집 도구, 코드 샘플, 설명서 등이 포함된다.

SDK는 여러 형식에 따라 종류가 나뉜다.

1)  프로그래밍 언어 SDK 

ex. 자바 프로그래밍시 JDK(Java Development Kit) 설치

JREJVM과 자바 실행에 사용되는 여러 라이브러리를 포함해서 자바 프로그램을 실행할 수 있는 환경을 갖춘 것이라면,

JDK는 이에 더해서 자바 코드를 컴파일, 테스트하는 등 자바로 프로그램을 개발할 수 있는 환경까지 갖춰주는 것이다.

ex. C# 프로그래밍시 .Net SDK를 통해 개발 환경 구축

2)  운영체제 SDK 

ex. 윈도우, iOS, 안드로이드에 해당하는 SDK

3)  서비스의 기능을 활용할 수 있는 SDK 

ex. 메타의 페이스북, 네이버 지도, 카카오 등

 

라이브러리, 프레임워크

1)  라이브러리  : 미리 작성된 코드를 가져다 쓰는 것

ex. React(JavaScript, TypeScript), TensorFlow(Python) 등

2)  프레임워크  : 미리 작성된 코드를 기반으로 삼는 것

  • 라이브러리보다 규모가 더 크고 기능이 많음
  • 빌드, 실행, 테스트하는 기능이 있음
  • 서버 프로그램을 만드는 데 필요한 라이브러리를 다운로드하고 관리하는 핵심 기능이 연동되어 있음
프로그래밍 언어 프레임워크
Java Spring
C# .Net, Blazor
Python django, Flask
Javascript Vue.js, React, Angular
Ruby Ruby on Rails
PHP Laravel, codeIgniter

 

03-6 타임머신을 타고 평행우주를 누비는 개발자

VCS

 VCS (= Version Control System, 버전 관리 시스템) 는 프로젝트의 변경 내역을 관리해주는 시스템을 뜻한다.

VCS의 장점은 다음과 같다.

① 개발자가 일정 작업을 마칠 때마다 파일의 추가, 수정, 삭제된 모든 내역을 편리하게 백업해준다.

② 프로젝트의 상태를 버전별로 상세히 조회하고, 되돌리는 것도 가능하다.

저장 공간도 매우 효율적으로 사용하기 때문에 프로젝트 버전이 많이 만들어져도 용량이 크게 늘어나지 않는다.

④ 프로젝트를 따로 백업하지 않고도 원하는 기능을 테스트하고 되돌릴 수 있다.

⑤ 프로젝트 파일과 작업 내역들을 팀원과 공유하고 효율적이고 안정적으로 협업이 가능하도록 해준다.

 

 깃 (= Git) 은 가장 널리 사용되는 VCS이다.

깃의 기능은 다음과 같다.

1)  시간 여행 : 리셋과 리버트 

  • 리셋 : 프로젝트를 이전 버전으로 완전히 돌리는 것
  • 리버트 : 특정 버전 중 하나만 되돌리는 것

2)  차원 넘나들기 : 브랜치 

  • 하나의 프로젝트 폴더 안에 여러 차원을 분기하여 코드를 여러 모드로 테스트할 수 있음
  • 테스트한 차원에서 작업한 내용을 메인 차원으로 가져오려면 merge를 통해 병합해주면 됨

 

깃 호스팅 서비스

 깃 호스팅 서비스 온라인으로 협업하기 위해 작업한 버전을 공유하고 저장하는 공간을 뜻한다.

  •  push  : 공용 공간에 각자 작업한 버전을 업로드하는 것
  •  pull  : 동료들이 작업한 버전을 통합된 최신 버전으로 다운로드하는 것
  • 회사나 개인이 자체적으로 호스팅 서버를 마련하기도 하고, 
    깃허브(GitHub)나 깃랩, 빅버킷 등의 깃 협업 서비스를 사용하기도 함
COMMENT