클래스와 객체를 비유를 들어 설명하기 전에 개발자를 비유해보자면 마법 학교의 이사장이라고 보면 된다. 이사장은 학교의 구조를 설계하고, 어떤 교관을 뽑을지, 어떤 학생을 받아들일지 결정한다. 개발자는 마법 학교의 이사장처럼 코드의 전체적인 흐름을 관리하고, 필요한 부분에 적절한 기능을 할당하며 프로그램을 운영하는 역할을 한다.
클래스란 마법 학교라고 생각하면 된다. 이 클래스라는 마법 학교에서 마법 교관을 고용하고 마법 훈련생들이 교육을 받는다. 클래스는 어떤 특정한 것의 설계도나 틀이라고 볼 수 있다. 즉, 마법 학교(클래스)는 마법을 가르칠 수 있는 교관과 그것을 배울 수 있는 학생을 합격시키는(생성하는)설계도이다.
참고) 클래스란 객체를 정의해놓은 것이다. 클래스를 정의한다는 것은 객체를 정의한다는 것이다. 그렇다고 클래스와 객체가 같은 것이 아니고 클래스는 빵을 만들 때 사용하는 틀 같은 것이라고 생각하면 되며 객체는 빵이라고 생각하면 된다.
객체란 마법 학생들을 가르치는 마법 교관이다. 객체는 클래스에서 생성된 실체를 말한다. 마법 학교(클래스)에서 실제로 고용한(생성된) 교관 한 명, 또는 학생 한명이 바로 객체라고 볼 수 있다. 즉, 교관 객체는 마법을 가르치는 역할을 가지고, 학생 객체는 그 마법을 배우는 역할을 가지는 것이다.
자바에서 객체 생성과 호출을 이해하기 위해, 마법 학교에서 교관과 학생이 임무를 수행하고 보수를 받는 상황을 생각해보자.
먼저, 교관과 학생을 불러야 한다. 이를 위해 자바에서는 'new'라는 키워드를 사용해 교관과 학생을 마법 학교에 부른다. 예를 들어, 'Teacher'라는 클래스에서 'ProfessorSnape'라는 객체를, 'Student'라는 클래스에서 'Harry'라는 객체를 생성한다고 생각해보자.
Teacher ProfessorSnape = new Teacher();
Student Harry = new Student();
이제 교관과 학생이 마법 학교에 들어왔다. 이것이 객체를 생성하는 과정이다.
교관과 학생이 임무를 수행해야 한다. 이를 위해 자바에서는 '.'(점)을 사용해 객체의 메소드를 호출한다. 예를 들어, 교관인 ProfessorSnape가 Harry에게 'teachMagic'라는 임무를 수행하라고하면, 다음과 같이 작성할 수 있다.
ProfessorSnape.teachMagic(Harry);
이렇게 작성하면, 'ProfessorSnape' 교관이 'Harry' 학생에게 'teachMagic'라는 임무를 수행하는 것이다. 이것이 바로 객체 호출이다.
마지막으로, 교관과 학생이 임무를 수행한 후 보수를 받는다. 이 보수는 메소드가 반환하는 값이 될 수 있다. 예를 들어, Harry가 'learnMagic'라는 임무를 수행하고 'success'라는 보수를 받는다면, 다음과 같이 작성할 수 있다.
String result = Harry.learnMagic();
이렇게 작성하면, 'Harry' 학생이 'learnMagic'라는 임무를 수행하고 그 결과로 'success'라는 보수를 받다.
이처럼, 자바에서 객체를 생성하는 것은 클래스의 설계도를 가지고 실제 객체를 만드는 과정이고, 객체를 호출하는 것은 그 객체가 가지고 있는 기능(메소드)을 실행하고 그 결과를 받는 것이다.
객체를 사용하는 이유를 마법 학교, 마법 교관, 학생을 가지고 설명해보겠다. 마법 학교에는 여러 교관들과 학생들이 있다. 그리고 각각의 교관과 학생은 다른 마법을 가르치고 배운다. 예를 들어, 한 교관은 불을 다루는 마법을 가르치고, 다른 교관은 물을 다루는 마법을 가르친다. 학생들도 마찬가지로 각자가 잘하는 마법이 다르다.
교관들이 각 학생들에게 딱 맞는 마법을 가르쳐주면 학생들은 더 빠르고 쉽게 마법을 배울 수 있다. 예를 들어, 불 마법에 재능이 있는 학생에게는 불 마법을, 물 마법에 재능이 있는 학생에게는 물 마법을 가르쳐주는 거다.
이렇게 각 학생들에게 딱 맞는 마법을 가르쳐주면 마법 학교 전체의 효율성이 높아진다. 왜냐하면 교관들은 자신의 전문 분야에서 최고의 가르침을 제공할 수 있고, 학생들은 자신의 재능과 흥미에 따라 최고의 학습 효과를 낼 수 있기 때문이다.
객체 지향 프로그래밍에서도 이와 비슷하게 객체를 사용하면 효율성이 높아진다. 각 객체는 자신만의 속성과 메소드를 가지고 있고, 이를 통해 특정 작업을 수행한다. 이렇게 객체마다 자기가 할 일이 정해져 있으면, 프로그램 전체가 더 효율적으로 동작하게 됩다.