객체지향 프로그래밍 언어란 무엇일까?
프로그래밍을 공부하다 보면 객체지향 프로그래밍이라는 말을 자주 듣게 된다.
특히 Java, C#, Python 같은 언어를 배우다 보면 거의 반드시 나오는 개념이다.
처음 들으면 이름부터 어렵게 느껴질 수 있다.
하지만 객체지향 프로그래밍은 간단히 말하면 프로그램을 여러 개의 객체로 나누어 만드는 방식이다.
여기서 객체는 현실에 있는 사물이나 개념을 코드로 표현한 것이라고 생각하면 된다.
예를 들어 게임을 만든다고 해보자.
게임 안에는 플레이어, 몬스터, 아이템, 무기, NPC 같은 것들이 있다.
객체지향 프로그래밍에서는 이런 것들을 각각 하나의 객체로 보고 프로그램을 설계한다.

1. 객체란?
객체는 데이터와 기능을 함께 가진 코드 단위이다.
예를 들어 게임 속 플레이어를 객체로 생각하면 다음과 같이 표현할 수 있다.
| 플레이어 | 체력, 공격력, 이동속도 | 이동하기, 공격하기, 점프하기 |
| 몬스터 | 체력, 데미지, 위치 | 따라오기, 공격하기, 죽기 |
| 아이템 | 이름, 가격, 효과 | 사용하기, 버리기, 판매하기 |
즉, 객체는 단순히 값만 가지고 있는 것이 아니라, 그 값으로 어떤 행동을 할 수 있는 기능도 함께 가진다.
예를 들어 플레이어 객체는 체력이라는 데이터를 가지고 있고, 공격하기라는 기능도 가지고 있다.
2. 클래스란?
객체를 이해하려면 클래스도 알아야 한다.
클래스는 객체를 만들기 위한 설계도이다.
객체는 그 설계도를 바탕으로 실제로 만들어진 결과물이다.
예를 들어 붕어빵 틀과 붕어빵을 생각하면 쉽다.
| 클래스 | 붕어빵 틀 |
| 객체 | 붕어빵 |
| 인스턴스 | 클래스로 만들어진 실제 객체 |
붕어빵 틀 하나로 여러 개의 붕어빵을 만들 수 있듯이, 클래스 하나로 여러 개의 객체를 만들 수 있다.
Java로 간단히 표현하면 다음과 같다.
String name;
int hp;
void attack() {
System.out.println(name + "이 공격했습니다.");
}
}
여기서 Player는 클래스이다.
아직 실제 플레이어가 만들어진 것은 아니고, 플레이어가 어떤 데이터와 기능을 가질지 정해놓은 설계도이다.
이 클래스를 이용해 객체를 만들 수 있다.
player1.name = "용사";
player1.hp = 100;
player1.attack();
new Player()를 통해 실제 객체가 만들어진다.
이렇게 클래스로부터 만들어진 객체를 인스턴스라고 부르기도 한다.
3. 객체지향 프로그래밍이란?
객체지향 프로그래밍은 프로그램을 객체들의 모임으로 구성하는 프로그래밍 방식이다.
예전에는 프로그램을 순서대로 위에서 아래로 실행하는 방식으로 많이 작성했다.
이런 방식도 간단한 프로그램에서는 충분히 좋다.
하지만 프로그램이 커지면 코드가 복잡해지고 관리하기 어려워진다.
그래서 관련 있는 데이터와 기능을 객체로 묶어서 관리하는 방식이 등장했다.
예를 들어 게임에서 플레이어와 몬스터를 따로 객체로 만들면, 각각의 역할을 분리해서 관리할 수 있다.
Monster 객체 → 추적, 공격, 사망 처리
Item 객체 → 사용, 획득, 판매
이렇게 나누면 코드가 더 정리되고, 수정하기도 쉬워진다.
4. 객체지향 프로그래밍 언어의 예시
객체지향 프로그래밍을 지원하는 대표적인 언어는 다음과 같다.
| Java | 객체지향 개념을 강하게 사용하는 대표적인 언어 |
| C# | 게임 개발, 윈도우 프로그램, 웹 개발 등에 많이 사용 |
| Python | 문법이 쉽고 객체지향도 지원하는 언어 |
| C++ | 절차지향과 객체지향을 모두 사용할 수 있는 언어 |
| Kotlin | Java와 비슷하지만 더 간결한 문법을 가진 언어 |
| Swift | iOS 앱 개발에 많이 사용되는 객체지향 언어 |
여기서 중요한 점은 모든 언어가 객체지향만 사용하는 것은 아니라는 것이다.
Python이나 C++처럼 여러 프로그래밍 방식을 함께 지원하는 언어도 있다.
5. 객체지향의 4가지 특징
객체지향 프로그래밍에는 자주 나오는 4가지 특징이 있다.
바로 캡슐화, 상속, 다형성, 추상화이다.
처음에는 단어가 어렵지만, 하나씩 보면 그렇게 어렵지 않다.
6. 캡슐화
캡슐화는 데이터와 기능을 하나로 묶고, 외부에서 함부로 접근하지 못하게 보호하는 것이다.
예를 들어 게임 캐릭터의 체력이 있다고 해보자.
체력은 아무 값이나 들어가면 안 된다.
체력이 갑자기 -999가 되거나, 말도 안 되게 999999가 되면 게임이 이상해질 수 있다.
그래서 체력 값을 직접 바꾸지 못하게 하고, 정해진 기능을 통해서만 바꾸도록 만들 수 있다.
private int hp = 100;
public void damage(int amount) {
hp -= amount;
if (hp < 0) {
hp = 0;
}
}
public int getHp() {
return hp;
}
}
여기서 hp는 private이기 때문에 클래스 밖에서 직접 바꿀 수 없다.
대신 damage() 같은 메서드를 통해 안전하게 값을 변경한다.
이런 방식이 캡슐화이다.
7. 상속
상속은 기존 클래스의 기능을 물려받아 새로운 클래스를 만드는 것이다.
예를 들어 Monster라는 클래스가 있다고 해보자.
그리고 슬라임, 고블린, 드래곤 같은 몬스터를 만들고 싶다.
모든 몬스터는 체력, 공격력, 공격하기 같은 공통 기능을 가질 수 있다.
이 공통 기능을 Monster 클래스에 만들고, 다른 몬스터들이 상속받게 할 수 있다.
int hp;
void attack() {
System.out.println("몬스터가 공격합니다.");
}
}
class Slime extends Monster {
void jump() {
System.out.println("슬라임이 점프합니다.");
}
}
Slime은 Monster를 상속받았기 때문에 hp와 attack()을 사용할 수 있다.
그리고 슬라임만의 기능인 jump()도 추가할 수 있다.
상속을 사용하면 중복 코드를 줄일 수 있다.
8. 다형성
다형성은 같은 이름의 기능이 상황에 따라 다르게 동작하는 것이다.
예를 들어 모든 몬스터가 attack()이라는 기능을 가지고 있다고 하자.
하지만 슬라임, 고블린, 드래곤의 공격 방식은 다를 수 있다.
void attack() {
System.out.println("몬스터가 공격합니다.");
}
}
class Slime extends Monster {
void attack() {
System.out.println("슬라임이 몸통박치기를 합니다.");
}
}
class Dragon extends Monster {
void attack() {
System.out.println("드래곤이 불을 뿜습니다.");
}
}
둘 다 attack()이라는 같은 이름의 기능을 사용하지만, 실제 동작은 다르다.
이것이 다형성이다.
다형성을 사용하면 같은 명령으로 여러 객체를 다르게 움직일 수 있다.
9. 추상화
추상화는 복잡한 것에서 중요한 특징만 뽑아내는 것이다.
예를 들어 자동차를 코드로 만든다고 해보자.
자동차에는 엔진 구조, 연료 흐름, 부품 정보 등 복잡한 내용이 많다.
하지만 운전자 입장에서는 이런 내부 구조를 전부 알 필요가 없다.
핸들, 브레이크, 엑셀처럼 필요한 기능만 알면 된다.
프로그래밍에서도 마찬가지다.
복잡한 내부 구현은 숨기고, 필요한 기능만 보여주는 것이 추상화이다.
예를 들어 move()라는 메서드를 만들면, 내부에서 어떤 계산을 하는지는 몰라도 객체를 움직일 수 있다.
monster.move();
이렇게 중요한 기능만 겉으로 드러내고, 복잡한 내부 동작은 숨기는 것이 추상화이다.
10. 객체지향 프로그래밍의 장점
객체지향 프로그래밍은 프로그램이 커질수록 장점이 커진다.
| 코드 재사용 | 클래스를 만들어 여러 객체를 만들 수 있다 |
| 유지보수 쉬움 | 기능별로 객체가 나뉘어 있어 수정하기 쉽다 |
| 확장성 좋음 | 새로운 객체나 기능을 추가하기 좋다 |
| 구조가 명확함 | 현실의 사물처럼 나누어 생각할 수 있다 |
예를 들어 게임에서 몬스터 종류를 추가하고 싶을 때, 기존 코드를 전부 고치지 않고 새로운 몬스터 클래스를 추가하는 방식으로 확장할 수 있다.
11. 객체지향 프로그래밍의 단점
객체지향이 항상 좋은 것만은 아니다.
간단한 프로그램에서는 오히려 클래스와 객체를 나누는 과정이 더 복잡하게 느껴질 수 있다.
| 처음 배우기 어려움 | 클래스, 객체, 상속 같은 개념이 처음에는 헷갈린다 |
| 설계가 필요함 | 객체를 어떻게 나눌지 생각해야 한다 |
| 코드가 길어질 수 있음 | 간단한 기능도 클래스로 나누면 코드가 늘어날 수 있다 |
그래서 작은 프로그램은 간단하게 작성하고, 프로그램이 커질수록 객체지향 방식으로 구조를 잡는 것이 좋다.
12. 절차지향과 객체지향의 차이
객체지향을 이해하려면 절차지향과 비교하면 쉽다.
절차지향 프로그래밍은 프로그램의 실행 순서와 절차를 중심으로 작성하는 방식이다.
반면 객체지향 프로그래밍은 객체를 중심으로 작성하는 방식이다.
| 중심 | 실행 순서 | 객체 |
| 구성 방식 | 함수와 절차 중심 | 클래스와 객체 중심 |
| 장점 | 간단한 프로그램에 좋음 | 큰 프로그램 관리에 좋음 |
| 예시 | C | Java, C# |
예를 들어 게임을 절차지향으로 만들면 “입력받기 → 이동하기 → 충돌 확인 → 공격 처리”처럼 순서 중심으로 생각한다.
객체지향으로 만들면 “플레이어 객체가 이동한다”, “몬스터 객체가 공격한다”, “아이템 객체가 사용된다”처럼 객체 중심으로 생각한다.
13. 한 줄로 정리
객체지향 프로그래밍 언어는 프로그램을 객체라는 단위로 나누어 설계하고 개발할 수 있도록 도와주는 언어이다.
객체는 데이터와 기능을 함께 가진 코드 단위이고, 클래스는 객체를 만들기 위한 설계도이다.
객체지향의 대표적인 특징은 캡슐화, 상속, 다형성, 추상화이며, Java, C#, Python, C++ 같은 언어에서 자주 사용된다.
처음에는 어렵게 느껴질 수 있지만, 게임 속 플레이어, 몬스터, 아이템처럼 현실의 대상을 코드로 나누어 생각하면 훨씬 쉽게 이해할 수 있다.