| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 포인터
- 자바
- 플러터
- 정처기
- 앱개발
- 모바일앱개발
- 개발기초
- C언어
- 정보처리기사실기
- 비동기처리
- 클린아키텍처
- Flutter
- 정처기실기기출
- UML
- 개발자성장
- 상태관리
- 블록체인
- 정처기실기
- flutter web
- DART
- 정보처리기사
- Java
- 프로그래밍기초
- 정보처리기사실기기출
- claudecode
- 초보개발자
- RiverPod
- 모바일 앱 개발
- 멘탈관리
- 리버팟
- Today
- Total
Flutter & Mobile by Kay
[OOP] 객체 지향 프로그래밍이란? 본문
프로그래밍을 공부하다 보면 반드시 만나게 되는 개념이 있습니다.
바로 OOP, 즉 Object-Oriented Programming입니다.
한국어로는 객체 지향 프로그래밍이라고 부릅니다.
처음 들으면 조금 딱딱하게 느껴질 수 있습니다.
하지만 너무 어렵게 생각하지 않아도 됩니다.
오늘은 마치 호그와트의 오래된 마법 교실에서 덤블도어 교수님이 조용히 강의해 주는 느낌으로,
객체 지향 프로그래밍을 천천히 이해해 보겠습니다.
1. OOP 한 줄 요약
OOP는 프로그램을 단순한 명령어의 나열이 아니라, 여러 개의 객체들이 서로 협력하는 구조로 만드는 프로그래밍 방식입니다.
쉽게 말하면, '현실 세계의 사물이나 개념을 코드 속 객체로 표현하는 방법'이라고 볼 수 있습니다.
예를 들어, 현실 세계에는 이런 것들이 있습니다.
- 학생
- 교수
- 지팡이
- 마법 주문
- 기숙사
- 도서관 책
객체 지향 프로그래밍에서는 이런 것들을 코드 안에서 객체로 표현합니다.
2. 호그와트로 이해하는 객체 지향 프로그래밍
자, 호그와트 마법학교를 하나의 프로그램이라고 생각해 보겠습니다.
호그와트에는 학생이 있습니다.
학생은 이름, 나이, 기숙사 같은 정보를 가지고 있습니다.
그리고 주문을 외우거나, 수업을 듣거나, 점수를 얻는 행동도 할 수 있습니다.
즉, 학생이라는 존재는 다음 두 가지를 가지고 있습니다.
| 구분 | 설명 |
| 데이터 | 이름, 나이, 기숙사, 점수 |
| 행동 | 주문 외우기, 수업 듣기, 점수 얻기 |
이것이 바로 객체의 핵심입니다.
객체는 데이터와 행동을 함께 가진 하나의 단위입니다.
3. 클래스와 객체의 차이
OOP를 이해하려면 클래스와 객체를 구분해야 합니다.
클래스는 설계도입니다.
객체는 그 설계도를 바탕으로 실제 만들어진 결과물입니다.
마법학교식으로 비유하면 이렇습니다.
| 개념 | 호그와트 비유 | 프로그래밍 의미 |
| 클래스 | 학생 명부 양식 | 객체를 만들기 위한 설계도 |
| 객체 | 해리, 헤르미온느, 론 | 실제로 만들어진 개별 존재 |
| 속성 | 이름, 기숙사, 점수 | 객체가 가진 데이터 |
| 메서드 | 주문 외우기, 공부하기 | 객체가 할 수 있는 행동 |
예를 들어, Student라는 클래스가 있다고 해보겠습니다.
이 클래스는 학생을 만들기 위한 설계도입니다.
그리고 이 설계도로 만든 실제 학생 객체가 Harry, Hermione, Ron입니다.
4. Dart 코드로 보는 OOP 예시
Flutter 개발자라면 Dart 코드로 보면 더 쉽게 이해할 수 있습니다.
class Student {
String name;
String house;
int point;
Student(this.name, this.house, this.point);
void castSpell() {
print('$name 학생이 마법 주문을 외웠습니다.');
}
void addPoint(int score) {
point += score;
print('$house 기숙사에 $score점이 추가되었습니다.');
}
}
void main() {
Student harry = Student('Harry', 'Gryffindor', 0);
harry.castSpell();
harry.addPoint(10);
}
위 코드에서 Student는 클래스입니다.
그리고 harry는 Student 클래스로 만든 객체입니다.
name, house, point는 속성입니다.
castSpell(), addPoint()는 메서드입니다.
즉, 객체는 단순히 데이터를 담는 상자가 아닙니다.
스스로 행동할 수 있는 코드 속의 작은 존재입니다.
5. OOP의 핵심 개념 4가지
객체 지향 프로그래밍에는 자주 등장하는 핵심 개념이 있습니다.
보통 다음 4가지를 많이 이야기합니다.
- 캡슐화
- 상속
- 다형성
- 추상화
하나씩 천천히 살펴보겠습니다.
6. 캡슐화: 중요한 정보는 함부로 열어보지 못하게 하기
캡슐화는 객체 내부의 데이터를 보호하고, 필요한 기능만 외부에 공개하는 방식입니다.
호그와트로 비유하면 마법부의 비밀 문서 보관함과 비슷합니다.
누구나 문서를 직접 열어볼 수는 없습니다.
정해진 절차와 권한을 통해서만 접근할 수 있습니다.
프로그래밍에서도 마찬가지입니다.
객체 내부의 중요한 값을 외부에서 마음대로 바꾸지 못하게 막고, 메서드를 통해 안전하게 접근하게 만듭니다.
class MagicAccount {
int _point = 0;
int get point => _point;
void addPoint(int value) {
if (value > 0) {
_point += value;
}
}
}
여기서 _point는 외부에서 직접 수정하지 못하게 숨겨둔 값입니다.
대신 addPoint()라는 메서드를 통해서만 점수를 추가할 수 있습니다.
이렇게 하면 잘못된 값이 들어오는 것을 막을 수 있습니다.
캡슐화의 핵심은 이것입니다.
데이터를 안전하게 보호하고, 정해진 방법으로만 다루게 만드는 것
7. 상속: 기존 마법 지식을 이어받기
상속은 기존 클래스의 기능을 물려받아 새로운 클래스를 만드는 개념입니다.
호그와트에는 여러 종류의 사람이 있습니다.
- 학생
- 교수
- 교장
이들은 모두 기본적으로 사람입니다.
이름도 있고, 나이도 있고, 말도 할 수 있습니다.
하지만 학생은 수업을 듣고, 교수는 수업을 가르치며, 교장은 학교를 관리합니다.
이럴 때 공통 부분은 Person 클래스에 두고, 세부 역할은 각각의 클래스에서 확장할 수 있습니다.
class Person {
String name;
Person(this.name);
void speak() {
print('$name이 말합니다.');
}
}
class Professor extends Person {
Professor(String name) : super(name);
void teach() {
print('$name 교수가 수업을 가르칩니다.');
}
}
Professor는 Person의 기능을 물려받았습니다.
그래서 speak()도 사용할 수 있고, 자신만의 기능인 teach()도 사용할 수 있습니다.
상속의 핵심은 이것입니다.
공통 기능을 재사용하고, 필요한 부분만 확장하는 것
8. 다형성: 같은 주문도 상황에 따라 다르게 발동된다
다형성은 같은 이름의 기능이 객체에 따라 다르게 동작하는 것을 말합니다.
호그와트식으로 표현하면 이런 느낌입니다.
같은 attack()이라는 행동이 있어도,
학생은 기본 주문을 사용하고, 교수는 고급 마법을 사용하고, 용은 불을 뿜을 수 있습니다.
abstract class Character {
void attack();
}
class Student extends Character {
@override
void attack() {
print('학생이 기본 마법을 사용합니다.');
}
}
class Professor extends Character {
@override
void attack() {
print('교수가 강력한 마법을 사용합니다.');
}
}
void main() {
List<Character> characters = [
Student(),
Professor(),
];
for (var character in characters) {
character.attack();
}
}
여기서 attack()이라는 같은 메서드를 호출했지만, 실제 객체가 무엇인지에 따라 결과가 다르게 나옵니다.
이것이 다형성입니다.
다형성의 핵심은 이것입니다.
같은 명령을 내려도 객체에 따라 다르게 행동하게 만드는 것
9. 추상화: 복잡한 마법 원리는 숨기고 필요한 기능만 보여주기
추상화는 복잡한 내부 구현은 숨기고, 외부에는 필요한 기능만 보여주는 개념입니다.
마법 지팡이를 생각해 보겠습니다.
학생은 지팡이 내부의 목재 구조, 심지 재료, 마법 전달 원리를 모두 알 필요가 없습니다.
그저 지팡이를 들고 주문을 외우면 됩니다.
프로그래밍에서도 마찬가지입니다.
사용자는 내부 로직을 전부 알 필요 없이, 제공된 메서드만 사용하면 됩니다.
abstract class Wand {
void cast();
}
class ElderWand implements Wand {
@override
void cast() {
print('강력한 마법이 발동됩니다.');
}
}
여기서 Wand는 추상적인 개념입니다.
cast()라는 기능이 필요하다는 것만 정의합니다.
실제로 어떻게 마법이 발동되는지는 ElderWand가 구현합니다.
추상화의 핵심은 이것입니다.
복잡한 내부는 숨기고, 필요한 사용법만 드러내는 것
10. OOP를 사용하는 이유
객체 지향 프로그래밍을 사용하는 이유는 단순히 코드가 멋있어 보이기 때문이 아닙니다.
복잡한 프로그램을 더 쉽게 관리하기 위해서입니다.
OOP를 사용하면 다음과 같은 장점이 있습니다.
| 장점 | 설명 |
| 코드 재사용성 증가 | 이미 만든 클래스를 다시 활용할 수 있습니다. |
| 유지보수 용이 | 기능별로 코드가 나뉘어 수정이 쉬워집니다. |
| 확장성 증가 | 새로운 기능을 추가하기 좋습니다. |
| 현실 모델링에 유리 | 현실 세계의 구조를 코드로 표현하기 쉽습니다. |
| 협업에 유리 | 역할별로 객체를 나누면 여러 개발자가 함께 작업하기 좋습니다. |
특히 앱 개발에서는 화면, 사용자, 주문, 결제, 알림, 설정 등 많은 개념을 다루게 됩니다.
이런 요소들을 객체로 나누면 코드 구조가 훨씬 정리됩니다.
11. OOP를 잘못 사용하면 생기는 문제
물론 OOP가 항상 정답은 아닙니다.
잘못 사용하면 오히려 코드가 더 복잡해질 수 있습니다.
초보자가 자주 하는 실수는 다음과 같습니다.
| 실수 | 설명 |
| 너무 많은 상속 사용 | 클래스 관계가 복잡해져 이해하기 어려워집니다. |
| 모든 것을 객체로 만들기 | 단순한 코드까지 과하게 구조화됩니다. |
| 책임이 너무 많은 클래스 | 하나의 클래스가 너무 많은 일을 하게 됩니다. |
| 이름만 객체 지향 | 실제로는 절차 지향 코드를 클래스 안에 넣기만 합니다. |
객체 지향의 핵심은 클래스를 많이 만드는 것이 아닙니다.
역할과 책임을 잘 나누는 것입니다.
12. 좋은 객체 지향 코드를 위한 기준
좋은 OOP 코드는 다음 질문에 답할 수 있어야 합니다.
- 이 객체는 어떤 책임을 가지고 있는가?
- 이 데이터는 이 객체 안에 있는 것이 자연스러운가?
- 이 메서드는 이 객체가 수행하는 것이 맞는가?
- 다른 객체와 너무 강하게 연결되어 있지는 않은가?
- 나중에 기능이 추가되어도 구조가 크게 무너지지 않는가?
예를 들어 학생 객체가 수업을 듣는 것은 자연스럽습니다.
하지만 학생 객체가 학교 전체 예산을 관리한다면 이상합니다.
그것은 학생의 책임이 아니라 학교 관리 시스템의 책임에 가깝습니다.
좋은 객체 지향 설계는 결국 책임을 적절한 위치에 배치하는 일입니다.
13. Flutter 개발에서 OOP는 어디에 쓰일까?
Flutter에서도 OOP는 매우 자주 사용됩니다.
예를 들어 다음과 같은 것들이 모두 객체 지향적인 구조와 연결됩니다.
| Flutter 개념 | OOP 관점 |
| Widget | 화면을 구성하는 객체 |
| StatefulWidget | 상태를 가진 객체 |
| Model 클래스 | 데이터를 표현하는 객체 |
| Repository | 데이터 요청 책임을 가진 객체 |
| Service 클래스 | 특정 기능을 처리하는 객체 |
| Controller / Notifier | 상태 변경을 관리하는 객체 |
예를 들어, 사용자 정보를 다루는 앱이라면 다음처럼 클래스를 만들 수 있습니다.
class User {
final String id;
final String name;
final String email;
User({
required this.id,
required this.name,
required this.email,
});
}
이렇게 User라는 객체를 만들면 사용자 데이터를 하나의 의미 있는 단위로 다룰 수 있습니다.
단순히 String name, String email을 흩뿌려놓는 것보다 훨씬 관리하기 쉽습니다.
14. OOP를 한 문장으로 다시 정리하면
객체 지향 프로그래밍은 현실 세계의 개념을 객체로 나누고,
각 객체가 자신의 데이터와 행동을 책임지도록 만드는 프로그래밍 방식입니다.
조금 더 감성적으로 표현하면 이렇습니다.
프로그램이라는 거대한 마법 세계 안에서, 각각의 객체들이 자신의 역할을 가지고 서로 협력하게 만드는 설계 방식입니다.
학생은 학생의 일을 하고,
교수는 교수의 일을 하고,
지팡이는 지팡이의 일을 하고,
학교는 학교의 일을 합니다.
이처럼 각자의 책임이 분명할 때, 프로그램은 더 안정적이고 이해하기 쉬워집니다.
15. 마무리
OOP는 처음에는 어렵게 느껴질 수 있습니다.
클래스, 객체, 상속, 다형성, 추상화 같은 용어들이 한꺼번에 등장하기 때문입니다.
하지만 핵심은 단순합니다.
프로그램을 객체들의 협력으로 바라보는 것
이 관점만 잡히면 OOP는 훨씬 쉽게 이해됩니다.
호그와트라는 거대한 마법학교가 여러 인물과 장소와 도구들의 상호작용으로 움직이듯이,
좋은 프로그램도 여러 객체들이 각자의 책임을 다하며 함께 동작합니다.
그러니 OOP를 단순한 문법으로만 외우지 말고, 하나의 설계 철학으로 이해해 보시면 좋습니다.
객체 지향 프로그래밍은 코드를 더 길게 쓰기 위한 기술이 아니라,
복잡한 세계를 더 질서 있게 다루기 위한 마법 같은 사고방식입니다.
'개발 종합 > 개발자 기본' 카테고리의 다른 글
| CPU와 GPU 컴퓨터 처리 장치 차이점 | 개발 입문자를 위한 쉬운 정리 (0) | 2026.05.19 |
|---|---|
| [코루틴] Coroutine이란? | 초보개발자도 이해하는 비동기 처리 핵심 개념 (0) | 2026.04.23 |
| 딥링크 Cold Start 상황 완전 정복 | 초보 개발자용 핵심 정리 (0) | 2026.04.21 |
| 서킷 브레이커 장애를 막는 마지막 방어선 | 초보 개발자 이해용 정리 (0) | 2026.04.21 |
| JWT 인증 구조 이해 (1) | 2026.04.21 |