클래스(Class)는 객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 객체를 정의하는 청사진(설계도)이다. 클래스는 속성(필드)과 행동(메서드)을 하나의 단위로 묶어 새로운 데이터 타입을 정의한다. 이 클래스에서 생성된 객체는 클래스에서 정의한 속성과 행동을 갖게 된다.
Java에서 클래스는 class
키워드를 사용하여 정의된다. 클래스는 속성(필드)과 행동(메서드)을 정의하고, 이 클래스로부터 여러 개의 객체를 만들 수 있다.
public class Person {
// 필드 (속성)
String name;
int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 메서드 (행동)
public void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
}
introduce()
라는 행동을 정의함.클래스는 설계도에 불과하므로 실제로 사용할 객체를 생성해야 한다. 객체는 new
키워드를 사용하여 생성된다.
public class Main {
public static void main(String[] args) {
// Person 클래스의 객체 생성
Person person1 = new Person("Alice", 30);
Person person2 = new Person("Bob", 25);
// 메서드 호출
person1.introduce(); // My name is Alice and I am 30 years old.
person2.introduce(); // My name is Bob and I am 25 years old.
}
}
person1
과 person2
는 각각 Person
클래스에서 생성된 객체임. introduce()
메서드를 호출하면 각 객체의 상태에 따라 다르게 동작함.객체 참조는 변수가 메모리의 객체를 가리키는 방식이다. 객체는 메모리(힙 영역)에 저장되고, 이를 참조하는 변수가 해당 객체를 가리킨다. Java에서는 모든 객체는 참조 타입 변수를 통해 접근한다.
public class Car {
String model;
public Car(String model) {
this.model = model;
}
public void showModel() {
System.out.println("Car model: " + model);
}
public static void main(String[] args) {
// 객체 생성 및 참조
Car myCar = new Car("Tesla");
// 참조 변수를 통해 객체의 메서드 호출
myCar.showModel(); // Car model: Tesla
// 또 다른 참조 변수로 동일 객체 참조
Car anotherCar = myCar;
anotherCar.showModel(); // Car model: Tesla
// 참조 변수와 객체의 관계
anotherCar.model = "BMW";
myCar.showModel(); // Car model: BMW (같은 객체를 참조하므로 내용 변경 반영)
}
}
myCar
와 anotherCar
는 같은 객체를 참조하고 있음.anotherCar.model
을 변경하면 myCar
로 참조한 객체도 변하게 됨.예를 들어, Person
이라는 클래스는 "사람"을 정의한 것이고, person1
과 person2
는 각각 그 클래스에서 만들어진 실제 "사람" 객체이다.
필드와 메서드를 하나로 묶어 외부에서 필드에 직접 접근하지 못하게 하고, 메서드를 통해서만 필드에 접근하도록 하는 개념이다. 주로 private
접근 제어자를 사용하여 구현한다.
public class Person {
private String name;
private int age;
// Getter 메서드
public String getName() {
return name;
}
// Setter 메서드
public void setName(String name) {
this.name = name;
}
}
기존 클래스(부모 클래스, 상위 클래스)의 속성과 메서드를 자식 클래스(하위 클래스)가 물려받아 사용하는 것으로 재사용하는 개념이다. 상속을 통해 코드의 재사용성과 확장성을 높일 수 있다. Java에서는 extends
키워드를 사용하여 상속을 구현한다.
public class Employee extends Person {
private String company;
public Employee(String name, int age, String company) {
super(name, age); // 부모 클래스 생성자 호출
this.company = company;
}
public void work() {
System.out.println(name + " works at " + company);
}
}
// 부모 클래스
class Animal {
String name;
public void eat() {
System.out.println(name + " is eating.");
}
}
// 자식 클래스 (Animal 클래스를 상속받음)
class Dog extends Animal {
public void bark() {
System.out.println(name + " is barking.");
}
}
public class InheritanceExample {
public static void main(String[] args) {
// Dog 객체 생성
Dog myDog = new Dog();
myDog.name = "Buddy";
// 부모 클래스의 메서드 사용
myDog.eat(); // Buddy is eating.
// 자식 클래스의 메서드 사용
myDog.bark(); // Buddy is barking.
}
}
Dog
클래스는 Animal
클래스를 상속받아 Animal
의 속성인 name
과 메서드 eat()
을 물려받음.Dog
클래스는 추가적으로 bark()
라는 메서드를 정의해 자신만의 기능을 추가함.같은 이름의 메서드를 다양한 방식으로 동작하도록 하는 개념이다. 오버라이딩(Overriding)과 오버로딩(Overloading)을 통해 구현할 수 있다.
객체의 구체적인 동작을 감추고 필요한 부분만 외부에 제공하는 개념이다. 인터페이스나 추상 클래스를 통해 구현할 수 있다.