IMCAT.DEV
로그인 가입
Java 중급 객체지향

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. 흔한 실수와 주의사항

    1. 상속의 잘못된 사용
    2. - 잘못된 코드: Dog가 Cat을 상속받는 경우 - 올바른 코드: Dog와 Cat이 모두 Animal을 상속받아야 함.

    3. 캡슐화 소홀
    4. - 잘못된 코드: 클래스의 속성을 public으로 선언 - 올바른 코드: private으로 선언하고 getter/setter 메서드를 사용하여 접근.

    5. 다형성 오해
    6. - 잘못된 코드: Animal 타입의 변수가 Dog와 Cat의 메서드를 각각 호출하지 못하는 경우 - 올바른 코드: Animal 타입으로 선언한 변수를 통해 다형성을 활용하여 각각의 메서드를 호출.

      6. 정리

    7. 객체 지향 프로그래밍은 코드의 재사용성과 유지보수성을 높입니다.
    8. OOP의 네 가지 원칙(추상화, 캡슐화, 상속, 다형성)은 서로 밀접하게 연결되어 있습니다.
    9. 실무에서 OOP를 통해 복잡한 문제를 효과적으로 해결할 수 있습니다.

다음에 학습하면 좋은 주제: 디자인 패턴 (특히 Singleton, Factory, Observer 패턴 등)