클래스(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)을 통해 구현할 수 있다.
객체의 구체적인 동작을 감추고 필요한 부분만 외부에 제공하는 개념이다. 인터페이스나 추상 클래스를 통해 구현할 수 있다.