객체지향을 처음 배울 때는
그냥 클래스 만들고 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의 메서드가 실행된다.
이 구조 덕분에 코드가 훨씬 유연해진다.
인터페이스와 추상 클래스
둘 다 “완성되지 않은 설계도”라는 공통점이 있다.
- 인터페이스 → 기능의 규칙만 정의
- 추상 클래스 → 일부 구현 + 일부 미구현
처음에는 차이를 외우려고 했는데, 인터페이스는 규칙, 추상 클래스는 반쯤 구현된 설계도라고 이해하니 정리가 됐다.
정리하면서 느낀 점
객체지향은 단순히 문법을 배우는 개념이 아니라 코드를 역할과 책임 기준으로 나누는 사고 방식이라는 점이 가장 중요했다.
클래스 몇 개 만드는 것보다
- 데이터와 기능을 어떻게 묶을지
- 상속이 필요한지
- 외부 접근을 막아야 하는지
- 공통 규칙을 인터페이스로 만들지
이런 고민을 하는 과정이 객체지향의 핵심이라는 걸 이해하게 됐다.