본문 바로가기

IT/자바 Java

[Java 기초] #4. 클래스, 오브젝트, 메서드

반응형

클래스


클래스의 정의: 클래스는 오브젝트의 형식을 정의하는 템플릿입니다. 클래스는 데이터와 테이터에서 작동하는 코드를 모두 정의합니다.

오브젝트는 클래스의 인스턴스입니다. (뒤에서 설명하겠지만, new 키워드로 클래스의 컨스트럭터를 호출하면 오브젝트가 생성됩니다)

클래스는 논리적 추상화입니다. 즉 클래스는 오브젝트로 구체화 되기 전까지는 실재하는 존재가 아니라고 할 수 있습니다.


"자동차" 에 대한 클래스를 아래처럼 정의해 봅니다.

클래스의 정의는 새로운 데이터 타입을 생성합니다. 위 예에서는 Vehicle이라는 데이터 타입을 새로 생성하였습니다.

클래스의 정의를 통해 생성한 테이터 타입에 해당하는 오브젝트를 실제로 생성하기 위해서는 new 키워드를 사용합니다.


그리고 오브젝트 내의 멤버들을 억세스하기 위해서는 마침표(.) 을 이용합니다. (dot operator)

object.member


Vehicle minivan = new Vehicle();
위 라인은 아래처럼 두 개의 라인으로 분리할 수 있습니다.

Vehicle minivan;
minivan = new Vehicle();

첫 번째 라인에서는 Vehicle이라는 데이터타입 (클래스에서 정의된) 의 minivan이라는 레퍼런스를 선언합니다.

두 번재 라인의 Vehicle()은 Vehicle 클래스의 컨스트럭터를 의미합니다. (컨스트럭터에 대해서는 다음에 다시 설명합니다)


primitive type 과 object type에서 변수에 값을 할당할 때의 상황이 다릅니다. primitive type의 경우는 우측의 literal이 좌측의 변수에 값으로 저장되지만 object typed의 경우는 값이 아닌 오브젝트 자체에 대한 reference를 저장하게 됩니다.

즉,

Vehicle car1 = new Vehicle();
Vehicle car2 = car1;

에서 car1과 car2는 같은 오브젝트를 가리킵니다.


메서드 Method

메서드는 클래스에서 정의된 데이터를 조작하는 서브루틴입니다. 그리고, 그 데이터에 대한 억세스를 제공합니다.

메서드의 형식은 다음과 같습니다.


리턴타입 메서드이름(파라메터 리스트) {

// 메서드 몸체

}


메서드 내의 return 문구를 통해서 특정 값을 리턴할 수 있습니다. 리턴값이 없는 메서드는 void 타입을 가집니다.

파라메터는 메서드의 서브루틴의 계산에 사용되는 입력값입니다. 즉, 메서드라는 블랙박스는 파라메터라는 입력값을 받아서, 리턴값이라는 출력값을 내보낸다고 보면 좋을 것 같네요.


컨스트럭터 Constructors

new 구문을 이용해서 오브젝트를 생성할 때, 오브젝트의 멤버 변수들의 값은 어떻게 정의할까요?

여러 가지 방법이 있겠지만 자바는 컨스트럭터라는 효율적인 방법을 제공합니다. 컨스트럭터는 클래스와 같은 이름을 가지고, 메서드와 비슷하게 정의됩니다.

사실 프로그래머가 명시적으로 컨스트럭터를 정의하지 않아도, 자바는 기본 컨스트럭터를 제공하는데 이는 모든 멤버 변수의 값을 0, 널 혹은 false 로 초기화 시킵니다.

일반적으로 컨스트럭터는 파라메터를 이용합니다. 오브젝트 생성 시 우측의 클래스 이름 뒤에 오는 괄호 안에 파라메터가 들어가고, 그 파라메터가 컨스트럭터로 넘겨지는 구조입니다. 아래의 예제를 보면 이해가 쉽습니다.



자바의 가비지 컬렉션과 finalize() 메서드

더이상 사용하지 않는 변수 등을 메모리에서 삭제해서, 사용 가능한 메모리를 자동으로 늘려주는 기능을 자바는 제공합니다. 이를 가비지 컬렉션이라고 하는데요, 자바에서 자동으로 수행하기 때문에 사용자가 일일이 메모리를 확보하기 위한 작업을 할 필요가 없습니다.

클래스 내에 finalize()메서드를 정의해 놓으면, 그 클래스의 인스턴스(오브젝트)가 리사이클될때 (즉 해당 오브젝트에 할당된 메모리를 시스템으로 되돌릴 때) finalize() 메서드가 항상 실행됩니다.




반응형