객체지향 프로그래밍은 현실 세계의 사물과 개념을 소프트웨어로 구현하는 방법론이다. 객체는 속성(필드)과 행위(메서드)로 구성되며, 서로 상호작용할 수 있다. 객체는 물리적인 존재뿐만 아니라 개념적인 것들도 포함한다. 자바에서 이러한 객체들은 클래스로 설계되고, 객체 간의 상호작용은 메서드를 통해 이루어진다.
클래스는 객체를 만들기 위한 설계도이다. 클래스를 정의할 때는 필드(속성), 생성자(객체 초기화), 메서드(행위)로 구성된다. 클래스 선언 이후에는 new
연산자를 사용해 객체를 생성하며, 이때 생성자가 호출되어 객체가 초기화된다.
public class Car {
String company; // 자동차 회사
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
// 기본 생성자
public Car() {}
// 생성자 오버로딩
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
// 메서드 예시
public void drive() {
System.out.println("Driving...");
}
}
상속은 부모 클래스의 필드와 메서드를 자식 클래스가 물려받아 사용하는 기능이다. 상속을 통해 코드의 재사용성을 높일 수 있으며, 자식 클래스는 부모 클래스의 기능을 확장하거나 수정할 수 있다.
다형성은 동일한 메서드 이름이 다양한 클래스에서 다양한 기능을 수행할 수 있게 하는 원리이다. 예를 들어, Animal
클래스의 sound()
메서드를 Dog
클래스와 Cat
클래스에서 각각 다르게 구현할 수 있다.
public class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("Cat meows");
}
}
캡슐화는 객체의 속성(필드)와 행위(메서드)를 하나로 묶어 외부에서 객체 내부의 세부 내용을 알지 못하도록 하는 것을 의미한다. 이를 통해 객체의 무결성을 유지하고, 잘못된 데이터 접근을 방지할 수 있다.
public
: 모든 클래스에서 접근 가능protected
: 같은 패키지 내에서, 또는 자식 클래스에서 접근 가능default
(아무것도 지정하지 않은 경우): 같은 패키지 내에서만 접근 가능private
: 같은 클래스 내에서만 접근 가능생성자는 객체가 생성될 때 호출되며, 객체의 초기화를 담당한다. 생성자 오버로딩을 통해 다양한 초기화 방법을 제공할 수 있다.
this
는 현재 객체 자신의 참조를 나타내며, 주로 필드와 매개변수의 이름이 충돌할 때 사용된다. this()
는 다른 생성자를 호출할 때 사용되며, 코드 중복을 줄이는 데 유용하다.
public class Car {
String model;
String color;
double price;
public Car(String model) {
this(model, "Black", 50000000); // 다른 생성자 호출
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
}
인터페이스는 클래스가 구현해야 하는 메서드들을 정의한 것으로, 다중 상속을 지원한다. 추상 클래스는 일부 구현을 가지며, 자식 클래스가 반드시 구현해야 하는 추상 메서드를 포함한다.
public interface Drivable {
void drive();
}
public abstract class Vehicle {
abstract void startEngine();
}