
클래스는 객체를 생성하기 위한 설계도이며, 틀 또는 청사진에 해당한다. 현실 세계의 사물이나 개념을 프로그래밍으로 표현할 때, 특정 대상의 특징과 행동을 하나의 구조로 정의한다.
클래스는 크게 두 가지 요소로 구성된다.
예를 들어 자동차를 클래스로 만든다면, 색상이나 속도 같은 속성과 주행, 정지 같은 동작을 코드로 표현할 수 있다.
클래스를 설계도라고 가정하면, 해당 설계도를 기반으로 실제 생성된 실체를 객체라고 한다.
Object와 Instance는 국내 학습 환경에서는 거의 같은 의미로 사용된다. 다만 개념적으로는 다음과 같은 차이가 있다.
비유로 정리하면 다음과 같다.
클래스는 필드와 메서드로 구성된다. 아래 예제는 학생 정보를 표현하는 간단한 클래스이다.
public class ClassA {
// 필드 (속성)
int num;
String name;
double score;
// 메서드 (행위)
public void callName() {
System.out.println(name + "을 부릅니다.");
}
}
클래스를 사용하려면 먼저 객체를 생성해야 한다. 객체는 new 키워드를 사용하여 생성한다.
public class ClassAMain {
public static void main(String[] args) {
ClassA classA1 = new ClassA();
classA1.num = 1;
classA1.name = "홍길동";
classA1.score = 4.5;
System.out.println(classA1.name + " 학생의 학번은 "
+ classA1.num + "번이고, 점수는 "
+ classA1.score + "점입니다.");
classA1.callName();
}
}
같은 클래스를 사용하더라도, 각 객체는 서로 다른 값을 가질 수 있다.
ClassA classA2 = new ClassA();
classA2.num = 100;
classA2.name = "홍길동";
classA2.score = 2.0;
System.out.println(classA2.num + "번 학생의 이름은 "
+ classA2.name + "이고, 점수는 "
+ classA2.score + "점입니다.");
classA2.name = "홍길서";
classA2.callName();
생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드이다. 객체 생성과 동시에 필드를 초기화하는 역할을 담당한다.
객체 생성 코드에서 new 클래스명() 부분이 생성자 호출에 해당한다.
생성자는 매개변수의 유무에 따라 두 가지로 나뉜다.
public class Constructor {
int num;
String name;
// 기본 생성자
public Constructor() {
System.out.println("기본 생성자 호출");
}
// 매개변수 생성자
public Constructor(int num) {
this.num = num;
}
public Constructor(String name) {
this.name = name;
}
public Constructor(int num, String name) {
this.num = num;
this.name = name;
}
}
public class ConstructorMain {
public static void main(String[] args) {
Constructor c1 = new Constructor();
Constructor c2 = new Constructor(10);
System.out.println(c2.num);
}
}
this 키워드는 현재 생성되는 객체 자신을 의미하며, 필드와 매개변수 이름이 같을 때 이를 구분하기 위해 사용된다.
클래스를 활용하면 같은 구조를 가진 객체를 여러 개 생성하고, 각각 다른 상태와 동작을 수행하도록 만들 수 있다.
public class Car {
String color;
int speed;
public void drive() {
System.out.println(color + " 자동차가 주행 중입니다.");
}
public void brake() {
System.out.println(color + " 자동차가 멈췄습니다.");
}
public void displayInfo() {
System.out.println("이 차의 색깔은 " + color + "색이고,");
System.out.println("최고 속도는 " + speed + "km/h입니다.");
}
}
public class CarMain {
public static void main(String[] args) {
Car myCar = new Car();
Car yourCar = new Car();
myCar.color = "빨강";
myCar.speed = 160;
yourCar.color = "노랑";
yourCar.speed = 180;
myCar.drive();
myCar.displayInfo();
yourCar.brake();
yourCar.displayInfo();
}
}
클래스는 단순히 변수를 묶는 문법이 아니라, 데이터와 동작을 함께 관리하기 위한 구조라는 점이 인상적이었다.
객체를 여러 개 생성하면 같은 구조를 공유하면서도 각각 독립적인 상태를 유지할 수 있다는 점이 명확해졌다.
생성자를 사용하면 객체 생성과 동시에 초기화를 수행할 수 있어 코드의 의도가 훨씬 분명해진다는 것도 이해할 수 있었다.