개발자가 되기 전에 알아야할 것들/주요 용어 개념정리
프로그래밍 언어와 분류방식(동적vs정적, 비관리vs관리, 명령형vs선언형)
코딩디퓨저
2023. 1. 29. 02:17
반응형
SMALL
프로그래밍이란 대체 뭘까>
2023.01.28 - [개발자가 되기 전에 알아야할 것들/주요 용어 개념정리] - 코딩이란 대체 뭘까? 저번시간에 '코딩'이라는 단어에 대해 확실하게 이해를 하셨을 겁니다. 우리가 코딩을 써낸 '소스코드'
codingstartup.tistory.com
[1일차 3교시]
안녕하세요. 저번시간에 프로그래밍이 무엇이고 어떤 과정을 통해 프로그램이 만들지는지 정확하게 이해하셨을 겁니다. 오늘은 프로그래밍 언어에 대해 알아보도록 하겠습니다. 아직 기본 용어에 대한 개념을 잘 모르시는 분들도 계실테니 설명이 끝난 뒤에 탱꾸리와 맹꾸리의 대화 속에서 용어에 대한 개념과 프로그래밍의 언어분류에 대해 자세히 배워봅시다.
프로그래밍의 언어는 분류방식에 따라 여러가지로 나뉩니다.
1. 메모리를 관리하는 방식 (비관리 vs 관리)
2. 컴파일과 실행시간에 타입이 결정되는 방식 (동적 타입 vs 정적 타입)
3. 명령형 프로그래밍과 선언형 프로그래밍에 따른 방식(명령형 vs 선언형)
1. 메모리를 관리하는 방식
- 비관리 언어
동적 할당된 메모리의 해제가 자동으로 이루어지지 않고, 메모리에 직접적으로 접근이 가능한 언어
- 관리 언어
동적 할당된 메모리의 해제가 가비지 컬렉터에 의해 자동으로 이루어지며, 메모리 접근에 대한 부분을 추상화시켜 직접적인 기계제어를 기본적으로 차단시켜 메모리에 직접적으로 접근 불가능한 언어
| 메모리 관리 방식 | 자동 메모리 해제 | 메모리 접근 가능 | 성능 | 사용 언어 |
| 비관리 언어 | X | O | 높음 | C , C++ |
| 관리 언어 | O | X | 낮음 | Java, C#, Python, Go |
이번 수업에는 프로그래밍의 언어에 대해 자세히 배워볼거에요. 프로그래밍의 언어는 분류 방식에 따라 메모리를 관리하는 방식, 컴파일과 실행시간에 타입이 결정되는 방식, 명령형 언어와 선언형 언어에 따른 방식이 있어요.
탱꾸리 : 그런데 메모리가 뭔가요? 이제 프로그래밍이 뭔지 알았는데 더 알아야할게 있군요...
메모리란 주기억장치로써 사용자가 자유롭게 내용을 쓰고 지울 수 있는 일종의 책상 같은 거에요.
책상이 크면 클수록 많은 일을 할 수 있으니 성능면에서도 좋겠죠?
맹꾸리 : 그러니까 메모리라는 책상에 코딩한 것들을 정리해놓고 필요 없으면 지우고 쓰고를 반복해서 할 수 있다는 거네요?
맞아요. 그래서 프로그래밍 언어를 분류할 때도 바로 이 메모리를 관리하는 방식으로 분류하기도 해요.
메모리 관리 방식에는 두가지가 있는데요 비관리 언어와 관리 언어가 있어요.
비관리 언어는 동적으로 할당된 메모리의 해제가 자동으로 이루어지지 않고, 메모리에 직접적으로 접근이 가능한 언어이고, 관리 언어는 동적 할당된 메모리의 해제가 가비지 컬렉터에 의해 자동으로 이루어지며, 메모리에 직접적으로 접근 불가능한 언어를 뜻해요.
탱꾸리 : 가비지... 뭐시기요? 컬렉터? 쓰레기 수집가요? 컴퓨터도 골동품을 좋아하나보네요.
맹꾸리 : 음... 쓰레기를 수집한다라... 뭔가 필요없어 보이는걸 수집한다는 것 같은데? 쓰레기는 아마도 필요없는 코드들을 말하는 것 같은데 그러면 쉽게 말해서 메모리에 있는 쓸모없는 코드들을 수집한다는 건가?
탱꾸리 : 아!! 책상에 적혀있는 맹꾸리♥덕꾸리 같은 필요없는 글자들을 지워서 그 자리를 더 효율적으로 쓴다는거지?
맹꾸리 : 아니 그건 필요하니까 지우지마.
탱꾸리 : ? 이미 지웠는데?
맹꾸리: ?
자, 여러분이 말한 것처럼 가비지 컬렉터는 동적 메모리에 있는 필요없는 데이터들을 해제시켜줘서 성능을 좋게 만들어줘요.
맹꾸리 : 어? 그러면 관리 언어가 더 성능이 좋아야 하는거 아닌가요?
탱꾸리 : 아니지, 너가 필요하다고 생각한 글자들이 내가 볼땐 필요없다고 생각하니깐 지우지 않았으면 성능이 더 떨어졌겠지.
맹꾸리 : 그러면 그런 필요성을 개발자들이 일일이 정해놓고 해야한다는거야? 그럼 너무 어려울 것 같은데?
맞아요. 그래서 C나 C++같은 비관리 언어는 개발자(프로그래머)가 직접 메모리에 접근해서 해제시켜줘야 하기 때문에 실력에 따라 성능이 천차만별이 날 수 있어요. 그래서 그런 시간들을 단축시켜주고자 만든게 바로 가비지 컬렉터에요. Java나 Python에서는 가비지 컬렉터가 일반적으로 필요없는 데이터들을 자동으로 수집해서 사용자가 메모리에 접근할 필요가 없도록 해 개발 시간을 줄여줘요.
탱꾸리 : 근데 동적 메모리는 뭐에요? 정적 메모리도 있다는 소린가?
메모리에 대한 자세한 내용은 나중에 수업을 통해 알아보도록 하고 오늘은 프로그래밍언어에 대해 집중해서 공부해봅시다.
2. 컴파일과 실행시간에 타입이 결정되는 방식
- 정적 타입 언어
타입이 고정되어 있는 언어로써 형 변환을 하기위해서는 컴파일 전에 형변환을 명시해야 한다.
- 동적 타입 언어
타입이 실행 시간에 결정되는 언어로써 실행하기 전까지는 특정 식의 타입을 결정할 수 없다.
| 타입 언어 | 타입 결정 시기 | 안정성 | 유연성 | 종류 |
| 정적 타입언어 | 컴파일 | 높음 | 낮음 | C, C++, Java, C# |
| 동적 타입언어 | 실행 | 낮음 | 높음 | Python, JavaScript, Ruby |
저번시간에 컴파일과정에 대해 공부했죠? 컴파일시간과 실행파일을 실행하는 실행시간을 기준으로 타입이 결정되는 방식이 있어요.그게 바로 정적 타입과 동적 타입이에요.
탱꾸리 : 정적이랑 동적이란 말을 되게 많이 쓰네요. 그만큼 중요한 개념이라는 거죠?
맞아요. 정적과 동적이란 단어는 각각의 프로그래밍 언어나 가상머신, 논리적 개념에서 서로서로 의미가 다르게 쓰여요. 그러니 두 단어에 대해서는 다른 영역에서의 쓰임과 개념을 혼동하지 않도록 주의해야해요.
정적 타입 언어는 타입이 고정되어 있는 언어로써 형 변환을 하기 위해서는 컴파일 전에 형변환을 명시해야해요. 동적 타입 언어는 타입이 실행시간에 결정되는 언어로써 실행하기 전까지는 특정 식의 타입을 결정할 수 없어요.
탱꾸리 : 타입이 뭐에요? 뉴진스의 타입보이?
맹꾸리 : 아...
탱꾸리 : 왜 웃었잖아?
맹꾸리 : 무시하시고 설명해주세요.(엄근진)
타입이란 단어를 설명하기전에 변수에 대해 알 필요가 있어요.
변수는 우리가 값을 지정할 대상을 가리키는 말인데,
결국엔 우리가 값을 지정하는 대상의 타입이라는 걸 지정해주는거죠. 타입에는 두 가지로 나뉘는데요.
기본형 타입과 참조형 타입으로 나뉘어요.
기본형 타입 : 실제 연산에 사용되는 변수의 타입
참조형 타입 : 메모리 주소값을 저장하는 변수의 타입
기본형 타입 참조형 타입 숫자(Number)
문자열(String)
불린(Boolean)
null
undefined
심볼(Symbol)객체(Object)
배열(Array)
함수(Function)
날짜(Date)
정규표현식(RegExp)
Map
WeakMap
Set
WeakSet
탱꾸리 : 흐익? 뭐가 이렇게 많아....객체는 뭐고 심볼은 또 뭐지...
겁먹을 필요 없어요. 다 이해할 수 있을 거에요. 기본형 타입과 참조형 타입에 대해서는 다음 수업에서 자세히 배울테니 이번 수업내용만 잘 따라오면 문제없을 거에요.
맹꾸리 : 그러니까 변수의 타입이 고정되어 있는게 정적 타입 언어고 실행하기 전까지는 타입을 결정 할 수 없는게 동적 타입 언어라는거죠?
탱꾸리 : 뭐야... 잠깐 난 이해 못했어...
조금 더 쉽게 설명해볼게요.
int N ; // N 의 타입은 기본형 int 타입위에 int라는 건 기본형 타입중에 숫자를 나타내는 타입이에요. 그러니까 변수 N에 숫자가 들어갈 거라는 걸 명시해주는거죠. 이렇게 한번 명시한 변수는 바뀌지 않아서 정적 타입이라고 해요.
위에 name은 문자 A를 나타낼 수도 있지만 아스키코드의 A값인 65를 나타낼 수도 있어요. 그래서 실행과정에서 타입을 결정하도록 하는게 동적 타입이라고 해요.name = 'A';
탱꾸리 : 아 그러면 타입이 이미 정해져있는게 컴파일할 때도 오류도 적고 버그 같은것도 잘 안일어 나겠네요?
맞아요. 그 대신 유연성은 좀 떨어지죠. 다음은 프로그래밍 패러다임에 따른 분류방식을 설명할게요.
3. 명령형 언어와 선언형 언어에 따른 방식
- 명령형 프로그래밍 - 프로그램이 '어떤 방식'으로 표현할 것인지에 초점
절차적 프로그래밍 언어
반환 값이 거의 없고, 함수 호출을 통해서 추상화와 재사용성을 얻어내는 프로그래밍
객체지향적 프로그래밍 언어
프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 프로그래밍
- 선언형 프로그래밍 - 프로그램이 '무엇'을 할 것인지에 초점
함수형 프로그래밍 언어
순수함수와 일등객체인 함수에 중점을 둔 프로그래밍
이제 마지막으로★ 가장 중요한 명령형 프로그래밍과 선언형 프로그래밍 ★에 따른 방식이에요.
탱꾸리 : 명령형이라면 컴퓨터한테 뭔가를 명령하는 거겠죠?
맹꾸리 : 선언형은 컴퓨터에게 뭔가를 선언하도록 하는건가요?
프로그래밍의 역사에 대해 복습을 하고 오면 이해가 잘 될거에요.
2023.02.01 - [개발자가 되기 전에 알아야할 것들/컴퓨터의 역사] - 객체지향 프로그래밍의 배경과 역사
탱꾸리 : 잠깐만요!! 머리 터져요.... 정리 한번 해주세요.
맹꾸리 : 내가 해줄게. 최초의 명령형 언어인 기계어에서 절차적 프로그래밍 언어로 발전시켰고 복잡한 알고리즘의 문제점 때문에 구조적 프로그래밍인 하향식을 채택했다가 그 또한 데이터 자체를 구조화하지 못했기 때문에 그걸 극복해낸 것이 상향식인 객체지향 프로그래밍인거지.
탱꾸리 : 근데 객체가 뭔가요?
객체를 이해하기 위해서는 클래스에 대해서도 알 필요가 있는데요. 자세한 내용은 다음 수업시간에 배울테니 간단히 설명하자면 클래스는 특정한 목적을 위해 만들어진 설계도라고 생각하면 됩니다. 그리고 그 설계도대로 만든 것이 객체입니다. 여러개의 객체를 만들어도 서로 독립적인 관계가 되는데요. 그건 객체지향 프로그래밍의 특징 때문입니다. 이 부분에 대해서도 다음 수업시간에 자세히 배워보도록 해요.
맹꾸리 : 그러면 선언형 명령은 함수들의 호출이나 많은 프로그램들을 끌어다 쓰는 복잡한 순서를 명령하지는 않겠네요?
맞아요. 선언형 언어는 명령형 언어와 대조되게 컴퓨터 화면에 출력하고자 하는 제목, 글꼴, 본문, 그림 등을 묘사하는데에 사용돼요. 또한 함수형 프로그래밍도 선언형 프로그래밍에 속해요. 함수형 프로그래밍이란 순수함수와 일등객체인 함수만을 사용하는 프로그래밍인데 순수함수는 함수의 내부와 외부관계에 각각 영향이 없고 반환값이 존재하는 함수에요. 함수의 인자값을 바꾸어도 항상 같은 값이 나오고, 외부에서 함수의 반환에 영향을 미치지 않아요. 부수효과를 발생시키지 않는거죠.
탱꾸리 : 어... 잘 이해가 안되는데요? 그러면 외부에서 함수에 영향을 끼치는 경우는 어떤 경우죠?
맹꾸리 : 함수 외부의 변수가 함수 내부의 변수에도 들어 가 있는 경우가 되겠지.
int c = 3;
function divide(int a,int b)
{ c = a/b;
return c;
}
맹꾸리 : 위의 코드에서 divide함수의 인자값 a와 b가 함수 외부의 변수 c 에 영향을 끼치잖아.
탱꾸리 : 아 그러면 외부의 값이 변경이 되니 순수함수가 될 수 없겠네?
맞아요. 함수형 프로그래밍에서의 데이터는 바뀔 수 없어요.
let person = { name: "사람", age: "22" };
function NextYear(person) {
person.age = person.age + 1;
return person;
}
위의 person 의 age 값이 NextYear 함수가 호출이 되면 데이터가 바뀌기 때문에 함수형 프로그래밍이 될 수 없는거죠. 일급객체란 이런 함수형 프로그래밍의 순수함수들을 이야기하는 거에요. 변수나 데이터의 구조 안에 담을 수 있고, 인자값으로 받거나 반환값으로 사용할 수 있어야 해요.
종류 중점 언어 명령형 언어 객체지향 , 절차적(구조적) 프로그래밍 어떻게 C, C++, JAVA, Javascript, Pyhon, PHP 선언형 언어 함수형 프로그래밍 무엇을 HTML, CSS, XML, SQL
오늘은 정말 중요한 프로그래밍 언어에 대해 배워보았는데요. 탱꾸리와 맹꾸리와 같이 복습을 해보고 오늘 수업은 여기까지 입니다. 1일차 학습을 잘 완료하셨고요. 다음 2일차 수업에서는 기본형 타입과 참조형타입에 대해 공부하고 메모리구조와 메모리 할당과정에 대해 자세히 배워보고 클래스와 객체 그리고 인스턴스에 대해 확실한 개념정리를 하는 시간을 갖도록 하겠습니다. 여러분 안녕히 가세요~!
탱꾸리&맹꾸리
| 프로그래밍 언어 | 분류기준 | 구분 | 특징 | 언어 | + | ||
| 메모리 관리 방식 | 동적 메모리해제, 메모리 직접 접근 | 비관리 언어 | 동적 메모리 자동해제X, 메모리 직접 접근 | C, C++ | 성능↑ | ||
| 관리 언어 | 동적 메모리 자동해제, 메모리 직접 접근 X | Java, C#, Python, Go | 성능↓ | ||||
| 타입이 결정되는 시기 | 컴파일시간과 실행시간 | 정적 타입 | 컴파일전에 타입고정 | C, C++, Java, C# | 안정성↑ 유연성↓ | ||
| 동적 타입 | 실행하기 전에 타입이 결정되지 않음 | Python, JavaScript, Ruby | 안정성↓ 유연성↑ |
||||
| 프로그램의 표현 방식 | 프로그램의 활동 중점에 따라 결정 | 절차적 | 함수호출과 추상화 | 포트란, PL/I, 모듈라-2, 에이다, 베이직, C | 프로시저 : 반환값이 없는 함수 | ||
| 객체지향적 | 객체들간의 호출 | C++, C#, Dart, Java, JavaScript, Python, swift | 객체 : 클래스의 인스턴스 | ||||
| 함수형 | 순수함수들간의 호출 | Clojure, Elixir, Haskell, Scala, Python, PHP, JavaScript | 순수 함수 : 부수효과X, 고차함수 | ||||
반응형
LIST