객체지향 프로그래밍이란?
La 객체 지향 프로그래밍(OOP) 그것은 프로그래밍 패러다임이다 소프트웨어를 구성하는 것은 사물 기능과 논리보다는. 객체 데이터(속성)와 동작(메서드)을 단일 엔터티로 결합하여 방법을 반영합니다. 현실 세계에 대해 생각해 봅시다.
💡 기본 개념
- 수업: 객체를 생성하기 위한 청사진(템플릿)
- 물체: 특정 데이터가 포함된 클래스의 인스턴스
- 속성: 객체 데이터/속성
- 행동 양식: 객체 기능/동작
절차적에서 OOP까지
절차적 프로그래밍에서는 데이터와 함수가 분리됩니다. OOP에서는 나는 함께 캡슐화됨, 코드를 더욱 모듈화되고 직관적으로 만듭니다.
절차적 접근:
// Dati separati
let userName = "Mario";
let userAge = 30;
// Funzioni separate
function printUser(name, age) {{ '{' }}
console.log(name, age);
{{ '}' }}
OOP 접근 방식:
// Dati e comportamenti insieme
class User {{ '{' }}
name: string;
age: number;
print() {{ '{' }}
console.log(this.name, this.age);
{{ '}' }}
{{ '}' }}
OOP의 네 가지 기둥
1. 캡슐화
내부 세부 사항을 숨기고 필요한 것만 노출합니다. 액세스 수정자(개인, 보호, 공개).
class BankAccount {{ '{' }}
private balance: number = 0;
deposit(amount: number) {{ '{' }}
if (amount > 0) this.balance += amount;
{{ '}' }}
getBalance() {{ '{' }}
return this.balance;
{{ '}' }}
{{ '}' }}
const account = new BankAccount();
account.deposit(100);
console.log(account.getBalance()); // 100
// account.balance = 999; // ❌ Errore: balance è private
2. 유전
기존 클래스를 기반으로 새 클래스를 생성하고 재사용할 수 있습니다. 기능 확장.
class Animal {{ '{' }}
protected name: string;
constructor(name: string) {{ '{' }}
this.name = name;
{{ '}' }}
move() {{ '{' }}
console.log(`${{ '{' }}this.name{{ '}' }} si muove`);
{{ '}' }}
{{ '}' }}
class Dog extends Animal {{ '{' }}
bark() {{ '{' }}
console.log(`${{ '{' }}this.name{{ '}' }} abbaia`);
{{ '}' }}
{{ '}' }}
const dog = new Dog("Rex");
dog.move(); // "Rex si muove"
dog.bark(); // "Rex abbaia"
3. 다형성
서로 다른 클래스의 객체를 공통 인터페이스를 통해 처리할 수 있습니다. 각 유형에 대한 특정 동작이 있습니다.
interface Shape {{ '{' }}
area(): number;
{{ '}' }}
class Circle implements Shape {{ '{' }}
constructor(private radius: number) {{ '{' }}{{ '}' }}
area() {{ '{' }} return Math.PI * this.radius ** 2; {{ '}' }}
{{ '}' }}
class Square implements Shape {{ '{' }}
constructor(private side: number) {{ '{' }}{{ '}' }}
area() {{ '{' }} return this.side ** 2; {{ '}' }}
{{ '}' }}
// Stesso metodo, comportamenti diversi
function printArea(shape: Shape) {{ '{' }}
console.log(shape.area());
{{ '}' }}
printArea(new Circle(5)); // ~78.5
printArea(new Square(5)); // 25
4. 추상화
필수 기능만 표시하여 복잡성을 숨깁니다. 우리는 객체가 "어떻게" 수행하는지가 아니라 "무엇"을 수행하는지 정의합니다.
OOP를 사용해야 하는 경우
✅ 다음과 같은 경우에 OOP를 사용하세요:
- 문제 도메인 모델은 엔터티 및 관계와 잘 어울립니다.
- 상속을 통한 코드 재사용이 필요합니다
- 프로젝트가 복잡하고 시간이 지남에 따라 성장할 것입니다.
- 팀으로 일하며 명확한 조직이 필요합니다.
❌ 다음과 같은 경우 OOP를 피하세요.
- 문제는 간단합니다(작은 스크립트, 유틸리티).
- 중요한 성능(클래스 오버헤드)
- 함수형 프로그래밍이 더 적합합니다(데이터 변환).
완전한 실제 사례
class Product {{ '{' }}
constructor(
public name: string,
private price: number
) {{ '{' }}{{ '}' }}
getPrice(): number {{ '{' }}
return this.price;
{{ '}' }}
{{ '}' }}
class ShoppingCart {{ '{' }}
private items: Product[] = [];
addItem(product: Product) {{ '{' }}
this.items.push(product);
{{ '}' }}
getTotal(): number {{ '{' }}
return this.items.reduce((sum, item) => sum + item.getPrice(), 0);
{{ '}' }}
checkout() {{ '{' }}
console.log(`Totale: €${{ '{' }}this.getTotal(){{ '}' }}`);
this.items = [];
{{ '}' }}
{{ '}' }}
// Utilizzo
const cart = new ShoppingCart();
cart.addItem(new Product("Laptop", 999));
cart.addItem(new Product("Mouse", 25));
cart.checkout(); // "Totale: €1024"
결론
OOP는 코드를 더욱 체계화하고 재사용 가능하며 유지 관리 가능하게 만드는 강력한 패러다임입니다. 네 가지 기둥(캡슐화, 상속, 다형성, 추상화)이 함께 작동합니다. 강력하고 확장 가능한 소프트웨어를 만드는 것입니다. 향후 기사에서는 각 기둥을 살펴보겠습니다. 고급 실제 사례를 통해 자세히 설명합니다.
🎯 핵심 포인트
- OOP는 데이터와 동작을 사용하여 객체를 중심으로 코드를 구성합니다.
- 클래스 = 청사진, 객체 = 특정 데이터가 포함된 인스턴스
- 4개 기둥: 캡슐화, 상속, 다형성, 추상화
- 시간이 지남에 따라 성장하는 복잡한 프로젝트에 OOP를 사용하세요.







