본문 바로가기

프로그래밍 언어/JAVA

JAVA 입문 - 클래스와 인스턴스

지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 메서드

 

클래스 사용과 main( ) 함수

더보기

지난 시간에 만든 클래스를 살펴보자.

Person 클래스는 멤버 변수와 메서드로 구성되어 있다. 멤버 변수는 클래스 속성을 나타내고,

메서드는 멤버 변수를 이용하여 클래스 기능을 구현한다. 

이제 이 클래스를 직접 사용해서 결과 값을 출력해 보자.

 

프로그램을 시작하는 main( ) 함수

클래스를 사용하여 프로그램을 실행하려면 우선 main( ) 함수를 알아야 한다.

main( ) 함수는 JAVA 가상 머신(Java Virtual Machine;JVM)이 프로그램을 시작하기 위해 호출하는

함수이다. 클래스 내부에서 만들지만, 클래스의 메서드는 아니다.

main( ) 함수에서 클래스를 사용하는 방법은 두 가지가 있다. 

하나는 우리가 만든 클래스 내부에 main( ) 함수를 만드는 것이고, 다른 하나는 외부에 테스트용으로

만들어 사용하는 것이다. 우선 지금까지 만든 PersonEx 클래스에 main( ) 함수를 넣어보자.

 

PersonEx 클래스에 main( ) 함수 포함하기

출력 결과

위처럼 클래스 내부에 main( ) 함수를 만들면 이 클래스가 프로그램의 시작 클래스가 된다.

클래스가 제대로 수행하는지 알아보기 위해서 이렇게 클래스 내부에 main( ) 함수를 만들고 실행할 수 있다.

main( ) 함수 내부에서 16행은 새로운 PersonEx 클래스를 생성하는 코드이고, 17행은 클래스의 멤버 변수에

값을 대입하는 코드이다. 

 

main( ) 함수를 포함한 실행 클래스 따로 만들기

만약 모든 클래스를 위와 같은 식으로 테스트 수행을 하면 거의 모든 클래스가 main( ) 함수가 포함되야 한다.

그래서 클래스 내부에 main( ) 함수를 만들지 않고 밑과 같이 테스트용 클래스를 따로 만들어 실행하는 방식이 있다.

사진처럼 클래스 이름을 PersonTest라 하고, 클래스를 실행하려면 main( ) 함수가 있어야 하므로

public static void main(String[ ] args) 항목을 체크한다. main( ) 함수가 포함된 클래스부터 프로그램이

시작하므로 PersonTest 클래스 내부에 Person 클래스를 만들어 실행해보자.

// TODO 주석을 지우고 실행하려는 코드를 작성하면 된다. 

main( ) 함수에 다음과 같이 Pesron 클래스를 생성하는 코드를 구현한다.

위의 PersonEx 클래스와 PersonTest 클래스는 같은 패키지에 속해 있기에 이렇게 작성해도

문제가 없지만, 만약 패키지가 다른 경우에는 import문을 사용해서 함께 사용하려는 클래스를 

불러와야 한다. 

 

new 예약어로 클래스 생성하기

더보기

클래스를 사용하려면 클래스를 먼저 생성해야 한다.

클래스를 생성하는 코드는 밑과 같다.

클래스형 변수이름 = new 생산자;
더보기

JAVA에서 클래스를 생성할 때는 new 예약어를 사용하고 이어서 생산자를 써준다.

클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.

클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간(힙 메모리)을 할당 받는다는 뜻이다.

이렇게 실제로 사용할 수 있도록 생성된 클래스를 '인스턴스'라고 한다. 

그리고 인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 한다.

위 사진에서 PersonEx 클래스 자료형으로 변수 personChoi를 선언하고 new PersonEx( );로

PersonEx 클래스를 생성하여 personChoi에 대입한다는 뜻이다.

이 때, personChoi를 참조 변수라 하고 이 변수가 생성된 인스턴스를 가리킨다.

 

인스턴스와 참조 변수

더보기

객체, 클래스, 인스턴스

객체란 '의사나 행위가 미치는 대상'이며 이를 코드로 구현한 것이 클래스이다.

그리고 클래스가 메모리 공간(힙 메모리)에 생성된 상태를 인스턴스라 했다. 

또, 생성된 클래스의 인스턴스를 객체라고도 한다. 

클래스의 생성자를 호출하면 인스턴스가 만들어진다. 클래스는 하나이지만, 우리는 이 클래스로부터

여러 개의 각각 다른 인스턴스를 생성할 수 있다.

 

인스턴스 여러 개 생성하기

인스턴스를 하나 더 생성해서 또 다른 사람을 만들어보자.

출력 결과

이처럼 생성자를 두 번 사용해서 서로 다른 변수 이름으로 클래스(인스턴스)를 두 개 생성했다.

 

참조 변수 사용하기

참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있다.

이 때 사용하는것이 도트(.) 연산자이다. 밑 사진은 personChoi 참조 변수로 personName 멤버 변수에

이름을 저장하고 gerPersonName( ) 메서드를 사용하는 코드이다.

 

인스턴스와 힙 메모리

더보기

인스턴스가 생성되는 과정은 다음과 같다. new PersonEx( )를 선언하면 PersonEx 하나가 생성되는데,

각 PersonEx는 PersonName, height 등의 멤버 변수를 갖고 있다.

그런데 이들 변수를 저장할 공간이 있어야 하는데, 이때 사용하는 메모리가 힙 메모리(heap memory)이다.

클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성되는 것이다.

사진처럼 생성된 클래스를 personChoi 변수에 대입하면, 인스턴스가 저장된 메모리를 

personChoi 변수가 가리킨다. pesonChoi 변수는지역 변수이다. 지난 글에서 배웠든, 지역 변수는

스택 메모리에 생성된다. 그리고 인스턴스는 힙 메모리에 생성된다. 

지역 변수 personChoi에 생성된 인스턴스를 대입한다는 것은 personChoi에 인스턴스가 생성된

힙 메모리의 주소를 대입한다는 것과 같은 의미다.

클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지한다.

다시 말하면 멤버 변수를 저장하는 공간이 매번 따로 생긴다는 것이다. 

이런 이유 때문에 클래스에 선언한 멤버 변수를 다른 말로 '인스턴스 변수'라고도 한다.

 

참조 변수와 참조 값

참조 변수는 힙 메모리에 생성된 인스턴스를 가리킨다고 했다. 

실제로 참조 변수에 들어있는 내용을 출력해보자.

출력 결과

힙 메모리에 생성된 인스턴스의 메모리 주소는 참조 변수에 저장된다. 

출력 내용을 보면 '클래스 이름 @ 주소 값'이다. 

여기에 나오는 주소 값은 다른 말로 해시코드(hash code)값이라고도 한다.

이 값은 JAVA 가상 머신에서 객체가 생성되었을 때 생성된 객체에 할당하는 가상 주소 값이다.

따라서 personChoi 변수를 사용하여 personChoi 인스턴스를 참조할 수 있다.

이 때personChoi를 참조 변수, 주소 값을 참조 값이라고 한다.

 

객체 지향 프로그래밍을 위한 용어

 

 

참고 서적: 자바 프로그래밍 입문 - 박은종