카테고리 없음

객체지향 프로그래밍(OOP)

Gani053 2026. 1. 30. 17:42

객체지향을 처음 배울 때는
그냥 클래스 만들고 new 쓰는 문법 정도로만 생각했다.
그런데 정리하다 보니 객체지향은 단순 문법이 아니라 코드를 어떻게 나눌 것인가에 대한 설계 방식이라는 게 더 중요하다는 걸 알게 됐다.


객체지향이란?

객체지향(Object Oriented Programming, OOP)은 프로그램을 기능 단위가 아니라 객체(Object) 단위로 나누어 설계하는 방식이다.

객체는 단순한 데이터가 아니라 상태(데이터)와 행동(기능)을 함께 가지고 있는 하나의 단위라고 이해했다.

예를 들어 자동차를 생각해 보면

  • 색상, 속도 → 데이터(필드)
  • 달린다, 멈춘다 → 기능(메서드)

이렇게 현실 세계의 개념을 코드로 표현하는 방식이 객체지향의 기본 구조이다.


클래스(Class)와 객체(Object)

처음에 가장 헷갈렸던 개념이었다.
정리해보니 클래스는 설계도, 객체는 그 설계도로 만들어진 실제 결과물이었다.

class Car {
    String color;
    int speed;

    void drive() {
        System.out.println("달린다");
    }
}
Car car1 = new Car();
Car car2 = new Car();

같은 설계도로 만들어졌지만 각각 다른 상태를 가질 수 있는 독립적인 존재가 객체라는 점이 중요했다.


필드(Field)와 메서드(Method)

객체는 데이터와 기능을 함께 가진다.

  • 필드 → 상태 정보
  • 메서드 → 행동
class Person {
    String name;
    int age;

    void introduce() {
        System.out.println("자기소개");
    }
}
 

데이터와 기능을 하나의 단위로 묶는 것이 객체지향의 가장 기본적인 특징이라고 느꼈다.


생성자(Constructor)와 this

객체를 생성할 때 초기값을 설정하는 역할을 한다.

class User {
    String name;

    User(String name) {
        this.name = name;
    }
}

this는 현재 객체 자신을 의미하고 필드와 매개변수를 구분할 때 사용된다는 점을 이해하고 나니 코드를 읽는 게 훨씬 편해졌다.


캡슐화(Encapsulation)

처음에는 그냥 private 붙이는 문법이라고 생각했는데 정리하면서 보니 데이터 보호가 핵심 목적이었다.

class Account {
    private int money;

    public void setMoney(int money) {
        this.money = money;
    }

    public int getMoney() {
        return money;
    }
}

외부에서 직접 값을 변경하지 못하게 하고 메서드를 통해서만 접근하도록 만드는 구조이다.


상속(Inheritance)

기존 클래스의 기능을 물려받아 새로운 클래스를 만드는 개념이다.

class Animal {
    void sound() {
        System.out.println("소리");
    }
}

class Dog extends Animal {
}

코드를 복사하지 않고 재사용할 수 있다는 점이 가장 큰 장점이었다.


오버라이딩(Overriding)

부모 클래스의 메서드를 자식 클래스에서 다시 정의하는 것이다.

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

같은 이름의 메서드지만 객체에 따라 다른 동작을 하게 만들 수 있다는 점이 인상적이었다.


다형성(Polymorphism)

하나의 타입으로 여러 객체를 다룰 수 있는 개념이다.

Animal a = new Dog();
a.sound();

타입은 Animal이지만 실제 동작은 Dog의 메서드가 실행된다.
이 구조 덕분에 코드가 훨씬 유연해진다.


인터페이스와 추상 클래스

둘 다 “완성되지 않은 설계도”라는 공통점이 있다.

  • 인터페이스 → 기능의 규칙만 정의
  • 추상 클래스 → 일부 구현 + 일부 미구현

처음에는 차이를 외우려고 했는데, 인터페이스는 규칙, 추상 클래스는 반쯤 구현된 설계도라고 이해하니 정리가 됐다.


정리하면서 느낀 점

객체지향은 단순히 문법을 배우는 개념이 아니라 코드를 역할과 책임 기준으로 나누는 사고 방식이라는 점이 가장 중요했다.

클래스 몇 개 만드는 것보다

  • 데이터와 기능을 어떻게 묶을지
  • 상속이 필요한지
  • 외부 접근을 막아야 하는지
  • 공통 규칙을 인터페이스로 만들지

이런 고민을 하는 과정이 객체지향의 핵심이라는 걸 이해하게 됐다.