본문 바로가기
IT/JAVA

Java객체지향 프로그래밍 개념 (캡슐화, 상속, 다형성)

by ohukohoh 2025. 2. 22.
728x90
반응형

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체 단위로 나누어 설계하고 구현하는 방식입니다. Java를 비롯한 대부분의 현대 프로그래밍 언어는 객체지향 프로그래밍을 지원하며, 이를 통해 코드의 재사용성, 유지보수성, 확장성을 높일 수 있습니다. 객체지향 프로그래밍의 핵심 개념에는 **캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)**이 포함됩니다.


 

1. 캡슐화(Encapsulation)

캡슐화란?

캡슐화는 객체의 데이터(속성)를 외부에서 직접 접근하지 못하도록 보호하는 개념입니다. 데이터를 보호하기 위해 **접근 제한자(access modifier)**를 사용하며, 일반적으로 private을 사용하여 직접 접근을 막고, gettersetter 메서드를 통해 데이터를 관리합니다.

캡슐화 예제

class Person {
    private String name;  // 외부에서 직접 접근 불가
    private int age;

    // 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter 메서드
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Setter 메서드
    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person("홍길동", 25);
        System.out.println("이름: " + p.getName());
        System.out.println("나이: " + p.getAge());
        
        // 나이 변경
        p.setAge(30);
        System.out.println("변경된 나이: " + p.getAge());
    }
}

출력 결과:

이름: 홍길동
나이: 25
변경된 나이: 30

🔹 private 접근 제한자를 사용하면 클래스 외부에서 직접 변수에 접근할 수 없습니다. 🔹 gettersetter 메서드를 통해 데이터를 안전하게 수정 및 조회할 수 있습니다.


2. 상속(Inheritance)

상속이란?

상속은 기존 클래스(부모 클래스, Superclass)의 기능을 새로운 클래스(자식 클래스, Subclass)에 물려주는 기능입니다. 이를 통해 코드의 재사용성을 증가시키고, 새로운 기능을 추가할 수 있습니다.

상속 예제

// 부모 클래스
class Animal {
    String name;

    public void eat() {
        System.out.println(name + "가 먹고 있습니다.");
    }
}

// 자식 클래스
class Dog extends Animal {
    public void bark() {
        System.out.println(name + "가 짖습니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.name = "바둑이";
        myDog.eat();  // 부모 클래스의 메서드 사용
        myDog.bark(); // 자식 클래스의 메서드 사용
    }
}

출력 결과:

바둑이가 먹고 있습니다.
바둑이가 짖습니다.

🔹 extends 키워드를 사용하여 클래스를 상속받을 수 있습니다. 🔹 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 사용할 수 있습니다. 🔹 필요하면 자식 클래스에서 부모 클래스의 기능을 확장할 수도 있습니다.


3. 다형성(Polymorphism)

다형성이란?

다형성은 같은 메서드를 다양한 방식으로 동작하게 만드는 기능입니다. 즉, 같은 이름의 메서드가 서로 다른 동작을 수행할 수 있습니다. 다형성은 크게 **메서드 오버라이딩(Overriding)**과 **메서드 오버로딩(Overloading)**으로 나뉩니다.

1) 메서드 오버라이딩 (Method Overriding)

  • 부모 클래스의 메서드를 자식 클래스에서 다시 정의(재정의)하여 사용할 수 있습니다.

예제:

class Animal {
    public void makeSound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();
        myAnimal.makeSound(); // 오버라이딩된 메서드 호출
    }
}

출력 결과:

멍멍!

🔹 @Override 어노테이션을 사용하면 부모 클래스의 메서드를 재정의할 수 있습니다. 🔹 부모 타입(Animal)으로 선언해도, 실제 객체 타입(Dog)의 오버라이딩된 메서드가 실행됩니다.

2) 메서드 오버로딩 (Method Overloading)

  • 같은 클래스 내에서 같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 하여 정의하는 것

예제:

class MathOperations {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        MathOperations math = new MathOperations();
        System.out.println("정수 덧셈: " + math.add(5, 10));
        System.out.println("실수 덧셈: " + math.add(5.5, 10.5));
    }
}

출력 결과:

정수 덧셈: 15
실수 덧셈: 16.0

🔹 같은 이름의 메서드이지만, 매개변수의 개수나 타입이 다르면 다른 메서드로 인식됩니다.


 

결론

Java의 객체지향 프로그래밍(OOP)에서는 캡슐화, 상속, 다형성을 활용하여 코드의 재사용성, 유지보수성, 확장성을 높일 수 있습니다.

  • 캡슐화: 데이터 보호 및 접근 제어
  • 상속: 코드 재사용 및 확장
  • 다형성: 같은 이름의 메서드를 다르게 구현 가능

이러한 개념을 잘 활용하면 유지보수성이 뛰어난 객체지향 프로그램을 만들 수 있습니다. 🚀

728x90
반응형