brunch

You can make anything
by writing

C.S.Lewis

by 내가 사는 세상 Dec 05. 2023

기초개념 - 힙 메모리 사용 #동적할당

값형, 참조형, 포인터

 개발자가 짠 코드를 실행하기 위해선 메모리가 필요하다. 그리고 그 메모리는 RAM에 있는데, 용도에 따라 스택과 힙으로 구분된다. 우리는 힙에 메모리를 할당하여 개체를 만들어볼 것이다. 똑같은 행동을 다양한 언어(C, Java, Javascript, Python)로 구현해볼 것이다.


  다만, C언어의 경우 개체지향이라는 개념이 없기 때문에, 구조체를 활용한다. 해당 예제에서는 Java, Javascript, Python에 멤버함수가 없기 때문에 힙에서 벌어지는 일은 큰 차이가 없다.



C언어


#include <stdio.h>

#include <stdlib.h>


typedef struct {

    char name[50];

    int age;

} Person;


int main() {

    Person* person = (Person *)malloc(sizeof(Person));    // 동적으로 Person 구조체 할당

    person->name = "홍길동";

    person->age = 30;

    printf("이름: %s\n나이: %d살\n", person->name, person->age);

    free(person);    // 할당된 메모리 해제

    return 0;

}


C언어에서는 개발자가 직접 포인터를 활용해 힙 메모리를 할당 받을 수 있다. 위의 코드는 개발자가 운영체제한테

'힙 메모리에서 Person이라는 구조체 크기만큼 나한테 줘봐. 거기에 데이터 좀 넣어두게'

라고 말하는 것과 같다.




Java


public class PersonExample {

    public static void main(String[] args) {

        Person person = new Person();

        person.setName("홍길동");

        person.setAge(30);

        System.out.println("이름: " + person.getName());

        System.out.println("나이: " + person.getAge() + "살");

    }

}


class Person {

    private String name;

    private int age;


    public void setName(String name) {

        this.name = name;

    }

    public void setAge(int age) {

        this.age = age;

    }


    public String getName() {

        return name;

    }

    public int getAge() {

        return age;

    }

}


 반면 Java에서는 개발자가 직접 포인터를 사용하는 것은, 언어에서 지원하는 기능이 아니기 때문에 불가능하다. 하지만 위처럼 Java 코드를 작성해도 C언어와 똑같은 명령이 이루어진다. 컴퓨터에서 벌어지는 일은 똑같지만, 이를 시키는 언어가 다를 뿐이다. 'be quiet'라고 하든 '조용히 해라'라고 하든, 이 말을 들은 상대방은 입을 다무는 것처럼 말이다. 즉, new 키워드를 활용해 개체를 만드는 순간, 내부적으로 포인터를 활용해 힙 메모리를 사용하는 것이다.


 참고로 Java에서는 기본 자료형만 스택에 넣을 수 있다. 즉 개체는 힙 메모리에만 넣을 수 있다. 이는 기본 자료형은 값형인데 반해, 개체는 참조형(포인터형)이라는 뜻이기도 하다.


기본 자료형 :          값형         : 스택에 저장

     개체      : 참조형(포인터형) : 힙에 저장


 개체에 대해 좀 더 자세히 살펴보자. Java에서 개체를 만들기 위해 클래스를 사용하는 것은 힙메모리를 사용한다. 참조형(포인터형)이라는 말은 Person person = new Person(); 해당 코드에서 person이라는 변수에 메모리 주소가 담겨있다는 말이다. 해당 메모리로 가면 개체가 존재하며, 그 안에 '홍길동', '30살'이라는 데이터가 들어있는 것이다. 같은 곳에 있는 데이터를 가리킬(참조할) 뿐이다.



 추가적으로 C언어에서는 성능이 중요해서, 동적 메모리 할당시 초기화가 안 이루어지는 반면, Java에서는 데이터의 초기화가 이루어진다.




Javascript


class Person {

    constructor() {

        this.name = '홍길동';

        this.age = 30;

    }

}


const person = new Person();

console.log(`이름: ${person.name}\n나이: ${person.age}살`);




Python


class Person:

    def __init__(self):

        self.name = "홍길동"

        self.age = 30


person = Person()

print(f"이름: {person.name}\n나이: {person.age}살")




참고자료


POCU : COMP2500 개체지향 프로그래밍 및 설계 (Java)

매거진의 이전글 개체지향 - 시작하며
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari