[ 개발 기본 지식 ] 네이티브 코드, 콜 바이 밸류, 콜 바이 레퍼런스

sonny·2024년 9월 15일
0

개발 지식이 통통

목록 보기
5/11
post-thumbnail
분야상세지식
자료구조스택, 힙
알고리즘회귀호출, 인덱스, 정렬, 이진 검색
운영체제프로세스, 스레드, 뮤텍스, 세마포어
디자인패턴MVC 아키텍처
프로그래밍 언어네이티브 코드, 콜 바이 밸류, 콜 바이 레퍼런스
경험간단한 텍스트 기반의 게임 만들어보기

출처

여섯번 째 네이티브 코드, 콜 바이 밸류, 콜 바이 레퍼런스에 대해 자세히 알아보자

네이티브 코드, 콜 바이 밸류 (call by value), 콜 바이 레퍼런스 (call by reference) 는 프로그래밍에서 중요한 개념들이다.

네이티브 코드 (Native Code)

네이티브 코드는 특정 컴퓨터 하드웨어 또는 운영 체제에서 직접 실행될 수 있는 기계어 또는 어셈블리어로 작성된 코드

  • 기계어란 컴퓨터의 '언어'이라고 생각하면 된다. 모든 컴퓨터는 자신만의 언어를 가지고 있으며, 이 언어는 0과 1로 이루어진 신호들로 구성된다. 기계어는 바로 이 신호를 의미한다. 예를 들어 컴퓨터가 "여기부터 저기까지 계산해라" 라는 명령을 이해할 때, 이 명령이 기계어로 작성된다.

  • 어셈블리어란 기계어보다 사람이 이해하기 쉬운 형태의 '약속된 코드'다. 어셈블리어는 기계어와 1:1로 대응되며, 사람이 보기 쉽게 작성되지만, 여전히 컴퓨터가 이해할 수 있는 형태로 변환된다.

예시로 보면 "ADD R1, R2" 같은 명령은 어셈블리어로서, 기계어로 변환되면 0과 1로 이루어진 신호로 바뀐다.

네이티브 코드의 특징

  • 빠르다 : 네이티브 코드는 컴퓨터 하드웨어가 직접 이해하고 실행할 수 있기 때문에, 프로그램의 실행 속도가 빠르다. 기계어는 컴퓨터가 직접 읽는 매뉴얼처럼, 이해하기 쉬운 언어로 작성되므로, 추가적인 번역이 필요 없다.

  • 플랫폼 의존적 : 네이티브 코드는 특정 하드웨어나 운영 체제에 맞게 작성되기 때문에, 다른 종류의 컴퓨터에서는 실행할 수 없다. 네이티브 코드는 특정 자동차 모델을 위한 설명서와 같아서, 다른 자동차 모델에서는 사용할 수 없다.

  • 직접 접근 : 네이티브 코드는 메모리와 하드웨어 자원에 직접 접근할 수 있다. 따라서 하드웨어의 세밀한 제어가 가능하다. 네이티브 코드는 컴퓨터 내부의 복잡한 장비들을 직접 조정할 수 있는 조종판처럼, 매우 세밀한 제어가 가능하다.

예시

C, C++: 이러한 프로그래밍 언어로 작성된 코드는 컴파일러를 통해 네이티브 코드로 변환된다. 이 네이티브 코드는 실행 파일로 만들어져, 특정 운영 체제와 하드웨어에서 직접 실행될 수 있다.

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

이 C 코드는 컴파일된 후 네이티브 코드가 되어 실행될 수 있다. C언어는 잘 모르지만 이해하려고 노력해보자

요약

  • 네이티브 코드는 컴퓨터의 하드웨어와 운영 체제에서 직접 실행될 수 있는 코드이다.
  • 기계어와 어셈블리어로 작성되며, 빠르고 하드웨어에 직접 접근할 수 있다.
  • 플랫폼 의존적으로, 특정 하드웨어나 운영 체제에 맞게 작성되므로 다른 환경에서는 사용할 수 없다.

이러한 네이티브 코드는 소프트웨어 성능을 최적화하거나 하드웨어와 밀접하게 연동해야 하는 경우에 유용하다.


콜 바이 밸류 (Call by Value)

콜 바이 밸류는 함수에 값을 전달할 때, 해당 값의 복사본을 함수에 전달하는 방법이다. 함수가 실행될 때, 인자의 실제 값이 아니라 복사된 값이 사용된다.

  • 복사본 전달 : 친구에게 책을 빌려주려 할 때, 원본 책이 아니라 복사본을 주는 것과 같다. 친구는 복사본을 가지고 사용할 수 있지만, 원본에는 영향을 미치지 않는다.

  • 변경 불가능 : 친구가 복사본에 내용을 메모할 수는 있지만, 원본 책에는 아무런 변화가 없다. 함수 내에서 인자의 값을 변경해도, 호출한 쪽의 원본 변수는 그대로 유지된다.

코드 예시 (Swift)

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로 남아 있다.

요약

  • 콜 바이 밸류는 함수 호출 시 인자의 값의 복사본을 함수에 전달한다.
  • 함수 내에서 인자의 값을 변경해도 원래 변수에는 영향을 미치지 않는다.
  • 복사본을 사용하므로, 함수 내의 변경이 호출한 쪽의 원본 데이터에 영향을 미치지 않는다.

이 방식은 데이터의 무결성을 유지하고 함수가 독립적으로 동작할 수 있도록 해준다.


콜 바이 레퍼런스 (Call by Reference)

콜 바이 레퍼런스는 함수 호출 시 함수에 인자의 메모리 주소를 전달하는 방법이다. 함수가 호출될 때, 인자의 메모리 주소가 전달되므로, 함수 내에서 인자의 값을 변경하면 원래 변수의 값도 변경된다.

  • 주소 전달 : 친구에게 집 열쇠를 주는 것과 같다. 친구는 집에 가서 열쇠로 문을 열 수 있지만, 열쇠를 돌려놓은 집의 상태는 그대로 유지된다. 여기서 열쇠가 바로 메모리 주소를 의미한다.

  • 변경 가능 : 친구가 집에서 물건을 바꿔놓으면, 집의 상태가 바뀐다. 함수가 인자의 값을 변경하면, 원래 변수의 값도 바뀐다.
    코드 예시 (Swift)

코드 예시 (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으로 변경된다.

요약

  • 콜 바이 레퍼런스는 함수 호출 시 인자의 메모리 주소를 전달한다.
  • 함수 내에서 인자의 값을 변경하면 원래 변수의 값도 함께 변경된다.
  • 주소를 사용하므로, 함수 내의 변경이 원본 데이터에 직접 영향을 미친다.

이 방식은 큰 데이터 구조나 객체를 함수에 전달할 때 유용하며, 메모리 사용을 줄이고, 함수 내에서 데이터의 변경이 원본 데이터에 바로 반영되도록 할 수 있다.


전체적으로 요약하자면,

  • 네이티브 코드: 기계어 또는 어셈블리어로 작성된 코드로, 특정 하드웨어에서 직접 실행된다.
  • 콜 바이 밸류: 함수 호출 시 인자의 값의 복사본을 전달하며, 함수 내에서 인자의 값을 변경해도 원래 변수는 영향을 받지 않는다.
  • 콜 바이 레퍼런스: 함수 호출 시 인자의 메모리 주소를 전달하며, 함수 내에서 인자의 값을 변경하면 원래 변수도 변경된다.

이러한 개념들은 프로그램의 동작 방식에 큰 영향을 미치므로 이해하고 사용하는 것이 중요하다고 한다. 솔직히 이번 내용들은 나에겐 상당히 고난이도적인 내용인데, 우선 정리 해놓고 틈틈히 와서 내용을 읽고 정리해보는 것이 좋겠다.

profile
iOS 좋아. swift 좋아.

0개의 댓글