본문 바로가기
개발 노트/기초 지식

[java] 바인딩, 정적 메모리 할당, 동적 메모리 할당

by tokkiC 2022. 4. 30.

바인딩


binding 이란 변수에 변수의 값을 연결하는 것을 말한다. 초기화도 값을 넣는것도 바인딩이라 할 수 있겠다
즉 a = b 라는 상관관계를 만드는 것을 말한다

a = 1 은 a와 1 을 정적 바인딩 한것이고 (따로 참조 없이도 정의가능)
a = 메소드.() 은 a와 메소드.() 를 동적 바인딩한것이다 (따로 참조 해야만 정의가능)

정적 바인딩 : 해당 변수에 변수와 관련된 값을 저장하는 것 (stack 에 저장됨)
ex) int data = 5;

동적바인딩 : 참조변수 또는 포인터로 힙영역의 객체를 연결시켜주는 것 (stack 에 변수를 저장, heap 으로 참조)
ex) Object ob = new Object();


메모리 할당


컴퓨터를 사용한다는 것은 컴퓨터 내의 메모리 공간을 이용하여 프로그램을 실행시키는 것이다
프로그램의 여러 변수나 함수등을 메모리에 넣고 빼고 하며 효율적으로 작업하는데 보다 메모리는 한정되어있으므로
효율적인 메모리 사용방법으로 컴퓨터는 정적 메모리 할당과 동적 메모리 할당 이라는 방식을 사용한다

결론부터 말하자면

정적 메모리 할당은 기본지식 (= stack만 사용)
동적 메모리 할당은 암산 또는 검색결과 (= heap 도 사용)

로의 비유로 이해할 수 있다

이게 무슨 소리인지는 아래에서 둘을 자세히 보며 말하려고 한다


정적 메모리 할당, 동적 메모리 할당


정적 메모리 할당이란 런타임(=실행) 전인 컴파일 할때

이미 사용할 메모리 할당 값을 결정하는 것을 말한다

컴파일은 간단히 말해 실행전 실행하기위해 코드를 기계어로 바꾸는 과정을 말한다

변수가 이미 그 값과 함께 쓰여있어서 다른 걸 참고할 필요없이 컴퓨터가 기계어 번역 그대로 모든 걸 이해할수있는걸 말한다

위에서 정적 메모리 할당은 상식이라 비유하였는데

굳이 생각(=계산, 연산)을 안해도 머리 속 상식 공간(=메모리 공간 중 스택 영역)에

그 것(=변수)을 무엇인지를 나타내는 모든 것이 들어있기 때문이다

내가 무언가(=변수)를 보면 그 무언가는 내 눈에 그대로 들어와 뇌에서 인식한다(=컴파일 하여 실행된다)

우리는 그 무언가가 무엇인지를 판단하게 되는데

우리의 기본지식(=stack)에 그 무엇인가가 적혀있거나 그 자체로 값을 설명가능하면(=stack에 변수 선언과 함께 초기화)

굳이 생각이라는 내 머리 속 깊은 부분에서 찾고 계산하지 않아도 그 답을 말할수 있고 그대로 번역해도 이해시킬수 있다

a는 정수 10 이다  ----(코딩)---->   a = int 10  ----(컴파일링)---->    컴퓨터 : 알았어!

우리가 필요한 변수를 초기화하였고 데이터 타입까지 적어놓아서 추가적 정보없이 컴파일 후 컴퓨터가 바로 이해가능하다

예시를 다르게 바꿔보자

b는 우리집 가족의 수와 같다  ->  b = 우리집 가족의 수  ->  컴퓨터 : 우리집 가족 수가 몇인데? 데이터 타입은 뭐고?

우리집 가족의 수는 컴퓨터 입장에서 모르는 변수로서 그게 숫자인지 문자열인지, 만약 숫자라면 int 인지 double 인지 등등

우리집 가족의 수라는 추상적인 변수에 대해서 모르기 때문에 우리집 가족의 수라는 추가적인 정보를 줘야만

컴퓨터가 이해가능(=실행가능)하다

우리집 가족의 수라는 변수의 값은 바로 그 값을 모르고(=stack 에 없고) 내가 생각(= heap 에서 찾거나 계산)을 해야 알수있는 값이다

가족의 수를 구하는 방법(우리집)  //  가족의 수를 구하는 방법() 함수에 인자값으로 우리집 을 넣어 얻은 값 이라고 할수잇다

즉, 위의 b 를 구하는 방법을 코딩하면 아래와 같다

b는 우리집 가족의 수와 같다  ----(코딩)---->   b = 가족의 수를 구하는 방법(우리집)

가족의 수를 구하는 방법() 함수를 가져와 실행해야만 그 결과 값이 정해지므로

함수라는 작은 프로그램을 실행 후에야( = runtime 후에야) b의 변수값을 알 수 있다 는 것이다

즉, runtime 후에야 제대로 변수의 값과 데이터 타입이 나오니

할당되는 메모리 값도 정해져있지 않다(= 동적이다)

이처럼 코딩 시 함수나 다른 것을 가리키는 참조값을 사용한 방법을 사용하는 것을

동적 메모리 할당 이라 한다


정적 메모리 할당의 경우 필요한 최대 메모리 할당값이 정해져서 부족하진 않아 에러는 나지 않지만
메모리를 항상 최대로 쓰는것이 아니므로 메모리 사용에 있어서 효율적이지는 못하다

동적 메모리 할당의 경우 그때 그때 실행시에 데이터에 맞게 메모리 할당값이 정해져서 메모리 사용에 있어서 효율적이지만 실행전까진 메모리 사용 값을 모르므로 사용가능한 메모리가 부족하여 에러나 문제가 생길 수 있다는 단점이 있다

'개발 노트 > 기초 지식' 카테고리의 다른 글

객체 지향 프로그래밍 OOP  (0) 2022.04.30
[java] 메모리 영역  (0) 2022.04.30
[java] printf() , println(), 서식지정자  (0) 2022.04.26
[java] final  (0) 2022.04.25
[java] abstract  (0) 2022.04.25

댓글