Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 클래스와 객체 완벽 가이드 – 개념부터 실전 예제까지

자바에서 말하는 '클래스'란 무엇일까요? 학교에서 학생과 선생님이 함께 모이는 그런 수업 공간을 의미하는 것이 아닙니다. 프로그래밍에서 클래스란 코드 속 객체를 만들기 위한 설계도를 뜻합니다.

자바는 객체 지향 프로그래밍(Object-Oriented Programming) 언어입니다. 즉, 재사용 가능한 코드를 작성하는 데 도움이 되는 다양한 기능을 제공한다는 의미입니다. 객체 지향 프로그래밍은 코드의 중복을 줄여주고 그만큼 가독성을 높여주기 때문에, 프로그램의 규모와 상관없이 모든 프로젝트에서 유용하게 활용됩니다.

이 글에서는 자바의 두 가지 핵심 개념인 클래스객체를 다룹니다. 두 개념이 어떻게 동작하는지, 그리고 예제를 통해 실제로 어떻게 구현할 수 있는지 차근차근 살펴보겠습니다.

자바 클래스란 무엇일까요?

클래스는 객체를 위한 일종의 설계도입니다. 침실 설계도에 어떤 종류의 문과 창문을 설치할지 명시하듯이, 클래스는 프로그램에게 객체가 어떤 메서드와 값에 접근하고 저장할 수 있어야 하는지 알려줍니다.

클래스가 유용한 이유는 특정 데이터 구조를 단 한 번만 선언해두면, 객체를 선언하는 방식으로 여러 번 참조하여 재사용할 수 있기 때문입니다.

변수 하나와 메서드 두 개를 가진 Employee라는 클래스를 정의해 보겠습니다:

public class Employee {
	boolean isOnVacation;

	public void startVacation() {
		isOnVacation = true;
		System.out.println("You are now on vacation.");
	}

	public void endVacation() {
		isOnVacation = false;
		System.out.println("You are not on vacation anymore.");
	}
}

위 코드에서는 직원의 휴가를 시작하는 메서드와 휴가를 종료하는 메서드, 총 두 개의 메서드를 정의했습니다. 또한 이 정보를 추적하기 위해 isOnVacation이라는 boolean 인스턴스 변수를 선언했습니다.

아직 Employee 클래스의 객체는 생성하지 않았다는 점에 주목하세요. 지금은 앞으로 객체가 어떤 형태로 만들어질지를 정의하는 설계도만 마련해둔 상태입니다.

자바 객체란 무엇일까요?

객체(Object)는 특정 클래스의 인스턴스입니다. 앞서 만든 Employee 설계도를 바탕으로 실제 객체를 생성해 보겠습니다. john이라는 이름의 객체를 만들어 보겠습니다:

Employee john = new Employee();

이 코드는 Employee 클래스의 인스턴스를 생성합니다. 클래스 이름 뒤에 붙은 괄호는 해당 클래스를 참조하도록 지시하는 역할을 하며, new 키워드는 그 클래스의 새로운 객체를 생성하라는 의미입니다.

이제 생성한 객체의 메서드를 사용해 보겠습니다:

Employee john = new Employee();
john.startVacation();
john.endVacation();

프로그램을 실행하면 다음과 같은 결과가 출력됩니다:

You are now on vacation.
You are not on vacation anymore.

객체가 Employee 클래스에서 정의한 두 메서드를 호출하면서, 해당 메서드 내부의 코드가 실행됩니다. 예를 들어 john.startVacation()을 실행하면 isOnVacation 변수의 값이 true로 설정되고, "You are now on vacation."이라는 메시지가 자바 콘솔에 출력됩니다.

흥미로운 점은 isOnVacation 변수가 클래스 내부에서 정의되었음에도, 특정 객체에 할당된 값을 외부에서 조회할 수 있다는 것입니다. 다음 코드를 살펴보세요:

Employee john = new Employee();
john.startVacation();
john.endVacation();
System.out.println(john.isOnVacation);

이 코드는 지난 예제처럼 John의 휴가를 시작하고 종료한 후, isOnVacation 변수의 값을 콘솔에 출력합니다:

You are now on vacation.
You are not on vacation anymore.
false

isOnVacation 변수의 최종 값은 false입니다.

자바 생성자(Constructor)

생성자 메서드를 사용하면 클래스의 데이터를 초기화할 수 있습니다. 앞선 예제에서는 클래스 본문에 변수를 선언했지만, 별도의 기본값으로 초기화하지 않았습니다.

다음 코드를 살펴보겠습니다:

class Employee {
	boolean isOnVacation;

	public Employee() {
		isOnVacation = false;
		System.out.println("Initialized values.");
	}

	...
}

이제 Employee 클래스의 객체를 생성해 보겠습니다:

Employee john = new Employee();
john.startVacation();

john 객체를 생성하는 순간 생성자가 자동으로 실행됩니다. 생성자를 활용하면 클래스가 처음부터 가져야 할 기본값을 손쉽게 설정할 수 있습니다. 실행 결과는 다음과 같습니다:

Initialized values.
You are now on vacation.

객체가 생성되는 순간 생성자가 isOnVacation 값을 false로 설정하고, 콘솔에 "Initialized values"를 출력합니다.

여러 객체 생성하기

그렇다면 직원이 두 명이라면 어떨까요? 같은 클래스를 계속 사용할 수 있을까요? 물론입니다! 클래스 사용의 가장 큰 장점이 바로 여기에 있습니다. 하나의 클래스로 얼마든지 여러 객체를 선언할 수 있습니다.

다음 메인 프로그램을 살펴보겠습니다:

Employee john = new Employee();
john.startVacation();
john.endVacation();
System.out.println(john.isOnVacation);

Employee ian = new Employee();
ian.startVacation();
System.out.println(ian.isOnVacation);

코드를 실행하면 다음과 같은 결과가 나옵니다:

Initialized values.
You are now on vacation.
You are not on vacation anymore.
false
  
Initialized values.
You are now on vacation.
true

Employee 클래스의 두 객체 johnian을 생성했습니다. 코드에서는 먼저 John의 휴가를 시작하고 종료했습니다. 이후 Ian을 위한 객체를 새로 만들고 그의 휴가를 시작했습니다.

john.isOnVacation의 값을 출력하면 false가 반환되지만, Ian의 객체에 대해 같은 작업을 수행하면 true가 반환됩니다. 그 이유는 클래스의 각 객체가 서로 독립적으로 존재하기 때문입니다. 모든 객체가 같은 설계도를 공유하지만, 각자 자신만의 고유한 값을 저장할 수 있습니다.

마무리

클래스와 객체는 객체 지향 프로그래밍의 초석입니다. 클래스를 통해 설계도를 정의하고, 그 설계도를 바탕으로 필요한 만큼 객체를 만들어 활용할 수 있습니다.

실력을 점검할 도전 과제를 준비했습니다. 학생의 시험 통과 여부를 관리하는 클래스를 활용한 프로그램을 직접 만들어 보세요. 프로그램은 다음 요구사항을 충족해야 합니다:

  • 학생의 시험 통과 여부를 저장하는 변수 포함하기
  • 학생의 시험 통과 여부를 변경하는 두 개의 메서드 구현하기
  • (선택) if 문을 활용해 숫자 성적을 기준으로 시험의 합격/불합격 여부를 자동 판단하는 로직 추가하기

이제 여러분도 전문가처럼 자바의 클래스와 객체를 자유롭게 다룰 준비가 되었습니다. 직접 코드를 작성하며 배운 내용을 익혀보세요!