[Java] Java 객체지향 프로그래밍 (OOP) 기본 개념 #10

소개

자바(Java)는 객체지향 프로그래밍(OOP)의 대표적인 언어 중 하나로, 개체(객체)를 중심으로 프로그램을 설계하고 구현하는 패러다임을 제공합니다. 객체지향 프로그래밍은 현실 세계의 개념과 상호작용을 모델링하여 코드를 조직하고 재사용성을 높이는 등 여러 이점을 제공합니다. 이번 글에서는 Java 객체지향 프로그래밍의 기본 개념에 대해 자세히 알아보겠습니다.

[Java] Java 객체지향 프로그래밍 (OOP) 기본 개념 #10

객체지향 프로그래밍이란?

개체(Object)의 개념

객체지향 프로그래밍은 ‘객체’를 중심으로 모든 것을 모델링하는 프로그래밍 패러다임입니다. 개체는 데이터와 해당 데이터를 처리하는 메서드를 포함하는 소프트웨어의 기본 단위입니다. 예를 들어, 자동차라는 개체는 브랜드, 모델, 속도 등의 속성을 가지며 주행, 정지, 가속 등의 행동을 수행할 수 있습니다.

클래스(Class)의 역할

클래스는 객체를 만들기 위한 설계도로 생각할 수 있습니다. 클래스는 속성(멤버 변수)과 행동(메서드)을 정의하여 객체를 생성하는데 사용됩니다. 예를 들어, 자동차 클래스는 모든 자동차 객체가 가져야 하는 속성과 행동을 정의합니다.

public class Car {
    // 속성(멤버 변수)
    String brand;
    String model;
    int speed;

    // 행동(메서드)
    void start() {
        System.out.println("The car is starting.");
    }

    void accelerate() {
        speed += 10;
        System.out.println("The car is accelerating. Current speed: " + speed);
    }

    void stop() {
        System.out.println("The car is stopping.");
    }
}

캡슐화(Encapsulation)와 정보 은닉(Information Hiding)

캡슐화는 객체의 상태를 나타내는 데이터와 그 데이터를 처리하는 메서드를 하나로 묶는 것을 말합니다. 정보 은닉은 객체의 내부 구현을 외부에서 감추어 외부에서 직접 접근하지 못하도록 하는 것을 의미합니다. 이는 객체의 상태를 안전하게 보호하고 유지보수성을 향상시킵니다.

public class Car {
    private String brand;
    private String model;
    private int speed;

    // 생성자(Constructor)를 통해 객체 초기화
    public Car(String brand, String model) {
        this.brand = brand;
        this.model = model;
        this.speed = 0;
    }

    // 정보 은닉된 속성에 대한 접근자 메서드
    public String getBrand() {
        return brand;
    }

    // 정보 은닉된 속성에 대한 수정자 메서드
    public void setSpeed(int speed) {
        if (speed >= 0) {
            this.speed = speed;
        } else {
            System.out.println("Speed cannot be negative.");
        }
    }
}

상속(Inheritance)과 다형성(Polymorphism)

상속의 개념

상속은 부모 클래스의 특성을 자식 클래스가 물려받는 것을 의미합니다. 이로써 코드 재사용성이 높아지고, 계층 구조가 형성되어 소프트웨어 설계가 간결해집니다. 예를 들어, 자동차 클래스가 있을 때, 스포츠카 클래스는 자동차 클래스를 상속받아 추가적인 특성을 가질 수 있습니다.

public class SportsCar extends Car {
    // 추가적인 특성
    boolean turbo;

    // 생성자
    public SportsCar(String brand, String model, boolean turbo) {
        super(brand, model); // 부모 클래스의 생성자 호출
        this.turbo = turbo;
    }

    // 오버라이딩(Overriding): 부모 클래스의 메서드를 자식 클래스에서 재정의
    @Override
    void accelerate() {
        if (turbo) {
            speed += 20;
            System.out.println("The sports car is accelerating with turbo. Current speed: " + speed);
        } else {
            super.accelerate(); // 부모 클래스의 메서드 호출
        }
    }
}

다형성의 힘

다형성은 동일한 메서드 호출로 다양한 동작을 수행할 수 있는 능력을 의미합니다. 이는 메서드 오버로딩(Overloading)과 메서드 오버라이딩(Overriding)을 통해 구현됩니다. 메서드 오버로딩은 동일한 이름의 메서드를 매개변수의 개수나 타입에 따라 다르게 정의하는 것이며, 메서드 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것입니다.

public class PolymorphismExample {
    // 메서드 오버로딩
    int add(int a, int b) {
        return a + b;
    }

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

    // 메서드 오버라이딩
    @Override
    void accelerate() {
        System.out.println("Polymorphic acceleration.");
    }
}

인터페이스(Interface)와 추상 클래스(Abstract Class)

인터페이스의 역할

인터페이스는 추상 메서드의 집합으로, 구현을 강제화하여

다양한 클래스에서 동일한 동작을 보장합니다. 이는 다중 상속을 지원하며, 클래스 간의 결합도를 낮추어 유연한 설계를 가능하게 합니다.

public interface Drivable {
    void start();

    void accelerate();

    void stop();
}

추상 클래스의 활용

추상 클래스는 일부 메서드를 구현하고 일부는 하위 클래스에게 위임하는 클래스입니다. 추상 클래스는 인스턴스를 직접 생성할 수 없으며, 상속을 통해 하위 클래스에서 완성되어야 합니다.

public abstract class Shape {
    // 추상 메서드
    abstract double calculateArea();

    // 일반 메서드
    void display() {
        System.out.println("Displaying shape.");
    }
}

결론 Java 객체지향 프로그램

이렇게 Java 객체지향 프로그래밍의 기본 개념을 살펴보았습니다. 객체지향 프로그래밍은 코드의 가독성을 높이고 유지보수성을 강화하여 대규모 소프트웨어 개발에 효과적입니다. 자바를 사용하여 객체지향적인 코드를 작성하는 것은 프로그래밍 실력을 향상시키는 한 가지 효과적인 방법입니다. 계속해서 자바의 다양한 기능과 라이브러리를 익히면서 높은 수준의 소프트웨어를 개발할 수 있도록 노력해보세요!

[Java] Java 함수 또는 메서드 작성하기 #9
[Java] Java 함수 또는 메서드 작성하기 #9
[Java] Java 클래스와 객체: 객체지향 프로그래밍의 핵심
[Java] Java 클래스와 객체: 객체지향 프로그래밍의 핵심

Leave a Comment