definition_vs

BABY CAT·2022년 10월 17일
0

definition

목록 보기
4/16

1. 프레임워크 vs 라이브러리

ㄱ. 프레임워크 (골격, 뼈대, 틀)

python style
framework
import없음
장고, 플라스크
프레임워크 :

원하는 기능 구현에 집중하여 개발할 수 있도록 일정한 형태와 필요한 기능을 갖추고 있는 골격, 뼈대를 의미합니다.

애플리케이션 개발 시 필수적인 코드, 알고리즘, DB 연동과 같은 기능들을 위해 어느 정도 뼈대(구조)를 제공하며 이러한 뼈대 위에서 사용자는 코드를 작성하여 애플리케이션을 개발합니다. 앱/서버 등의 구동, 메모리 관리, 이벤트 루프 등의 공통된 부분은 프레임워크가 관리하며, 사용자는 프레임워크가 정해준 방식대로 클래서, 메서드들을 구현하면 됩니다.

예시)

node.js의 웹프레임워크 express
Java 서버 개발에 사용되는 Spring
Python 서버 개발에 사용되는 Django, Flask
안드로이드 앱 개발에 사용되는 Android
아이폰 앱 개발에 사용되는 Cocoa Touch
웹 개발에 사용되는 Angular, Vue.js 등
자바 기반의 JSP를 위한 프레임 워크 Struts
루비로 작성된 MVC패턴을 이용하는 Ruby on Rails

ㄴ. 라이브러리 (도구)

python style
library
import lib
lib.class.method
텐서플로, 파이토치
라이브러리 :

소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임. 즉 특정 기능을 모와둔 코드, 함수들의 집합이며 코드 작성 시 활용 가능한 도구들을 의미합니다.

예시)

Python pip로 설치한 패키지/모듈 (tensorflow, pandas, beautifulsoup 등등)
C++의 표준 템플릿 라이브러리 (STL)
Node.js에서 npm으로 설치한 모듈
HTML의 클라이언트 사이드 조작을 단순화하는 JQuery
웹에서 사용자 인터페이스 개발에 사용되는 자바스크립트라이브러리 : React.js

ㄷ. 프레임워크 vs 라이브러리

프레임워크는 단지 미리 만들어준 반제품이나, 확장해서 사용할 수 있도록 준비된 추상 라이브러리의 집합이 아니다. 프레임워크가 어떤 것인지 이해하려면 라이브러리와 프레임워크가 어떻게 다른지 알아야 한다.

라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다.
단지 동작하는 중에 필요한 기능이 있을 때 능동적으로 라이브러리를 사용할 뿐이다.

반면에 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다.
프레임워크에는 분명한 [제어의 역전] 개념이 적용되어 있어야 한다.

애플리케이션 코드는 프레임워크가 짜 놓은 틀에서 수동적으로 동작해야 한다.

- 토비의 스프링中

프레임워크와 라이브러리의 차이점은 "제어 흐름"의 권한이 어디에 있는가입니다.

라이브러리를 사용할 때 사용자는 애플리케이션 코드의 흐름을 직접 제어해야 합니다.
개발 시 필요한 기능이 있을 경우 능동적으로 라이브러리를 호출하여 사용하거나 기존에 구성된 함수나 코드를 가져다 써야 합니다.

반면 프레임워크는 애플리케이션의 코드가 프레임워크에 의해 사용됩니다.
애플리케이션 코드는 프레임워크가 짜 놓은 틀에서 수동적으로 동작하기 때문에 제어의 흐름은 프레임워크가 가지고 있고 사용자가 그 안에 필요한 코드를 작성하게 됩니다.

여기서 제어의 역전(IoC, Inversion of Control)이란,
어떠한 일을 하도록 만들어진 Framework에 Control 권한을 위임하는 것을 의미하는데,
간단히 말해 프로그램의 제어 흐름 구조가 뒤바뀐 것을 뜻합니다.

라이브러리의 경우 애플리케이션의 흐름을 사용자가 직접 제어해야 하지만 프레임워크의 경우 코드를 연결할 수 있는 위치를 제공하고 필요에 따라 사용자가 연결한 코드를 호출하는 제어 흐름 권한을 가지고 있습니다.

ㄹ. interview

"프레임워크와 라이브러리의 차이를 아시나요?""
"음... 프레임워크는 뼈대이고 라이브러리는 모듈 같은 것이고...."
"그럼 최근에 사용하신 프레임워크와 라이브러리를 알려주세요."
"... express랑.. 그리고 음.. 모듈은...."

A. 정리

프레임워크는 일종의 뼈대, 틀 같은 것.
프레임워크가 짜놓은 뼈대 안에서 애플리케이션 코드가 수동적으로 동작.

라이브러리는 도구 같은 것.
애플리케이션 흐름을 사용자가 직접 제어한다.

2. 컴파일언어 vs 인터프리터언어

ㄱ. 컴파일언어 (번역)

compile
컴파일 언어는 원시코드(프로그래머가 작성한 소스코드)를 모두 기계어로 변환한 후에 기계(JVM 같은 가상 머신)에 넣고 기계어 코드를 실행합니다. 소스코드를 기계어로 번역하는 빌드 과정에서는 인터프리터 언어에 비해 시간이 소요됩니다. 하지만 런타임 상황에서는 이미 기계어로 모든 소스코드가 변환되어 있기 때문에 빠르게 실행할 수 있습니다. 대표적인 언어로 C, C++이 있습니다.

컴파일 언어
코드를 실행하기 전 기계어로 변환한 후 실행한다
실행 파일을 생성한다
컴파일 단계와 실행 단계가 나눠져있다
실행에 앞서 컴파일을 한 번 진행한다
컴파일과 실행 단계가 나눠져 있어, 코드 실행 속도가 빠르다

ㄴ. 인터프리터언어 (통역)

interpreter
인터프리터 언어는 원시코드(프로그래머가 작성한 소스코드)를 기계어로 변환하는 과정없이 한줄 한줄 해석하여 바로 명령어를 실행하는 언어를 말합니다. R, Python, Ruby와 같은 언어들이 대표적인 인터프리터 언어입니다.

인터프리터가 직접 한 줄씩 읽고 따로 기계어로 변환하지 않기 때문에 빌드 시간이 없습니다. Runtime 상황에서는 한 줄씩 실시간으로 읽어서 실행하기 때문에 컴파일 언어에 비해 속도가 느립니다.

실행속도는 느리지만 코드 변경시 빌드 과정없이 바로 실행이 가능하다는 장점이 있습니다. 루비를 사용해보면 소스코드를 고치고 서버를 다시 시작하지 않아도 변경사항이 반영된 상태로 테스트를 진행할 수 있습니다.

인터프리터 언어
코드가 실행 될 때 한줄씩 처리해나간다
실행 파일을 생성하지 않는다
실행 단계가 분리되어 있지 않다
그에 따라 반복 수행되므로 코드 실행 속도가 '비교적' 느리다

ㄷ. 빌드과정이란

빌드는 소스파일(소스코드 파일)을 실행파일로 생성하는 과정입니다.

즉 고급언어 ----> (변환) ---> 저급언어(기계어) 과정을 거쳐서 실행파일로 생성합니다.

인터프리터 언어는 빌드과정이 없이 바로 고급언어에서 한줄 씩 읽어서 실행합니다. 반면에 컴파일러 언어와 같은 C, Java는 .class 파일 등과 같이 변환하여 실행을 합니다.

3. 정적언어 vs 동적언어

ㄱ. 타입

타입이란, 한글로 자료형입니다. int형, short형, float형, bool형, 객체 등이 있습니다.

int a = 10;
bool isKilled = false;
Character human = new Character( );

와 같이 변수를 선언할 때 앞에 붙여 사용합니다.
정적언어, 정적타입 모두 같은 의미로 쓰이고 있습니다.

ㄴ. 정적언어

정적언어라는 것은 위에서 언급한 '타입' 즉 자료형을 컴파일 시에 결정하는 것 입니다.
우리가 잘 아는('이름을 잘 아는') C, C#, C++, Java 등의 언어가 있습니다.
이들 언어는 변수에 들어갈 값의 형태에 따라 자료형을 지정해주어야 합니다.
컴파일 시에 자료형에 맞지 않은 값이 들어있으면 컴파일 에러가 발생합니다.

[C Language]
int num = 1; // 컴파일 성공
float num2 = 1.03; // 컴파일 성공
bool num3 = 1; // 컴파일 에러

장점 : 컴파일 시에 타입에 대한 정보를 결정하기 때문에 속도↑ , 타입 에러로 인한 문제점을 초기에 발견할 수 있어 타입의 안정성↑

ㄷ. 동적언어

요즘 많이들 쓰시는 JavaScript, Ruby, Python, SmallTalk 등이 바로 동적언어입니다. 동적 타입 언어의 자료형은 컴파일 시 자료형을 정하는 것이 아니고 실행 시에 결정합니다. 다음과 같이 타입 없이 변수만 선언하여 값을 지정할 수 있습니다.

[Python]
num1 = 10;
name = "Evan Hwang"

장점 : Run time까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 많은 선택의 여지가 있습니다.
단점 : 인터프리터 언어는 배우기는 쉬우나 실행 도중에 변수에 예상치 못한 타입이 들어와 Type Error 를 뿜는 경우가 생길 수 있습니다. 잘 생각해서 사용해야합니다.

0개의 댓글