자바 인스턴스 | 자바 입문강좌 10

자바 인스턴스

이번 포스팅은 다소 개념적인 내용을 다룹니다. 인스턴스니 클래스니 뭐니 그런 내용들이라 영양가가 좀 떨어질 수도 있지만 어쨋든 객체지향 프로그래밍을 하기 위해 알아야 하는 내용입니다.

프로그래밍을 하면서도 배울 수 있는데 이 부분은 개념을 함께 이해하고 코딩을 하는게 좀 더 도움이 됩니다. 자바를 할거면 어차피 나중에 디자인 패턴같은 내용도 알아야 하므로 개념정리를 차근차근 하면서 가는게 좋습니다.

자바 기초는 내용이 별로 없어서 몇개의 주요 개념을 알아두면 충분합니다.

인스턴스와 클래스

인스턴스(Instance)는 클래스(Class)와 연관지어 이해하는 개념입니다.

객체지향 프로그램에서 클래스는 한 객체의 설계도라고 했습니다. 그것이 TV가 될 수도 있고 자동차가 될 수도 있습니다.

설계도가 있어야 TV를 만들 수 있습니다. 이 설계도만 가지고 있다고 해서 제품이 저절로 만들어 지지 않습니다. 공장에 가서 설계도를 바탕으로 만들어서 출시를 해야죠.

인스턴스(instance)는 출시된 제품이라고 볼 수 있습니다.

자바-인스턴스
자바 인스턴스

인스턴스, 객체, 클래스

흔히 클래스와 인스턴스를 붕어빵틀과 붕어빵 비유도 하고 쉽게 설명하려고 합니다.

프로그래밍 적으로 보면 객체를 코드로 구현한 것이 클래스이고, 클래스의 설계를 바탕으로 메모리에 구현한(생성된) 상태를 인스턴스라고 합니다. 또한 이 인스턴스를 객체라고 합니다.

좀 헷갈리겠지만 객체라는 아이디어를 처음에 가져올때와 같습니다. 컴퓨터안에서 인스턴스는 메모리에 올라와 있는 객체입니다. 생물처럼 살아있지는 않지만 우리가 설계한 그대로의 속성과 메소드를 가지고 메모리에 태어나서 소명이 다하면 메모리에서 해제됩니다.

객체지향 프로그래밍을 만드는 이유에는 여러가지가 있겠지만 가상현실을 재현하려는 이유도 있습니다. 현실의 자동차를 클래스로 만들어서 가상현실의 레이싱 게임을 만들었습니다. 그 안의 레이싱 차량은 메모리에 생성되어 현실과 비슷한 물리 법칙을 받습니다. 그러므로 이들도 메모리 안에 객체가 되는 것입니다.

인스턴스의 개수

인스턴스의 개수에는 제한이 없습니다. 메모리와 컴퓨터 자원이 허용하는 안에서 얼마든지 늘릴 수 있습니다.

대량의 인스턴스를 사용하기 전에는 미리 계산할 필요가 있습니다. 특히나 최근 클라우드 마케팅에서는 쓴만큼 돈을 지불하는 시스템이기 때문에 무심코 서버를 내버려두었다가는 과금이 쎌 수 있습니다.

예를 들어 고객정보를 분석하기 위해서 고객 클래스를 만들었습니다. 데이터베이스에 있는 자료들을 가져와서 고객 인스턴스를 만들기 시작합니다. 이 때 인스턴스를 한 만개 정도를 만들었습니다.

그러면 고객 1인당 인스턴스의 크기 x 10000개 만큼의 메모리 공간이 필요합니다. 1인당 인스턴스 크기에 따라 큰 차이가 날 것입니다. 고객의 1명의 용량이 1메가면 거의 10기가 메모리가 필요할 것입니다.

인스턴스의 개수는 시스템 자원에 영향을 받기 때문에 데이터의 크기를 감안하여 설계 합니다.

인스턴스 생성하기

인스턴스를 생성하기 위해서는 new 예약어를 사용합니다. 자바나 C++이나 new 를 사용하지만 실제 의미는 동적 메모리 할당(Dynamic Memory Allocation) 입니다. C에서 동적 메모리할당하는 방식은 함수였습니다.

자바에서는 동적 메모리할당 + 인스턴스생성으로 그 의미가 확장되었죠.

public class Main {
    public static void main(String[] args) {
        miniPerson mp = new miniPerson();
        mp.name = "Cookie King";
        mp.showName();
    }
}
class miniPerson{
    String name;
    void showName(){
        System.out.println(name);
    }
}

new 키워드가 등장하면 힙메모리에 인스턴스가 생성되었다는 것을 알 수 있습니다.

그럼 new없이 사용하는 클래스들은 뭐냐? 라는 의문이 생길 수 있는데 그들은 static 클래스입니다. static 클래스 들은 기능상 인스턴스를 만들 필요가 없는 클래스입니다.

클래스의 인스턴스를 생성하는데 new가 필요하다는 것을 알 수 있습니다.

참조변수

인스턴스가 생성되면 힙메모리 영역에 생성됩니다.

참조변수(reference)는 이 힙메모리에 생성된 인스턴스입니다. 위에서는 mp 입니다.

mp 값을 출력해보겠습니다.

System.out.println(mp);
com.miniPerson@7ef20235

패키지.클래스이름과 일종의 주소가 나와있습니다. 이 주소값은 해시코드입니다. JVM에 해시를 주면 실제 주소로 연결됩니다. 해시코드가 가상주소라고 할 수 있죠.

헷갈리는 용어

지금쯤 용어를 정리해 가면 좋을 것 입니다.

용어내용
클래스설계도, 코드로 만든 상태
인스턴스클래스가 메모리에 생성됨
객체객체, 생성된 인스턴스
멤버변수클래스의 속성(변수)
메소드클래스이 기능구현
참조변수메모리의에 인스턴스 주소

요약

프로그래밍의 개념적인 부분도 중요합니다. 어차피 소프트웨어 개발은 사람이 하는 일이기 때문에 사람 중심으로 생각하는 사유가 객체지향 프로그래밍입니다.

그런 방법이 사람에게 유리하지만 기계에게는 유리하지 않기 때문에 자바 만능주의가 틀리다고 생각하는 사람도 꽤 있는 것 같습니다.

최근에는 OOP 를 비판하는 사람들도 종종 보입니다. 하지만 일단 한국에서는 자바를 모르면 어렵습니다. 다른 언어를 하더라도 어느정도 실력을 키워두는게 좋습니다.

외부참조문서

자바 인스턴스, 클래스, 객체 | 자바의 정석 기초편 교재추천

C++ | 클래스, 객체, 인스턴스의 차이

Leave a Comment