
클래스와 모듈은 얼핏 보면 비슷해보이지만 사용하는 방법과 그 목적이 다르기에 엄연히 다른 녀석들이다.
무엇이 어떻게 다른지 보다 자세히 살펴보자.
목적 : 클래스는 객체의 템플릿이며, 객체의 속성(데이터)과 메서드(동작)를 정의하는 데 사용됩니다.
사용법: 클래스는 class 키워드를 사용하여 정의하고, 객체를 생성하기 위해 new 연산자를 사용합니다. 클래스 내부에서 객체의 상태와 동작을 정의하고, 이를 인스턴스화하여 사용합니다.
예시 코드
class Person {
//객체의 성질을 정의할 때 사용하는 메소드 constructor
constructor(name, age) {
this.name = name;
this.age = age;
}
//객체 메소드 sayHello()
sayHello() {
console.log(`안녕, 나는 ${this.name}이고, ${this.age}살이야.`);
}
}
const person1 = new Person("junyeong", 25);
person1.sayHello();
목적: 모듈은 코드를 조직화하고 재사용 가능한 단위로 분리하기 위해 사용됩니다. 모듈은 관련된 함수, 변수, 클래스 등을 하나의 파일로 묶어서 다른 파일에서 임포트(가져오기)하여 사용할 수 있게 합니다.
사용법: 모듈은 export 키워드를 사용하여 모듈에서 내보낼 항목을 지정하고, 다른 파일에서 import 키워드를 사용하여 해당 모듈을 가져옵니다.
예시코드
// 모듈 파일: calculator.js
export function add(a, b) {
return a + b;
}
// 다른 파일에서 모듈 사용
import { add } from './calculator.js';
console.log(add(2, 3)); // 5
그렇다면 과연 클래스는 뭐가 좋아서 사용하는걸까?
그 이유는 바로 사용자의 입맛대로 객체를 생성하고 조작할 수 있기 때문이다.
보다 자세한 이야기는 뒤에 "객체지향프로그래밍을 추구하는 이유" 파트에서 다룰 예정이라 여기서는 간략히만 이야기하겠다.
클래스로 생성한 객체는 상속이 가능하다.
비슷한 기능을 하는 다른 성질의 객체를 구현(인스턴스화)해냄으로써 코드의 재사용성을 높여주고 해당 클래스로부터 뿌리내린 다양한 객체들을 같은 인터페이스로 조작이 가능하기에 개발자로 하여금 보다 높은 편의성을 제공해준다.
class를 대게 붕어빵 '틀'이라고 비유하는 이유가 여기있다.
비슷하지만 서로 다른 붕어빵을 찍어내기 때문이다.
정리하면 class를 사용하는 이유는 객체지향프로그래밍의 개념과 장점을 가져감으로써 보다 더 낫게, 보다 더 새롭게 효율적으로 코드를 작성하기 위함이다.
객체지향프로그래밍(Object Oriented Programming)은 일종의 프로그래밍 패러다임 중 하나로, 아래와 같은 다양한 기능들을 통해 많은 개발자들에게 편의를 제공한다.
모듈화와 코드 구조화: OOP는 코드를 객체 단위로 모듈화하고 구조화하는 데 도움을 준다. class를 사용하여 객체를 정의하면 코드를 논리적으로 그룹화하고 필요한 데이터와 동작을 객체 내에 캡슐화가 가능하다. 이렇게 모듈화된 객체는 프로그램 전체에서 재사용 가능하며, 코드의 가독성과 유지보수성을 향상시켜준다.
코드 재사용성: class를 사용하여 정의한 객체는 클래스의 인스턴스로 여러 번 생성이 가능하다. 이로 인해 동일한 코드를 여러 곳에서 재사용할 수 있으며, 코드 중복을 최소화할 수 있다.
캡슐화: OOP는 데이터와 해당 데이터를 조작하는 메서드를 하나의 단위로 묶어 캡슐화를 제공한다. class 내에서 데이터와 메서드를 함께 정의하고 캡슐화하면 데이터의 무결성을 유지하고 외부에서 직접 접근하지 못하도록 보호할 수 있다.
상속과 다형성: class를 사용하여 객체를 정의하면 상속과 다형성을 구현할 수 있다. 상속을 통해 기존 클래스를 확장하고 새로운 클래스를 만들 수 있으며, 다형성을 통해 다양한 객체를 동일한 인터페이스로 다룰 수 있다. 이로써 코드의 확장성과 유연성이 향상된다.
객체의 현실 세계 모델링: OOP는 현실 세계의 개념을 소프트웨어 객체로 모델링하는 데 적합하다. class를 사용하여 객체를 정의하면 소프트웨어가 현실 세계와 유사하게도 동작하게 할 수 있다.
팀 작업의 용이성: OOP는 코드를 객체 단위로 분할하고 추상화하여 다수의 개발자가 동시에 작업하기 쉽도록 한다. 이로 인해 대규모 프로젝트의 협업이 용이해진다.
ㅎㅎ 정말 많다...
요약하면, 많은 개발자들이 객체지향 프로그래밍을 선호하는 이유는 코드의 모듈화, 재사용성, 가독성, 유지보수성, 유연성, 확장성, 캡슐화, 상속, 다형성, 현실 세계 모델링, 팀 작업 용이성 등 다양한 이점을 제공해주어 개발 프로세스를 향상시켜주고 복잡한 문제를 해결하는 데 도움을 주기 때문에 사용하는 것이다.
그렇다면 앞서 계속 강조되었던 class를 사용하여 코드를 모듈화 하는 방법 "클래스 모듈 패턴"에 대해서 다뤄보겠다.
보다 쉬운 이해를 돕고자 예시 코드를 가져와봤다.
아래 코드는 홈페이지에서 사용자의 정보를 관리하는 User 클래스이다.
// User 클래스: 사용자 정보를 관리하는 클래스
class User {
//사용자의 정보를 저장하는 기능을 제공하는 constructor()
constructor(name, email) {
this.name = name;
this.email = email;
this.loggedIn = false; // 초기 로그인 상태는 false로 설정
}
// 로그인 메서드
login() {
this.loggedIn = true;
console.log(`${this.name} 님이 로그인했습니다.`);
}
// 로그아웃 메서드
logout() {
this.loggedIn = false;
console.log(`${this.name} 님이 로그아웃했습니다.`);
}
// 사용자 정보 출력 메서드
displayInfo() {
console.log(`이름: ${this.name}, 이메일: ${this.email}, 로그인 상태: ${this.loggedIn ? '로그인 중' : '로그아웃'}`);
}
}
// 사용 예시
const user1 = new User("junyeong", "junyeong@example.com");
const user2 = new User("chunill", "chunill@example.com");
user1.login();
user1.displayInfo();
user2.login();
user2.displayInfo();
user1.logout();
user1.displayInfo();
코드를 보면 아래와 같은 특징들을 알 수 있다.
모든 사용자는 이름(name), 이메일(email), 로그인 상태(loggedIn)를 가져야 하기에 하나의 객체로 구조화 시킨 모습이다.
login, logout, displayInfo와 같은 메서드를 사용하여 로그인, 로그아웃, 정보 출력 등의 작업을 수행할 수 있다.
이후 사용자가 계속 추가되어도 사용자라면 반드시 가져야할 정보나 추가기능들이 미리 정의되어있기에 언제든지 재사용이 가능하게 되는 것이다!
각 유저가 가져야 할 모든 정보나 기능들이 캡슐화 되어 있기에(User라는 클래스 하나로) 외부에서 접근이 불가능하도록 보안이 되어 있다.

오늘의 본론이자 결론이다.
"그래서 class를 왜 모듈처럼 사용해야 하는건데?"라고 묻는 당신...
그런 당신에게 이렇게 대답하면 될 것 같다.
결국 그놈에... 가독성과 유지보수성 때문이다.><