[TIL] 28. 객체지향 프로그래밍

김지수·2024년 5월 29일

TIL

목록 보기
28/53

객체 지향 프로그래밍(Object-Oriented Programming, OOP)

소프트웨어 개발 패러다임 중 하나로, 프로그램을 객체의 집합으로 구성하여 개발하는 방법입니다. 객체는 데이터와 그 데이터를 처리하는 메소드를 포함하며, 이들 객체 간의 상호작용을 통해 프로그램이 동작합니다. 객체 지향 프로그래밍의 주요 개념을 아래와 같이 설명할 수 있습니다.

객체 (Object)

정의: 객체는 데이터(속성)와 이를 처리하는 코드(메소드)를 포함하는 독립적인 단위입니다.
예: 자동차 객체는 속성으로 색상, 제조사, 속도 등을 가질 수 있으며, 메소드로는 가속, 감속 등이 있을 수 있습니다.

클래스 (Class)

정의: 클래스는 객체를 생성하기 위한 설계도 또는 청사진입니다. 클래스는 객체의 속성과 메소드를 정의합니다.
예: 자동차 클래스를 정의하면 이 클래스를 기반으로 여러 자동차 객체를 만들 수 있습니다.

캡슐화 (Encapsulation)

정의: 캡슐화는 객체의 속성과 메소드를 하나로 묶고, 객체의 내부 구현을 외부에 숨기는 것입니다. 이를 통해 데이터의 무결성을 보호하고, 객체의 인터페이스를 통해서만 접근할 수 있도록 합니다.
예: 자동차의 내부 엔진 구조를 감추고, 가속 페달과 브레이크 페달이라는 인터페이스만 제공하여 제어합니다.

상속 (Inheritance)

정의: 상속은 한 클래스가 다른 클래스의 속성과 메소드를 상속받아 사용하는 것입니다. 이를 통해 코드의 재사용성을 높이고, 계층적인 관계를 형성할 수 있습니다.
예: '승용차' 클래스는 '자동차' 클래스를 상속받아, 자동차의 기본 속성과 메소드를 그대로 사용하면서, 승용차만의 특성을 추가할 수 있습니다.

5. 다형성 (Polymorphism)

정의: 다형성은 같은 메소드가 다양한 방식으로 동작할 수 있도록 하는 것입니다. 주로 메소드 오버로딩(같은 이름의 메소드를 여러 개 정의)과 메소드 오버라이딩(상속받은 메소드를 재정의)으로 구현됩니다.
예: '자동차' 클래스의 '운전' 메소드를 '승용차'와 '트럭' 클래스에서 각각 다르게 구현할 수 있습니다.

6. 추상화 (Abstraction)

정의: 추상화는 복잡한 시스템에서 주요 기능을 간추려 내고, 불필요한 부분을 숨기는 것입니다. 추상 클래스와 인터페이스를 통해 구현됩니다.
예: '운송수단'이라는 추상 클래스는 '운전'이라는 추상 메소드를 정의하고, 구체적인 '자동차'와 '자전거' 클래스는 이를 구현합니다.

// 추상 클래스 (Abstraction)
abstract class Vehicle {
    private String color;
    private int speed;

    // 캡슐화 (Encapsulation)
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    // 추상 메소드 (Abstraction)
    public abstract void drive();
}

// 상속 (Inheritance)
class Car extends Vehicle {
    private int numberOfDoors;

    public int getNumberOfDoors() {
        return numberOfDoors;
    }

    public void setNumberOfDoors(int numberOfDoors) {
        this.numberOfDoors = numberOfDoors;
    }

    // 다형성 - 메소드 오버라이딩 (Polymorphism)
    @Override
    public void drive() {
        System.out.println("Driving a car");
    }
}

class Truck extends Vehicle {
    private int loadCapacity;

    public int getLoadCapacity() {
        return loadCapacity;
    }

    public void setLoadCapacity(int loadCapacity) {
        this.loadCapacity = loadCapacity;
    }

    // 다형성 - 메소드 오버라이딩 (Polymorphism)
    @Override
    public void drive() {
        System.out.println("Driving a truck");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.setColor("Red");
        car.setSpeed(100);
        car.setNumberOfDoors(4);
        car.drive(); // "Driving a car"

        Truck truck = new Truck();
        truck.setColor("Blue");
        truck.setSpeed(80);
        truck.setLoadCapacity(1000);
        truck.drive(); // "Driving a truck"
    }
}

객체 지향 프로그래밍은 이러한 개념들을 활용하여 코드를 재사용 가능하고, 확장 가능하며, 유지 보수하기 쉽게 만듭니다.


오늘의 회고

모의 면접에서 물어봤던 객체지향이란 무엇인가에 대해서 답변을 하지 못하였다. 공부를 하면서 하나하나 깊게 공부를 해야 할 것 같다.

profile
서툴고 부족한 점이 많지만, 배우고 발전하며 성장하기 위해 노력하겠습니다.

0개의 댓글