객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍의 한 패러다임으로, 코드를 더 효율적이고 유지 관리하기 쉽게 만들기 위한 목표를 가지고 있습니다. 자바스크립트 예제를 통해 객체 지향 프로그래밍에 대해 알아보려 합니다.
초기의 프로그래밍 언어는 절차적 언어라고 불렸습니다. 절차 지향 프로그래밍은 일련의 명령어와 절차를 순차적으로 수행하며 문제를 해결하는 방식입니다. 반면 우리가 알아볼 객체 지향 프로그래밍은 데이터와 기능을 하나의 객체에 묶어서 프로그램을 구성하는 방식입니다.
캡슐화(Encapsulation): 객체의 데이터와 기능을 함께 묶고, 외부에서 접근이 제한된 인터페이스를 통해서만 이를 사용할 수 있게 합니다. 이를 통해 코드의 복잡성을 낮추고, 관리하기 쉽게 만듭니다.
추상화(Abstraction): 복잡한 문제를 간단한 부분으로 나누어 처리합니다. 이를 통해 불필요한 세부 정보를 숨기고, 필요한 기능만을 노출하여 프로그램의 복잡성을 줄입니다.
상속(Inheritance): 기존의 클래스의 기능을 재사용하거나 확장할 수 있게 합니다. 이를 통해 코드의 중복을 줄이고, 유지 보수를 용이하게 합니다.
다형성(Polymorphism): 하나의 인터페이스나 클래스를 다양한 방식으로 구현할 수 있게 합니다. 이를 통해 코드의 유연성과 재사용성을 높입니다.
자바스크립트에서는 get, set을 사용하여 캡슐화를 구현할 수 있습니다.
class Circle {
constructor(radius) {
this.#radius = radius;
}
get radius() {
return this.#radius;
}
set radius(value) {
if (value < 0) {
throw new Error('Radius cannot be negative.');
}
this.#radius = value;
}
}
const circle = new Circle(5);
console.log(circle.radius); // 출력: 5
circle.radius = 10; // 반지름을 10으로 변경
console.log(circle.radius); // 출력: 10
위 예제에서 Circle 클래스는 #radius라는 private 필드를 가지며, 이를 외부에서 직접 접근하지 않고 get과 set 메소드를 통해 접근합니다. 이를 통해 클래스의 내부 구현을 외부로부터 숨기고, 필요한 기능만 노출하여 캡슐화와 추상화를 구현하였습니다.
자바스크립트에서는 extends 키워드를 사용하여 클래스 간 상속을 구현할 수 있습니다. 아래 예제에서 Dog 클래스는 Animal 클래스를 상속받고 있습니다.
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // 출력: Rex barks.
Dog 클래스는 Animal 클래스의 speak 메소드를 재정의하여, 동일한 메소드 이름을 가지지만 다른 동작을 수행하도록 구현하였습니다.
자바스크립트에서는 상속과 메소드 재정의를 통해 다형성을 구현할 수 있습니다.
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
class Cat extends Animal {
speak() {
console.log(`${this.name} meows.`);
}
}
function makeAnimalSpeak(animal) {
animal.speak();
}
const dog = new Dog('Rex');
const cat = new Cat('Tom');
makeAnimalSpeak(dog); // 출력: Rex barks.
makeAnimalSpeak(cat); // 출력: Tom meows.
위 예제에서 makeAnimalSpeak 함수는 Animal 클래스를 상속받은 Dog와 Cat 객체를 모두 처리할 수 있습니다. 이처럼 서로 다른 클래스에서 동일한 메소드 이름을 가지지만 다른 동작을 수행하는 것이 다형성의 한 예입니다. 이를 통해 다형성을 활용하여 객체 지향 프로그래밍의 장점을 실현할 수 있습니다.
객체 지향 프로그래밍은 캡슐화, 추상화, 상속, 다형성과 같은 원칙을 통해 코드의 재사용성, 유지 보수성, 확장성을 높이는 프로그래밍 패러다임입니다. 자바스크립트에서는 클래스와 인스턴스를 사용하여 객체 지향 프로그래밍을 구현할 수 있습니다. 이를 활용하여 더 효율적이고 관리하기 쉬운 코드를 작성할 수 있습니다.