객체지향프로그래밍이란 객체간의 상호작용을 중심으로 하는 프로그래밍을 의미한다.
객체는 객체의 상태를 나타내는 변수
와 객체의 행동을 나타내는 함수
로 이루어진다.
즉, 객체지향프로그래밍이란 프로퍼티와 메소드로 이루어진 각 객체들의 상호작용을 중심으로 코드를 작성하는 것이다.
<-> 절차 지향 프로그래밍 : 변수와 함수를 가지고 작업의 순서에 맞게 코드를 작성하는 것
Object literal이나 Constructor function 같은 방법도 있지만 주로 Class
를 이용한 방법을 많이 쓰는 편이다.
class User{
constructor(name, age){
this.name = name;
this.age = age;
}
welcome(message){
console.log(`message ${this.name}`);
}
}
const hyevvy = new User('hyevvy', 1);
hyevvy.welcome('hi') // hi hyevvy 출력
객체를 만들고 났을 때 사용하는 사람은 객체 내부에 존재하는 복잡한 원리를 모르더라도 객체 외부에 공개된 프로퍼티나 메소드만을 가지고도 객체를 사용할 수 있어야 한다. 이를 위해 주석을 달거나 이해하기 쉬운 프로퍼티명, 메소드명을 짓는 것이 중요하다.
객체 외부에서 함부로 접근하면 안 되는 프로터피나 메소드에 직접 접근할 수 없도록 하는 것이다. 필요한 경우 공개된 메소드를 통해서만 접근할 수 있도록 해야한다.
class User{
constructor(name, age){
this.name = name;
this.age = age;
}
get name(){
return this._name;
}
set name(newName){
if(newName.length > 3){
this._name = newName;
} else {
throw new Error('이름은 세글자 이상으로 부탁드려요')
}
}
}
이 때 user.name 을 실행했을 때 실제로는 name 이라는 getter 메소드
가 실행된 것이다
상속은 부모 클래스의 프로터피와 메소드를 자식 클래스가 그대로 물려받는 것이다.
class User {
constructor(name, age){
this.name = name;
this.age = age;
}
welcome(message){
console.log(`${message} ${this.name}`);
}
}
class VipUser extends User {
constructor(name, age, grade){
super(name, age); // 부모인 User 클래스의 name과 age 프로퍼티를 그대로 물려받고 있음
this.grade = grade;
}
welcome(message){
console.log(`${message} ${this.name} vip member!`);
}
}
const hyevvy = new VipUser('hyevvy', 1, 'vip');
hyevvy.welcome('hi'); // message hyevvy vip member!
다형성은 하나의 변수가 다양한 종류의 클래스로 만든 여러 객체를 가리킬 수 있음을 의미한다.
3번 상속 예시 코드에서
const otherPerson = new User('anyone', 2);
const hyevvy = new VipUser('hyevvy', 1, 'vip');
const users = [otherPerson, hyevvy];
for(let user of users){
user.welcome('hi');
}
이 때 user
는 User 클래스로 만든 객체를 가리키기도 하고 VipUser 클래스로 만든 객체를 가리키기도 한다. welcome 메소드를 호출할 때 어떤 클래스로 만든 메소드가 호출되느냐에 따라 결과는 달라진다.
특히 부모클래스의 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩(Overriding)
이라고 한다. 이 때, 메서드의 이름, 매개변수의 개수와 타입, 반환 타입이 부모 클래스의 메서드와 동일해야한다!
오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 수정하여 다양한 동작을 구현하거나 특정한 동작을 추가하거나 재정의할 때 유용하다.