
| 분야 | 상세지식 |
|---|---|
| 자료구조 | 스택, 힙 |
| 알고리즘 | 회귀호출, 인덱스, 정렬, 이진 검색 |
| 운영체제 | 프로세스, 스레드, 뮤텍스, 세마포어 |
| 디자인패턴 | MVC 아키텍처 |
| 프로그래밍 언어 | 네이티브 코드, 콜 바이 밸류, 콜 바이 레퍼런스 |
| 경험 | 간단한 텍스트 기반의 게임 만들어보기 |
네이티브 코드, 콜 바이 밸류 (call by value), 콜 바이 레퍼런스 (call by reference) 는 프로그래밍에서 중요한 개념들이다.
네이티브 코드는 특정 컴퓨터 하드웨어 또는 운영 체제에서 직접 실행될 수 있는 기계어 또는 어셈블리어로 작성된 코드
기계어란 컴퓨터의 '언어'이라고 생각하면 된다. 모든 컴퓨터는 자신만의 언어를 가지고 있으며, 이 언어는 0과 1로 이루어진 신호들로 구성된다. 기계어는 바로 이 신호를 의미한다. 예를 들어 컴퓨터가 "여기부터 저기까지 계산해라" 라는 명령을 이해할 때, 이 명령이 기계어로 작성된다.
어셈블리어란 기계어보다 사람이 이해하기 쉬운 형태의 '약속된 코드'다. 어셈블리어는 기계어와 1:1로 대응되며, 사람이 보기 쉽게 작성되지만, 여전히 컴퓨터가 이해할 수 있는 형태로 변환된다.
예시로 보면 "ADD R1, R2" 같은 명령은 어셈블리어로서, 기계어로 변환되면 0과 1로 이루어진 신호로 바뀐다.
빠르다 : 네이티브 코드는 컴퓨터 하드웨어가 직접 이해하고 실행할 수 있기 때문에, 프로그램의 실행 속도가 빠르다. 기계어는 컴퓨터가 직접 읽는 매뉴얼처럼, 이해하기 쉬운 언어로 작성되므로, 추가적인 번역이 필요 없다.
플랫폼 의존적 : 네이티브 코드는 특정 하드웨어나 운영 체제에 맞게 작성되기 때문에, 다른 종류의 컴퓨터에서는 실행할 수 없다. 네이티브 코드는 특정 자동차 모델을 위한 설명서와 같아서, 다른 자동차 모델에서는 사용할 수 없다.
직접 접근 : 네이티브 코드는 메모리와 하드웨어 자원에 직접 접근할 수 있다. 따라서 하드웨어의 세밀한 제어가 가능하다. 네이티브 코드는 컴퓨터 내부의 복잡한 장비들을 직접 조정할 수 있는 조종판처럼, 매우 세밀한 제어가 가능하다.
C, C++: 이러한 프로그래밍 언어로 작성된 코드는 컴파일러를 통해 네이티브 코드로 변환된다. 이 네이티브 코드는 실행 파일로 만들어져, 특정 운영 체제와 하드웨어에서 직접 실행될 수 있다.
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
이 C 코드는 컴파일된 후 네이티브 코드가 되어 실행될 수 있다. C언어는 잘 모르지만 이해하려고 노력해보자
콜 바이 밸류는 함수에 값을 전달할 때, 해당 값의 복사본을 함수에 전달하는 방법이다. 함수가 실행될 때, 인자의 실제 값이 아니라 복사된 값이 사용된다.
복사본 전달 : 친구에게 책을 빌려주려 할 때, 원본 책이 아니라 복사본을 주는 것과 같다. 친구는 복사본을 가지고 사용할 수 있지만, 원본에는 영향을 미치지 않는다.
변경 불가능 : 친구가 복사본에 내용을 메모할 수는 있지만, 원본 책에는 아무런 변화가 없다. 함수 내에서 인자의 값을 변경해도, 호출한 쪽의 원본 변수는 그대로 유지된다.
func increment(value: Int) -> Int {
return value + 1
}
var number = 5
let result = increment(value: number) // number는 여전히 5로 유지된다
하나하나 살펴보자면,
func increment(value: Int) -> Int:
return value + 1:
이 부분은 함수가 호출되면 value에 1을 더한 값을 반환한다.
여기서 value는 함수가 호출될 때 전달받은 인자의 복사본이기 때문에, 이 코드에서는 원본 변수의 값이 변경되지 않는다.
increment 함수는 하나의 Int 타입 인자(value)를 받아서, 그 값에 1을 더한 후 결과를 반환하는 함수
var number = 5:
number라는 변수에 값 5를 저장
let result = increment(value: number):
increment 함수를 호출할 때, number 변수의 값을 복사하여 value 인자에 전달한다. 함수 내에서 value는 복사된 값 5를 가지고, 이 값을 1 증가시킨 결과(6)를 반환한다. 하지만, number 변수의 값은 변경되지 않고 여전히 5로 남아 있다.
이 방식은 데이터의 무결성을 유지하고 함수가 독립적으로 동작할 수 있도록 해준다.
콜 바이 레퍼런스는 함수 호출 시 함수에 인자의 메모리 주소를 전달하는 방법이다. 함수가 호출될 때, 인자의 메모리 주소가 전달되므로, 함수 내에서 인자의 값을 변경하면 원래 변수의 값도 변경된다.
주소 전달 : 친구에게 집 열쇠를 주는 것과 같다. 친구는 집에 가서 열쇠로 문을 열 수 있지만, 열쇠를 돌려놓은 집의 상태는 그대로 유지된다. 여기서 열쇠가 바로 메모리 주소를 의미한다.
변경 가능 : 친구가 집에서 물건을 바꿔놓으면, 집의 상태가 바뀐다. 함수가 인자의 값을 변경하면, 원래 변수의 값도 바뀐다.
코드 예시 (Swift)
func increment(_ value: inout Int) {
value += 1
}
var number = 5
increment(&number) // number는 6으로 변경된다
코드 해석
func increment(_ value: inout Int):
설명: increment 함수는 inout 키워드를 사용하여 인자를 전달받는다. inout은 인자의 메모리 주소를 전달하여 함수 내에서 값이 변경되면 원본 변수에도 영향을 미치도록 한다.
var number = 5:
설명: number라는 변수에 값 5를 저장한다.
increment(&number):
설명: increment 함수를 호출할 때, & 기호를 사용하여 number 변수의 메모리 주소를 전달한다. 함수 내에서 value는 이 주소를 통해 직접 접근할 수 있으며, 값을 1 증가시키면, number의 값도 6으로 변경된다.
이 방식은 큰 데이터 구조나 객체를 함수에 전달할 때 유용하며, 메모리 사용을 줄이고, 함수 내에서 데이터의 변경이 원본 데이터에 바로 반영되도록 할 수 있다.
네이티브 코드: 기계어 또는 어셈블리어로 작성된 코드로, 특정 하드웨어에서 직접 실행된다.콜 바이 밸류: 함수 호출 시 인자의 값의 복사본을 전달하며, 함수 내에서 인자의 값을 변경해도 원래 변수는 영향을 받지 않는다.콜 바이 레퍼런스: 함수 호출 시 인자의 메모리 주소를 전달하며, 함수 내에서 인자의 값을 변경하면 원래 변수도 변경된다.이러한 개념들은 프로그램의 동작 방식에 큰 영향을 미치므로 이해하고 사용하는 것이 중요하다고 한다. 솔직히 이번 내용들은 나에겐 상당히 고난이도적인 내용인데, 우선 정리 해놓고 틈틈히 와서 내용을 읽고 정리해보는 것이 좋겠다.