homework_01:
2. ROM vs RAM 설명하기
1. 램(RAM)
Random Access Memory
자유롭게 내용을 쓰고 읽고 지울 수 있는 기억장치로 램의 성능이 높을수록 한 번에 많은 일을 진행할 수 있기 때문에 책상에 비유한다.
메인 메모리에 주로 사용하는 RAM은 전원을 켜고 있을 때는 데이터를 사용할 수 있지만 전원이 꺼지면 데이터가 사라지는 휘발성이다.
때문에 컴퓨터를 종료하고 다시 전원을 공급하면 아무것도 없는 빈 상태가 된다.
램은 컴퓨터의 주 기억장치 하드디스크에서 자주 사용하는 데이터를 불러와서 CPU가 빠르게 처리할 수 있는 중간다리 역할을 한다..
램 메모리의 기술은 급속도로 발전하고 있기 때문에 종류만 수십여 개에 이르지만 크게 분류하면 아래와 같이 구분할 수 있다.
① SRAM
복잡한 구조를 가지고 있는 램으로 DRAM의 100배 이상의 속도를 보여주기 때문에 캐시 메모리에 주로 사용되며 공간을 많이 차지하고 가격이 비싸다.
② DRAM
SRAM에 비해서 속도는 느리지만 구조가 간단하기 때문에 가격이 저렴하고 전력 소비가 적고 용량이 높아서 CPU 주 기억장치로 가장 많이 사용한다.
③ PRAM
전원이 차단되어도 정보가 유지되는 플래시 메모리의 비휘발성, RAM의 빠른 속도 두 가지 장점을 모두 가지고 있는 차세대 메모리 반도체다.
④ SDRAM
클록 속도가 CPU와 동기화되어 있기 때문에 CPU가 작동하면 함께 움직이며 작업량을 증가시키고 속도를 높이는 역할을 한다.
⑤ DDR SDRAM
기존에 출시한 SD 램과 비교해서 두 배 빠른 전송속도를 자랑하기 때문에 속도가 같아도 두 배 많은 데이터를 이동시킬 수 있다.
2. 롬(ROM)
Read-only memory
한번 저장한 데이터를 빠른 속도로 읽을 수 있지만 다시 기록할 수 없는 비휘발성 메모리로 현대에 들어서는 사용량이 줄어들고 있다.
롬은 한번 데이터를 기록하면 변경이 불가능하기 때문에 사용하기는 불편하지만 변경 가능성이 없는 소프트웨어를 쓸 때는 매우 유용하다.
그래서 컴퓨터의 경우 바이오스(BIOS)를 저장하는 용도로 사용하며 냉장고, 에어컨 등에 Mask ROM이 많이 사용되는 중이다.
만약 ROM이 없다면 전기를 아끼려고 가전제품의 전원을 끄는 순간 설치된 프로그램이 모두 날아가서 쓸모없는 고철 덩어리가 될 것이다.
-종류
요즘에는 거의 사용하지 않지만 CD, DVD 역시 롬 메모리로 분류할 수 있는데 대표적으로 어떤 종류가 있을까?
① Mask ROM
마스크롬은 고정된 데이터 회로 패턴으로 생산하기 때문에 내용을 변경할 수 없어 안전성이 높지만 문제가 있으면 수정이 불가능해 폐기해야 한다.
② PROM
모든 메모리 비트가 퓨즈로 연결되어 1로 읽히지만 데이터를 기록하면 퓨즈가 끊어져 0으로 읽히기 때문에 1회에 한해서 내용을 한번 기록할 수 있다.
③ EPROM
자외선을 이용해서 저장된 데이터를 지우고 다시 기록할 수 있기 때문에 유용하지만 과정이 불편하고 불휘발성이 약한 편이다.
④ EEPROM
전기적인 신호를 통해서 기록된 내용을 지우고 다시 저장할 수 있는 롬으로 안전성은 높지만 용량이 작고 가격이 비싸서 플래시 메모리에 밀리고 있다.
⑤ 플래시 롬
일반적으로 펌웨어가 들어간 저장 장치를 롬이라고 부르기 때문에 생긴 단어로 특수한 경우이기 때문에 공식적으로 롬으로 분류하지 않는다.
3. 컴파일러 vs 인터프리터
컴파일러란 아주 간단하게 설명하자면,
우리가 사용하는 프로그래밍 언어(C, Java 등)로 쓰여진 코드를 컴퓨터가 이해할 수 있는 기계어로 변환해주는 프로그램입니다.
위의 예시에서 든 파이썬(Python)이나 스크래치(Scratch) 같은 언어들은, 인터프리터(Interpreter) 방식을 사용합니다.
자바(Java)는 컴파일 언어기도 하지만 인터프리터 언어기도 해서 '하이브리드 언어'라 불리기도 하구요.
저급 언어인 어셈블리어를 바꿔주는 어셈블러(Assembler) 같은 녀석도 있지요
4. 파서 개념
파서 [ parser ]
주어진 종단 기호의 열(列)이 특정의 문법에서 생성되는지를 판정하고, 초기 기호로부터 그 열에 도달하는 생성 규칙의 열을 발견하는 프로그램을 가리킨다. 구조를 가진 대상 중에서도 자연 언어로 쓰여진 문이나 인공 언어로 쓰여진 프로그램을 문법 규칙에 따라 구문 해석하고, 그것이 문법에 합치하는지 여부를 조사하는 알고리즘을 파서 또는 구문 해석 알고리즘이라고 한다. 해석 결과는 구성 부분 간의 관계를 밝힘과 동시에 문의 의미를 이해하게 된다. 보통 파스 트리(parse tree)를 출력한다. 구문 분석 프로그램(syntax analyzer)과 같은 뜻으로 사용되기도 한다.
[네이버 지식백과] 파서 [parser] (컴퓨터인터넷IT용어대사전, 2011. 1. 20., 전산용어사전편찬위원회)
프로그래밍 문법 구조를 받아들여 그 언어의 파서(parser) 프로그램을 생성해 주는 컴파일러. 대표적인 것으로는 YACC가 있다. 파서는 컴파일러나 인터프리터에서 원시 프로그램을 읽어들여, 그 문장의 구조를 알아내는 구문 분석을 행하는 프로그램이다. 컴파일러나 인터프리터가 프로그램을 이해해 기계어로 번역하는 단계이며, 각 문장의 문법적 구성과 구문을 분석하는 과정이다. 다시 말하면, 원시 프로그램의 토큰열(token sequence)을 받아들여 문법에 맞게 파스 트리(parse tree)를 구성하는 것이다.
[네이버 지식백과] 파서 생성기 [parser generator, -生成器] (IT용어사전, 한국정보통신기술협회)
5. 인터프리터 vs VM
1. 인터프리터 언어가 돌아가는 과정
인터프리터 언어가 실행되는 과정은 간단합니다.
①소스 코드를 얻고
②어휘, 구문 분석하고
③바이트 코드를 생성한 다음
④VM(실행 환경)에서 그걸 읽으면서 실행
물론 언어마다 돌아가는 과정이 다를 수 있습니다.
최적화를 하거나, jit 컴파일해서 과정이 늘어나는 등 여러가지 경우도 있지만,
기본적으로는 위의 4단계가 진행됩니다.
참고로 위 사진에 '컴파일'이라고 적어놓았는데, 그것보다는 '인터프리팅'(해석)이 맞는 표현 같네요.
2. 실행 단계(Runtime)에서 필요한 것
JVM ( Java Virtual Machine ) 은 컴퓨터에서 Java 프로그램은 물론 Java 바이트코드 로 컴파일되는 다른 언어로 작성된 프로그램 을 실행할 수 있게 해주는 가상 시스템 입니다 . JVM은 JVM 구현에 필요한 사항을 공식적으로 설명 하는 사양 으로 자세히 설명됩니다. 사양이 있으면 다양한 구현에서 Java 프로그램의 상호 운용성이 보장되므로 JDK( Java Development Kit )를 사용하는 프로그램 작성자는 기본 하드웨어 플랫폼의 특이성에 대해 걱정할 필요가 없습니다.
VM(실행 환경)에서 사용되는 것들은 아래와 같습니다.
*메모리(memory) : 변수를 저장할 공간입니다. 대충 배열로 구현 가능
*오퍼랜드 스택(operand stack) : 연산 시 사용되는 스택을 의미함. 인터프리터는 주로 스택을 이용해서 연산을 함.
*콜 스택(call stack) : 함수를 호출(call)하고 복귀(return)할 때 필요합니다. 이전에 호출된 함수의 정보나 변수의 크기가 저장되는데, 이 각각의 요소를 스택 프레임(stack frame)이라고 합니다. 지금은 몰라도 되고, 자세한 건 함수 구현 파트에서..
*바이트 코드(byte code) : VM이 읽고 처리하는 중요한 코드를 말합니다. 소스코드의 구문 분석 중(또는 분석이 끝나면) 생성됩니다. 명령어가 바이트(1byte)인게 특징.
*리터럴(literal) : 숫자, 문자열 상수 등이 저장되어 있는 테이블 입니다. 실행 중에 실제로 사용됩니다.
경우에 따라서는 상수 말고도 다른 타입도 들어갈 수 있고요.
언어의 종류나 기능에 따라 추가되는 게 있지만, 기본적으로는 위의 5가지는 필수적으로 필요합니다.
[출처] [본격 인터프리터 만들기] 1. 인터프리터의 구성|작성자 공부 대충하는 녹색이
참고로 어떤 사람들은 연산 중에 레지스터는 사용하지 않는다고 하는데,
사실 스택 자체로도 레지스터 연산을 이용하는 거라서 옳은 표현은 아닙니다.
즉, 제대로 정의하면
컴파일 언어 : 레지스터만을 이용해서 연산 시간 낭비가 없음.
인터프리터 언어(VM 사용) : 스택을 이용해 연산하는데, 그 만큼 늘어나는 레지스터 연산 횟수 때문에 기존의 컴파일 언어에 비해 시간 낭비가 많고 매우 느림.
[출처] [본격 인터프리터 만들기] 1. 인터프리터의 구성|작성자 공부 대충하는 녹색이
6. 절차지향 / 객체지향 개념에 대해 설명
- 절차지향 언어와 객체지향 언어는 대응되는 개념이 아니다.
절차지향 언어와 객체지향언어의 특징을 각각 알아보겠습니다.
1. 절차지향 언어란?
절차지향 언어는 말 그대로 '절차'가 중요한 언어라고 이해하면 됩니다.
우리가 프로그래밍 언어를 접하면서 대부분 가장 먼저 공부하게 되는 'C언어'가 대표적인 절차지향 언어입니다.
코드의 순서가 중요하기 때문에 코드 내용 변경시 실행 결과가 전과 동일하지 않을 수도 있기 때문에 디버깅이 어렵다는 평이 있는 것 같습니다.
하지만 속도가 빠르다는 장점이 있기 때문에 프로그래밍 언어를 처음 배운다면 비교적 쉬운 코드 작성과 빠른 실행으로 공부를 효율적으로 할 수 있다는 장점이 있습니다.
2. 객체지향 언어란?
객체지향 언어는 객체를 생성하여 서로가 유기적으로 작용하도록 구성한다는 특징이 있습니다.
이렇게 표현하면 이해가 어려울 수 있으니 간단한 예시를 들어보겠습니다.
사과, 바나나, 딸기는 모두 '과일'이라는 범주 안에 있습니다.
과일의 세부 정보는 '이름', '색', '수확일' 등이 있습니다.
이 정보를 객체로 생성해보겠습니다.
'과일' 이라는 객체를 생성하고, 객체의 멤버 변수에 '이름', '색', '수확일' 이라는 정보를 담을 수 있습니다.
그리고 이 객체는 여러 개를 생성할 수 있습니다.
사과 정보를 저장할 객체, 바나나 정보를 저장할 객체, 배 정보를 저장할 객체 이렇게 여러 개를 생성할 수 있습니다.
이렇게 현실의 정보를 객체로 생성해서 활용하는 것이 바로 객체지향 언어의 특징입니다.
객체지향 언어의 특징은 상속, 캡슐화, 다형성, 추상화 등이 있습니다.
[출처] 객체지향 언어와 절차지향 언어의 특징 / C언어 / C++|작성자 책소녀
3. 객체 지향 언어는 다음과 같은 특징을 갖습니다.
a. 캡슐화
캡슐화란 변수와 함수를 하나의 단위로 묶는 것을 의미합니다. Java에서 이러한 데이터 번들링은 class를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메서드에 쉽게 접근할 수 있습니다. 이러한 캡슐화를 통해 정보 은닉을 할 수 있습니다. 데이터와 코드의 형태를 외부로부터 알 수 없게 합니다. 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높입니다.
b. 상속
상위 클래스의 모든걸 하위 클래스가 모두 이어 받는 개념을 갖고 있습니다. 상속을 통해서 캡슐화를 유지하면서 클래스의 재사용을 가능토록 합니다.
c. 다형성
상속과 연관된 말로, 한 객체가 다른 여러 상태와 행위로 재구성될 수 있습니다. 오버로딩(overloading)와 오버라이딩(overriding)이 하나의 예입니다.
* 오버라이딩: 상위 클래스가 갖고 있는 메서드를 하위 클래스가 재정의해서 사용하는 기술
* 오버로딩: 같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술
4. 객체 지향 언어의 장점이 뭘까
a. 재사용성
상속을 통해서 프로그래밍 시 코드의 재사용을 높일 수 있습니다.
b. 생산성 향상
잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킵니다. ctrl + v 신공은 나중에 수정사항이 생겼을 때 일일히 찾아서 바꿔주어야 되지만, 클래스는 한 곳에서만 바꾸면 됩니다.
c. 자연적인 모델링
실세 세상의 사물들을 하나의 객체로 생각하며 프로그래밍이 이루어지기 때문에 클래스를 구현할 때 일상생활의 모습과 대비시키며 자연스럽게 구현할 수 있습니다.
d. 유지보수의 우수성
캡슐화로 인해 모듈끼리의 의존성이 떨어집니다. 그렇기에 프로그램 추가 및 수정와 같은 유지보수에 용이합니다.
5. 객체 지향 언어의 단점은?
a. 개발 속도가 느립니다.
상속과 같은 개념은 유지보수에 용이하지만, 그만큼 다중 상속이 되면 복잡해집니다. 이에 설계 단계에서 클래스끼리의 관계를 정확하게 이해할 필요가 있기 때문에 개발 속도가 늦어질 수 있습니다.
b. 실행 속도가 느립니다.
거의 대부분의 객체지향 언어에서 기능을 묶으면 함수 호출이 추가로 들어가거나 계산식 중간에 포인터 연산 등이 필요해집니다. 멤버 함수 같은 경우 어느 객체의 함수인지 지정해야 하기 때문에 추가 포인터 크기와 연산 비용이 들어갑니다. 때문에 절차적 프로그래밍보다 무겁습니다.
c. 코딩난이도가 상승합니다.
다중 상속은 개발자들에게 많은 고민거리입니다. 상속을 통해서 중복을 없앨 수 있지만, 그만큼 상위 클래스와 하위 클래스간의 관계를 인지하고 있어야 합니다.
'빅데이터_분석서비스_개발자과정' 카테고리의 다른 글
OSI 7 모형 (0) | 2022.12.29 |
---|---|
ICT_용어사전 (0) | 2022.12.28 |