다음은 객체지향 프로그래밍의 4가지 핵심 원칙입니다:
캡슐화는 데이터(필드)와 데이터를 조작하는 메서드를 하나의 단위(클래스)로 묶는 것을 의미합니다. 외부에서 객체의 데이터를 직접 접근하지 못하도록 막고, 대신 메서드를 통해 접근하거나 수정하도록 합니다.
private로 선언하여 외부에서 직접 접근하지 못하게 합니다.getter와 setter 메서드를 통해 데이터를 안전하게 관리합니다.public class Person {
private String name; // 필드 은닉
private int age;
// getter와 setter 메서드로 데이터 접근
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("나이는 0 이상이어야 합니다.");
}
this.age = age;
}
}
상속은 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)에 물려주는 기능입니다. 이를 통해 코드의 재사용성과 확장성을 높일 수 있습니다.
// 부모 클래스
public class Animal {
public void eat() {
System.out.println("먹는 중...");
}
}
// 자식 클래스
public class Dog extends Animal {
public void bark() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 부모 클래스의 메서드 사용
dog.bark(); // 자식 클래스의 메서드 사용
}
}
다형성은 같은 메서드나 객체가 다양한 방식으로 동작할 수 있도록 만드는 기능입니다. 주로 메서드 오버로딩과 메서드 오버라이딩, 그리고 상속 관계에서 동적 바인딩(dynamic binding)을 통해 구현됩니다.
// 부모 클래스
public class Animal {
public void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 부모 타입으로 자식 객체 참조
animal.sound(); // 출력: 멍멍! (동적 바인딩)
}
}
추상화는 필요한 정보만 보여주고 불필요한 세부사항은 감추는 것입니다. 이는 주로 추상 클래스와 인터페이스를 통해 구현됩니다. 추상화는 설계의 명확성을 높이고, 객체의 중요한 특징만 드러나도록 합니다.
// 추상 클래스
abstract class Animal {
abstract void sound(); // 추상 메서드
public void eat() {
System.out.println("먹는 중...");
}
}
// 자식 클래스
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.sound(); // 출력: 멍멍!
dog.eat(); // 출력: 먹는 중...
}
}
| 원칙 | 설명 | 예제 |
|---|---|---|
| 캡슐화 | 데이터를 숨기고 메서드를 통해 관리 | private 필드 + getter/setter |
| 상속 | 부모 클래스의 속성과 메서드를 자식 클래스에 전달 | class Child extends Parent |
| 다형성 | 객체가 여러 형태로 동작할 수 있도록 설계 | 메서드 오버로딩, 오버라이딩 |
| 추상화 | 중요한 정보만 노출, 불필요한 세부사항 숨김 | 추상 클래스, 인터페이스 |