객체 지향 프로그래밍의 4대 개념

삶은달걀·2023년 2월 2일
0

추상화

  • 어떤 구체적인 존재를 원하는 방향으로 간략화해서 나타내는 것.

캡슐화

  • 객체의 특정 프로퍼티에 직접 접근하지 못하도록 막는 것
  • 클로저: 어떤 함수와 그 함수가 참조할 수 있는 값들로 이루어진 환경을 하나로 묶은 것.

자바스크립트에서 객체 캡슐화를 하는 건 처음이지만!
프로퍼티 뿐 아니라 함수도 캡슐화가 가능하다.

function createUser(email, birthdate){
    const _email = email
    let _point = 0

    function increasePoint(){
        _point +=1
    }

    const user = {
        birthdate,

        get email(){
            return _email
        },

        get point(){
            return _point
        },

        set email(address){
            if(address.includes('@')){
                _email = address
            }else{
                throw new Error('invalid email address')
            }
        },

        buy(item){
            console.log(`${this.email} buys ${item.name}`)
            increasePoint()
        }
    }
    return user
}

상속

  • 하나의 객체가 다른 객체의 프로퍼티와 메소드를 물려받음
class User{
    constructor(email, birthdate){
        this.email = email
        this.birthdate = birthdate
    }

    buy(item){
        console.log(`${this.email} buys ${item.name}`)
    }

    get email(){
        return this._email
    }

    set email(address){
        if(address.includes('@')){
            this._email = address
        }else{
            throw new Error('invalid email address')
        }
    }
} //Parent Class

class PremiumUser extends User{
    constructor(email, birthdate, level){
        super(email, birthdate)
        this.level = level
    }


    streamMusicForFree(){
        console.log(`Free music streaming for ${this.email}`)
    }
} //Child Class

다형성

  • 많은 형태를 가저고 있는 성질
  • overriding을 통해 구현!
class User{
    constructor(email, birthdate){
        this.email = email
        this.birthdate = birthdate
    }

    buy(item){
        console.log(`${this.email} buys ${item.name}`)
    }

    get email(){
        return this._email
    }

    set email(address){
        if(address.includes('@')){
            this._email = address
        }else{
            throw new Error('invalid email address')
        }
    }
} //Parent Class

class PremiumUser extends User{
    constructor(email, birthdate, level, point){
        super(email, birthdate)
        this.level = level
        this.point = point
    }

    buy(item){
        super.buy(item)
        this.point += item.price * 0.05
    }

    streamMusicForFree(){
        console.log(`Free music streaming for ${this.email}`)
    }
} //Child Class

0개의 댓글