CPU에 따라 명령의 값이 다르다.
기계어의 프로그램
10을 임의의 공간에 저장
명령이 다른것 뿐만 아니라 명령에 따라 뒤에 나오는 내용도 의미가 달라진다.
두값을 더하는 명령(주소1에 저장된 값과 주소2에 저장된 값을 더함)
- 0x190001
- 0x19 : 명령
- 00 : 주소 1
- 01 : 주소 2
- 더해진 값은 CPU내부 공간에 저장
기계어와 어셈블리어
- 기계어
- 기계어인 0x140010 를 실행하기위해서는 16진수를 알고 있어야한다.
- 어셈블리어
- 기계어의 단점을 보완하기 위해 다음과 같이 인간이 이해할 수 있는 어셈블리어를 사용한다. )Move M (0), #10)
- 명령어에 숫자가 아닌 의미를 부여한다.
- 명령어가 실행되는 하부 구조를 신경 쓰지 않는다.
- 프로그래밍의 속성
- 모든것을 알고 작업하지 않는다.
- 초보자 입장에서 하부구조를 아는 것은 상부구조를 쉽게 이해하기 위해서임
- 컴퓨터 구조를 당연하게 느끼기 위함
- 사용 형태에 따라 저수준(Low Level)과 고수준(High Level)으로 나뉜다.
Low Level과 High Level
기계어 - Low Level < 어셈블리어 - High Level < C언어 - High Level
C언어는 어셈블리어로 변환 되었다가 기계어로 변환 된다.
고수준으로 발전되는 이유 - 시간을 어디에 사용할 것인가에 초점을 맞춤, 고수준일수록 하부 단계를 몰라도 된다. (저수준을 이해한다면 보다 넓게 이해할 수있다.)
C#언어는 C언어를 포함하는 관계를 가진다. 따라서 C언어를 알아야 C#으로 프로그래밍이 가능하다.
개발환경
- 개발환경의 설치가 중요해짐
- 설치가 일반 프로그램 보다 쉽지 않음
- 고수준으로 접근하기 위해 필요한 작업
C언어와 변수
프로그램을 작성한다는 의미에서 에셈블리와 동일
임의의 공간에 이름(변수)을 정하여 저장
int number; 이라는 것은 메모리 공간을 하나 생성해달라고 운영체제에 요청하는 작업으로 선언(declare)한다고 이야기 한다.
어셈블리어는 메모리의 주소를 사용하지만 C언어는 변수 이름을 사용
변수의 의미
- 변수를 선언하여 메모리를 사용함
- 메모리의 주소가 아닌 변수의 이름을 사용하여 우리가 생각하는 데이터 중심으로 프로그램을 작성
- 프로그래밍적 접근 방법으로 작성하고, 메모리적 접근방법으로 분석한다.
접근 방법
- 프로그래밍적 접근 방법
- 메모리적 접근 방법
- 실제 메모리의 값을 따져가면서 프로그램을 작성, 분석
컴파일의 이유
- 컴파일
- C언어가 어셈블리어로 변환 되었다가 기계어로 변환 되는 과정을 컴파일이라고 한다.
- 가장 큰 이유는 변수가 존재하기 때문이다.
- 변수가 존재하며 실제의 어느 장소의 메모리를 사용할 지를 정해지지 않음
- 직접 컴파일을 하는 것이 아니라 버튼을 누르면 실행되는 동작이다.
- 고수준으로 발전할수록 컴퓨터의 자원보다 개발 환경의 편의성이 더 중요해짐
- 오버헤드 : 기능의 추가로 더 많은 성능을 필요로함
C언어 프로그램
컴파일 시 변수가 어떤 메모리를 사용하는지에 대한 표(테이블)가 필요함
메모리의 종류
스택(Stack) - 빠르게 사용하는 쌓이는 메모리의 종류
- 아래에서 위로 쌓인다.
- 쌓였다가 사용이 끝나면 사라짐
힙(Heap) - 큰 자료를 관리하기 위한 메모리
- 데이터를 늘어 놓고 사용
- 크기가 큰 데이터에 사용
스태틱(Static) - 공통으로 공유하는 메모리
- 정적인 데이터라는 의미
- 데이터를 공유하여 사용
데이터를 종류에 따라 최대 속도와 최적의 상황으로 사용하기 위함
기본 자료로 사용되는 변수의 메모리는 스택으로 동작한다.
힙(Heap) 메모리
클래스나 큰 크기의 데이터에 사용
레퍼런스 (참조) : 바로가기와 동일
변수가 참조를 가지고 있다. = “변수가 실제 데이터를 가리킨다.” 라는 의미
함수
반복되는 동작을 코드로 표현
반복되는 동작을 원하는 대로 사용
복잡한 동작을 함수로 대체하여 사용 가능
| 순서 |
① |
② |
③ |
④ |
⑤ |
⑥ |
⑦ |
⑧ |
⑨ |
⑩ |
| 임시 |
|
|
|
|
|
|
|
30 |
30 |
|
| z |
|
|
|
|
|
null |
30 |
30 |
|
|
| y |
|
|
|
|
20 |
20 |
20 |
20 |
|
|
| x |
|
|
|
10 |
10 |
10 |
10 |
10 |
|
|
| result |
|
|
null |
null |
null |
null |
null |
null |
null |
30 |
| b |
|
20 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
| a |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
함수의 메모리와 delegate
함수 전체를 함수의 저장 공간에 저장 가능
함수를 저장하는 이유
- 나중에 다른 곳에서 함수를 사용하기 위함
- delegate - 대리자
- 대리자를 두고 함수를 대리자가 호출하도록 하는 기능
- delegate가 없어도 사용이 가능
- 프로그래밍을 효율적으로 하기 위한 기능
- 상황에 따라 다른 동작이 실행 가능