JAVA/객체지향 프로그래밍

Java 객체지향 원칙 완벽 가이드: 캡슐화, 상속, 다형성, 추상화 쉽게 배우기

CodeCaine Explorer 2024. 12. 19. 07:43
SMALL

안녕하세요! 😊
오늘은 Java의 객체지향 프로그래밍(Object-Oriented Programming, OOP)의 4대 원칙에 대해 배워볼 거예요.
이 원칙들은 복잡한 프로그램을 깔끔하고 유지보수하기 쉽게 만드는 데 꼭 필요합니다. 조금 어렵게 느껴질 수 있지만 차근차근 예제를 통해 이해해 보아요! 💪


1. 캡슐화(Encapsulation) 🎁

캡슐화는 데이터를 보호하고 숨기는 것이에요.

  • 클래스 내부의 변수(속성)를 외부에서 직접 접근하지 못하게 하고, 대신 메서드(함수)를 통해서만 접근할 수 있도록 해요.
  • 👉 비유: 비밀번호가 걸린 금고. 데이터를 보호하고 관리하는 역할을 합니다.
class BankAccount {
    // private로 데이터를 숨김
    private int balance = 0;

    // 데이터를 제어하는 메서드 제공
    public void deposit(int amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("입금 완료. 잔액: " + balance);
        } else {
            System.out.println("입금 금액은 0보다 커야 합니다.");
        }
    }

    public void withdraw(int amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
            System.out.println("출금 완료. 잔액: " + balance);
        } else {
            System.out.println("잔액 부족 또는 잘못된 금액입니다.");
        }
    }
}

동작 설명:

  1. balanceprivate이어서 외부에서 직접 접근할 수 없어요.
  2. depositwithdraw 메서드를 통해서만 잔액을 수정할 수 있습니다.
  3. 이렇게 데이터를 보호하는 것이 캡슐화입니다.

2. 상속(Inheritance) 👪

상속은 기존 클래스를 확장하여 새로운 클래스를 만드는 것이에요.

  • 👉 비유: 부모의 특성을 자식이 물려받는 것과 같아요.
// 부모 클래스
class Animal {
    void eat() {
        System.out.println("This animal eats food.");
    }
}

// 자식 클래스
class Dog extends Animal {
    void bark() {
        System.out.println("The dog barks.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog(); // Dog 객체 생성
        dog.eat(); // 부모 클래스 메서드 호출
        dog.bark(); // 자식 클래스 메서드 호출
    }
}

동작 설명:

  1. Dog 클래스는 Animal 클래스를 상속받았어요.
  2. Dog 클래스는 Animaleat 메서드와 자신의 bark 메서드를 모두 사용할 수 있습니다.
  3. 상속을 통해 코드 재사용성을 높일 수 있어요! 😊

3. 다형성(Polymorphism) 🧩

다형성은 하나의 인터페이스(또는 메서드)가 여러 형태로 동작할 수 있는 것을 말해요.

  • 👉 비유: "전화 걸기"라는 기능은 핸드폰, 인터넷 전화기 등 다양한 기기에서 동작할 수 있어요.
class Animal {
    void sound() {
        System.out.println("Some animal makes a sound.");
    }
}

class Cat extends Animal {
    void sound() {
        System.out.println("Meow!");
    }
}

class Dog extends Animal {
    void sound() {
        System.out.println("Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // 부모 타입 참조 변수
        myAnimal.sound(); // 출력: Woof!

        myAnimal = new Cat();
        myAnimal.sound(); // 출력: Meow!
    }
}

동작 설명:

  1. myAnimalAnimal 타입이지만, 실제 객체에 따라 sound 메서드의 동작이 달라집니다.
  2. 다형성을 통해 하나의 타입으로 다양한 동작을 수행할 수 있습니다.

4. 추상화(Abstraction) 🧱

추상화는 중요한 것만 간추려서 보여주는 것이에요.

  • 추상 클래스나 인터페이스를 사용해 공통점을 정의하고, 세부 사항은 각 클래스에서 구현합니다.
  • 👉 비유: 자동차의 운전대는 "핸들을 돌리면 자동차가 움직인다"는 공통점만 보이고, 내부 엔진 작동 방식은 숨겨져 있어요.
// 추상 클래스
abstract class Animal {
    abstract void sound(); // 추상 메서드 (구현 X)
}

// Cat 클래스
class Cat extends Animal {
    void sound() {
        System.out.println("Meow!");
    }
}

// Dog 클래스
class Dog extends Animal {
    void sound() {
        System.out.println("Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Cat(); // Cat 객체
        myAnimal.sound(); // 출력: Meow!

        myAnimal = new Dog(); // Dog 객체
        myAnimal.sound(); // 출력: Woof!
    }
}

동작 설명:

  1. Animal은 추상 클래스이므로 직접 객체를 생성할 수 없습니다.
  2. CatDogAnimal의 추상 메서드 sound를 구현했어요.
  3. 각 클래스마다 고유의 행동을 정의할 수 있는 것이 추상화입니다.

이해가 어렵다면? 😅

처음에는 "추상화와 다형성의 차이점이 뭐지?" 같은 헷갈림이 생길 수 있어요.
🔑 팁:

  • 캡슐화: 데이터를 보호하고 숨김
  • 상속: 부모의 것을 물려받음
  • 다형성: 하나의 이름으로 다양한 동작 가능
  • 추상화: 중요한 것만 간추려 정의

직접 코드를 작성하며 천천히 익혀 보세요! 😊


왜 중요할까요?

객체지향 원칙은 복잡한 프로그램을 구조화하고 유지보수성을 높이는 데 필수적이에요.
이 원칙들을 이해하면 더 나은 설계를 할 수 있고, 실무에서도 큰 도움이 된답니다. 🚀


오늘도 함께 학습해 주셔서 감사합니다! 😊
조금씩 배우다 보면 객체지향 프로그래밍이 점점 더 재미있어질 거예요. 여러분의 성장을 응원합니다! 화이팅! ❤️

728x90
반응형
SMALL