Responsive Advertisement

Java - What is OOP? 객체지향 프로그래밍의 기본 개념

Java는 대표적인 객체지향 프로그래밍(Object-Oriented Programming, OOP) 언어입니다. OOP는 코드를 객체(object)로 구조화하여 현실 세계의 문제를 더 직관적이고 효율적으로 해결할 수 있도록 도와줍니다. 이번 글에서는 OOP의 기본 개념, Java에서의 구현, 그리고 실생활의 활용 예제를 살펴보겠습니다.

1. 객체지향 프로그래밍(OOP)란?

OOP는 데이터를 객체라는 단위로 나누고, 이 객체들이 서로 상호작용하며 프로그램을 구성하는 프로그래밍 패러다임입니다. 객체는 속성(Attributes)동작(Methods)으로 구성되며, 이러한 객체를 조합하여 복잡한 시스템을 구축할 수 있습니다.

OOP의 주요 특징

  • 캡슐화(Encapsulation): 데이터와 메서드를 하나의 객체로 묶고, 외부에서의 직접 접근을 제한하여 데이터를 보호합니다.
  • 상속(Inheritance): 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 재사용성을 높입니다.
  • 다형성(Polymorphism): 같은 이름의 메서드가 다른 동작을 하도록 정의할 수 있습니다.
  • 추상화(Abstraction): 복잡한 시스템을 단순화하여 필요한 부분만 보여줍니다.

2. Java에서의 OOP 구현

2.1 클래스와 객체

클래스(Class)는 객체를 생성하기 위한 청사진이며, 객체(Object)는 클래스에서 생성된 인스턴스입니다.

예제: 클래스와 객체

public class Car {
    // 속성(Attributes)
    String brand;
    int speed;

    // 동작(Methods)
    public void drive() {
        System.out.println(brand + "가 " + speed + "km/h로 달립니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Car myCar = new Car();
        myCar.brand = "BMW";
        myCar.speed = 120;
        myCar.drive();
    }
}

출력 결과:

BMW가 120km/h로 달립니다.

3. OOP의 주요 개념과 예제

3.1 캡슐화(Encapsulation)

캡슐화는 데이터 접근을 제한하여 외부로부터 객체의 속성을 보호합니다. private 키워드를 사용하여 속성을 은닉하고, gettersetter 메서드를 통해 접근합니다.

public class Person {
    private String name; // 은닉된 속성

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

    // Setter
    public void setName(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("홍길동");
        System.out.println("이름: " + person.getName());
    }
}

출력 결과:

이름: 홍길동

3.2 상속(Inheritance)

상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받는 기능입니다.

class Animal {
    public void eat() {
        System.out.println("동물이 먹습니다.");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println("개가 짖습니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat(); // 상속된 메서드
        myDog.bark(); // Dog 클래스의 메서드
    }
}

출력 결과:

동물이 먹습니다.  
개가 짖습니다.  

3.3 다형성(Polymorphism)

다형성은 하나의 메서드가 여러 클래스에서 서로 다르게 동작하도록 구현할 수 있습니다.

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

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("고양이가 야옹 합니다.");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("개가 멍멍 합니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myCat = new Cat();
        Animal myDog = new Dog();
        myCat.sound(); // Cat의 sound() 호출
        myDog.sound(); // Dog의 sound() 호출
    }
}

출력 결과:

고양이가 야옹 합니다.  
개가 멍멍 합니다.  

3.4 추상화(Abstraction)

추상화는 복잡한 시스템의 일부만 노출하여 중요한 정보를 간결하게 표현합니다. 이를 위해 abstract 키워드를 사용해 추상 클래스를 정의합니다.

abstract class Shape {
    abstract void draw(); // 추상 메서드
}

class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("원을 그립니다.");
    }
}

class Rectangle extends Shape {
    @Override
    void draw() {
        System.out.println("사각형을 그립니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();
        circle.draw();
        rectangle.draw();
    }
}

출력 결과:

원을 그립니다.  
사각형을 그립니다.  

4. OOP의 장점

  • 코드 재사용: 상속을 통해 기존 코드를 재사용하여 개발 시간을 단축합니다.
  • 유지보수 용이: 코드 구조가 명확하여 유지보수와 확장이 용이합니다.
  • 캡슐화를 통한 보안: 데이터 은닉으로 외부 접근을 제한하여 데이터 보호가 가능합니다.
  • 다형성: 다양한 객체를 동일한 인터페이스로 처리할 수 있습니다.

결론

Java의 객체지향 프로그래밍은 현실 세계의 문제를 코드로 효율적으로 모델링할 수 있는 강력한 도구입니다. OOP의 주요 개념인 클래스와 객체, 캡슐화, 상속, 다형성, 추상화를 이해하고 활용하면 더욱 구조적이고 유지보수 가능한 프로그램을 작성할 수 있습니다. 이번 글을 바탕으로 OOP 개념을 적용해 다양한 프로젝트를 만들어 보세요!

댓글 쓰기