학습
Java 객체 지향 프로그래밍 원칙
Java 객체 지향 프로그래밍 원칙 — 중급
객체 지향 프로그래밍 원칙
1. 도입 (왜 배워야 하는가)
객체 지향 프로그래밍(OOP)은 현대 소프트웨어 개발에서 매우 중요한 개념입니다. 실무에서 복잡한 시스템을 설계하고 관리하기 위해서는 OOP의 원칙을 이해하고 적용할 수 있어야 합니다. OOP는 코드의 재사용성을 높이고, 유지보수를 용이하게 하며, 개발 속도를 향상시킵니다.
OOP를 모른다면, 코드가 어지럽고 중복된 부분이 많아지며, 수정이 어려워지고 버그 발생 확률이 높아집니다. 결국, 프로젝트의 품질과 생산성이 저하될 수 있습니다.
2. 핵심 개념 설명
객체 지향 프로그래밍은 주로 네 가지 원칙으로 이루어져 있습니다: 추상화, 캡슐화, 상속, 다형성.
| 원칙 | 설명 | 비유 |
|---|---|---|
| 추상화 | 복잡한 시스템을 단순화하여 필요한 정보만 표현 | 자동차의 대시보드처럼 필요한 정보만 제공 |
| 캡슐화 | 데이터와 메서드를 하나로 묶어 외부 접근을 제한 | 안전한 금고처럼 정보가 보호됨 |
| 상속 | 기존 클래스를 기반으로 새로운 클래스를 생성 | 부모가 자식에게 유전자를 물려주는 것과 같음 |
| 다형성 | 동일한 인터페이스에서 다양한 구현을 가능하게 함 | 여러 종류의 동물이 '걷기'라는 행동을 다르게 수행 |
3. 기본 코드 예제
아래 코드는 간단한 Animal 클래스를 정의하고, 이를 상속받아 Dog와 Cat 클래스를 구현하는 예제입니다.
// Animal 클래스 정의
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// Dog 클래스는 Animal을 상속받습니다.
class Dog extends Animal {
void sound() {
System.out.println("멍멍!");
}
}
// Cat 클래스는 Animal을 상속받습니다.
class Cat extends Animal {
void sound() {
System.out.println("야옹!");
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // Dog 객체 생성
Animal myCat = new Cat(); // Cat 객체 생성
myDog.sound(); // Dog의 sound 호출
myCat.sound(); // Cat의 sound 호출
}
}
실행 결과
멍멍!
야옹!
코드 동작 설명
Animal클래스는 기본적인sound메서드를 정의합니다.Dog클래스는Animal을 상속받아sound메서드를 오버라이드하여 "멍멍!"을 출력합니다.Cat클래스도Animal을 상속받아sound메서드를 오버라이드하여 "야옹!"을 출력합니다.- 메인 메서드에서는
Dog와Cat객체를 생성하고, 각 객체의sound메서드를 호출합니다.
4. 실전 활용 예제
쇼핑몰에서 장바구니를 구현할 때
장바구니를 구성하는 클래스와 상품 클래스를 정의하고, 상속을 통해 다양한 상품을 추가할 수 있습니다.
// Product 클래스 정의
class Product {
String name;
double price;
Product(String name, double price) {
this.name = name;
this.price = price;
}
}
// Cart 클래스 정의
class Cart {
ArrayList<Product> products = new ArrayList<>();
void addProduct(Product product) {
products.add(product);
}
void showCart() {
for (Product product : products) {
System.out.println(product.name + ": " + product.price + "원");
}
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
Cart cart = new Cart();
cart.addProduct(new Product("사과", 1000));
cart.addProduct(new Product("바나나", 1500));
cart.showCart();
}
}
실행 결과
사과: 1000원
바나나: 1500원
게임에서 캐릭터를 구현할 때
게임에서 다양한 캐릭터를 만들기 위해 상속과 다형성을 활용할 수 있습니다.
// Character 클래스 정의
class Character {
String name;
Character(String name) {
this.name = name;
}
void attack() {
System.out.println(name + "가 공격합니다!");
}
}
// Warrior 클래스
class Warrior extends Character {
Warrior(String name) {
super(name);
}
void attack() {
System.out.println(name + "가 강력한 공격을 합니다!");
}
}
// Mage 클래스
class Mage extends Character {
Mage(String name) {
super(name);
}
void attack() {
System.out.println(name + "가 마법 공격을 합니다!");
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
Character warrior = new Warrior("전사");
Character mage = new Mage("마법사");
warrior.attack();
mage.attack();
}
}
실행 결과
전사가 강력한 공격을 합니다!
마법사가 마법 공격을 합니다!
5. 흔한 실수와 주의사항
- 상속의 잘못된 사용
- 캡슐화 소홀
- 다형성 오해
- 객체 지향 프로그래밍은 코드의 재사용성과 유지보수성을 높입니다.
- OOP의 네 가지 원칙(추상화, 캡슐화, 상속, 다형성)은 서로 밀접하게 연결되어 있습니다.
- 실무에서 OOP를 통해 복잡한 문제를 효과적으로 해결할 수 있습니다.
- 잘못된 코드: Dog가 Cat을 상속받는 경우
- 올바른 코드: Dog와 Cat이 모두 Animal을 상속받아야 함.
- 잘못된 코드: 클래스의 속성을 public으로 선언 - 올바른 코드: private으로 선언하고 getter/setter 메서드를 사용하여 접근.
- 잘못된 코드: Animal 타입의 변수가 Dog와 Cat의 메서드를 각각 호출하지 못하는 경우
- 올바른 코드: Animal 타입으로 선언한 변수를 통해 다형성을 활용하여 각각의 메서드를 호출.
6. 정리
다음에 학습하면 좋은 주제: 디자인 패턴 (특히 Singleton, Factory, Observer 패턴 등)