자바 클래스, class

클래스(Class)는 자바에서 사용하는 변수와 메소드를 하나로 묶어 놓은 세트입니다.

Object, Class, Instance

세 가지 용어를 구분할 줄 안다면, 자바 세계관을 이해하는데, 매우 큰 도움이 됩니다. 하지만, 현실에서는 이 세가지를 혼용해서 사용하기도 하고, 모호한 기준으로 분류하기도 합니다. 또한, 아카데믹한 구분과 실무적인(코딩) 구분을 다르게 하기도 합니다. 저 역시도 이 세 가지 용어에 대해서 명확하게 구분할 줄 몰랐었고, 실무를 하면서, 시행착오 거쳐 이제서야 어느 정도 구분할 수 있습니다.

Object

일본식 한자로 “객체”라고 번역했기에 현재도 “객체”라는 용어로 불립니다. 객체란 객관적인 물체라는 뜻으로 Object를 이해하는데, 아무런 도움이 되지 않는 그저 일본식 번역어 일 뿐입니다.

Object 자체는 프로그램 용어라기 보다는 다소 철학적인 의미를 가지고 있습니다. Object를 이해하기 위해서는 서양식 사고를 해야 합니다. 동양의 사고체계에서는 모든 만물이 서로 연관되어 있고, 물체간 경계가 다소 모호하지만, 서양의 사고에서는 모든 만물(사물)은 경계가 뚜렷하고, 하나씩 구분, 분류할 수 있다는 사고를 합니다. 따라서 “Object = 세상만물” 또는 “Object = 사물”이라고 봐도 무방합니다.

레고

이러한 세계관을 프로그램 세계로 끌어들인 것이 바로 Object Oriented 관점입니다. 즉, 프로그램을 단지 순차적인 로직의 흐름으로만 보지 않고, 여러 개의 물체로 나누어서 조합하고, 연계하자는 개념입니다. 이런 개념은 마치 레고를 조립하는 것처럼 프로그램을 만들자는 의미와도 같습니다.

과거의 프로그램은 순차적으로 한 판에 소스코드를 전부 기입합니다.

코볼

이렇게 긴 프로그램을 만들다보면, 비슷한 로직이 다시 나오거나, 심지어 완전히 같은 코드도 다시 나오는 경우가 많은데, 절차지향 언어는 무조건 순차적으로 실행하기 때문에 이전 코드를 그대로 Copy & Paste 해서 사용합니다.

만들때는 그렇게 만들지만, 프로그램을 수정할 일이 생기면, Copy & Paste 했던 부분을 찾아서 전부 다시 수정해야 합니다. 이 과정에서 일부만 수정하고, 일부를 놓치는 경우, 프로그램에서 생각지도 못했던 오류가 발생하곤 합니다.

그래서 이러한 번거로움을 덜기 위해, 반복되는 변수와 함수를 하나의 묶음(Obejct)으로 묶어서 재사용 하자는 아이디어가 나왔습니다. 물론 이러한 중복부분을 함수(function)로만 만들자는 아이디어도 있었지만, 자바는 아이디어를 확장해서, 변수와 함수를 묶어서, 하나의 Object 즉, 하나의 사물처럼 생각하자는 개념을 만들었고, 그러한 개념을 Object Oriented 프로그래밍이라고 합니다.

Class

“Class는 Object의 설계도입니다.”라고 흔히 말합니다. 정확한 표현이지만, 쉽게 이해하기 어려운 말이지요.

  • Object = 개념(생각)
  • Class = 소스코드

이렇게 이해하는 것이 더 쉽습니다.

즉, 머리 속으로 “개”라는 것을 떠올렸다면, 아래와 같은 생각이 떠오를 겁니다.

개 {
  키;
  몸무게;
  털색깔;
  짖다();
  앉다();
  달리다();
}

이 생각을 코드로 옮기면, 그게 바로 생각을 코드로 옮긴 것이고, Object를 구성하는 설계도가 되는 셈입니다.

Class Dog {

  double height;
  double weight;
  String color;

  String bark() {
    ...
  }

  String sit() {
    ...
  }

  String run (int a) {
    ...
  }
}

보통 실무에서는 1개의 클래스는 1개의 소스코드로 만듭니다. 즉, 대게 1개의 .java 파일은 1개의 .class 파일로 컴파일됩니다. 다만, 특별한 경우에는 1개의 .java 파일이 여러 개의 .class 파일로 컴파일 되도록 하는 경우도 있습니다.

Instance

인스턴스를 클래스를 이용해서 만든 특정한 오브젝트 1개를 말합니다.

내가 그의 이름을 불러주기 전에는 그는 다만 하나의 몸짓에 지나지 않았다.

유명한 시의 한 구절처럼, 인스턴스는 클래스를 이용하여 오브젝트를 만들어 이름을 붙인 것입니다.

위에서 살펴본 “개”라는 Object는 사람의 머리 속에 있는 동물의 종류이며, Class는 그 동물을 구체적으로 만드는데 필요한 설계도라고 했습니다. 아래 코드는 그러한 개를 나만의 반려동물로 만들고, 이름을 붙이는 과정이라고 할 수 있습니다.

int speed = 3;
Dog puppy = new Dog();
Dog happy = new Dog();

puppy.bark();
happy.run(3);

이렇게 코드를 만들면, “Dog”이라는 타입으로, 퍼피와 해피라는 이름의 개를 만들고, 퍼피는 짖고, 해피는 달리게 하는 코들를 만들었습니다. 이때, 퍼피와 해피는 하나의 구체적인 형상이 되었으므로(프로그램 메모리에 올라갔으므로), 인스턴스라고 합니다.

new 라는 키워드를 이용하여 클래스를 인스턴스로 만듭니다.

실제코드

앞선 설명은 Object, Class, Instance 등을 설명하기 위해서 다소 철학적인 내용으로 코딩을 했습니다.

실무에서는 대부분 Class를 하나의 오브젝트로 간주하며,

  • Member Class
  • Book Class
  • Library Class

이런 식으로 좀 딱딱하고 사무적인 내용으로 구성됩니다.

Naming Convention

네이밍 룰(Rule)이 아니라 네이밍 컨벤션입니다. 반드시 지켜야 할 약속은 아니지만, 클래스 이름은 대문자로 시작할 것을 강력히 권고하며, 또한, 카멜(Camel) 스타일로 네이밍하는 것을 강력히 권고합니다.