
📅 2025-09-23
➡️ JavaScript Class에 대해 새롭게 알게 된 것 또는 헷갈리는 부분 정리 + 🤔❓
class 키워드 사용class Car {
// 생성자 메서드
constructor(brand, model) {
this.brand = brand;
this.model = model;
}
// 인스턴스 메서드
displayInfo() {
console.log(`${this.brand} ${this.model}`);
}
}
// 인스턴스 생성
const car1 = new Car("Hyundai", "Veloster");
car1.displayInfo(); // Hyundai VelosterCar 클래스는 brand와 model 속성을 가지고 있으며, displayInfo 메서드를 정의new 키워드를 사용하여 Car 클래스의 인스턴스를 생성하고, displayInfo 메서드를 호출constructor 키워드를 사용하여 정의class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`안녕하세요, 제 이름은 ${this.name}, 나이는 ${this.age}살입니다.`);
}
}
const p1 = new Person("Alice", 30);
const p2 = new Person("Bob", 25);
p1.greet(); // 안녕하세요, 제 이름은 Alice, 나이는 30살입니다.
p2.greet(); // 안녕하세요, 제 이름은 Bob, 나이는 25살입니다.getter와 setter를 사용하여 Class의 속성에 접근할 수 있음getter : 클래스 속성(프로퍼티)의 값을 읽어올 때 사용하는 특별한 메소드setter : 클래스 속성(프로퍼티)의 값을 설정(변경)할 때 사용하는 특별한 메소드get프로퍼티명(), set프로퍼티명() 형식으로 메서드 이름을 지음const user = {
name : "홍길동",
age: 20,
getName(){
return user.name;
}
setName(value){
user.name = value;
}
}
console.log( user.getName());
user.setName("김철수"); const user = {
name: "홍길동",
age: 20,
get fullName() {
return this.name;
},
set changeName(value) {
this.name = value;
}
};
console.log(user.fullName); // 홍길동
user.changeName = "김철수";
console.log(user.fullName); // 김철수❗ 주의할 점
- Getter만 선언
getter메서드만 있어 값을 할당하려고 하면 에러 발생const user = { name: "홍길동", age: 20, get fullName() { return this.name; } }; user.fullName = "김철수" // Error- Setter 무한 루프
get,set둘다 이름이 같은경우 무한 루프에 빠짐const user = { name: "홍길동", age: 20, get name(){ return this.name; } set name(value){ user.name = value; } } user.name = "김철수";- 클래스 속성을 그냥
.value처럼 직접 접근해도 되는데 왜 쓸까?
- 데이터 보호
- 데이터 검증 (유효성 검사)
- 코드 일관성
static 키워드를 붙이면, 그 메서드는 클래스 자체에 속하는 함수가 됨class Calculator {
static add(a, b) {
return a + b;
}
}
console.log(Calculator.add(2, 3)); // 5class Parent{
...
}
class Child extends Parant{
...
}
Child 클래스가 Parent 클래스를 상속Child를 통해서 부모 클래스 Parent의 정적 메소드와 정적 속성을 사용할 수 있음Parent의 인스턴스 메서드와 인스턴스 속성을 자식 클래스 Child의 인스턴스에서 사용 할 수있음class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name}가 소리를 냅니다.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name}가 멍멍 짖습니다.`);
}
}
const d = new Dog("Rex", "Labrador");
d.speak(); // Rex가 멍멍 짖습니다.super를 함수로 호출하면 부모 클래스의 생성자 호출super.prop과 같이 써서 부모 클래스 prop 정적 속성에 접근 가능super.prop와 같이 써서 부모 클래스의 prop 인스턴스 속성에 접근 가능class Person {
constructor(name, age){
this.name = name;
this.age = age;
}
printInfo(){
return `제 이름은 ${this.name} 입니다 나이는 ${this.age}` ;
}
}
class Person2 extends Person{
constructor(name, age, hobby){
super(name, age);
this.hobby = hobby;
}
printInfo(){
return super.printInfo() + ` 취미는 ${this.hobby} 입니다. `
}
}
const personName = new Person2("홍길동", 20, "스노우보드");
console.log( personName.printInfo());
# 기호를 붙여 private 필드/메서드를 만들 수 있음class User {
#password = "1234"; // private 변수
checkPassword(pw) {
return this.#password === pw;
}
}
const u = new User();
console.log(u.checkPassword("1234")); // true
console.log(u.#password); // 오류: 외부 접근 불가
_의 의미와 용도_ 붙은 변수: 이 속성은 private처럼 다뤄야 한다라는 의미 → 일종의 관습(convention)_는 개발자에게 신호를 주는 역할이며, 언어적으로 접근을 막지는 않음private 필드는 #로 선언