A Developing Developer

09-2. 클래스의 고급 기능 본문

내일배움캠프 4기/[Javascript]혼자 공부하는 자바스크립트

09-2. 클래스의 고급 기능

H-JJOO 2022. 11. 13. 21:55

  • 상속 : 어떤 클래스가 갖고 있는 유산(속성과 메소드)을 기반으로 새로운 클래스를 만드는 것
class 클래스 이름 extends 부모클래스 이름 {

}

- 사각형 클래스와 정사각형 클래스(상속)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>사각형 클래스와 정사사각형 클래스</title>
    <script>
        // 사각형 클래스
        class Rectangle {
            constructor(width, height) {
                this.width = width
                this.height = height
            }

            // 사각형의 둘레를 구하는 메소드
            getPerimeter() {
                return 2 * (this.width + this.height)
            }

            // 사각형의 넓이를 구하는 메소드
            getArea() {
                return this.width * this.height
            }

        }

        // 정사각형 클래스
        class Square extends Rectangle { // extends : 상속
            constructor(length) {
                super(length, length); // super : 부모의 생성자 함수 호출
            }
        }

        // 클래스 사용
        const square = new Square(10, 20)
        console.log(`정사각형의 돌레 : ${square.getPerimeter()}`)
        console.log(`정사각형의 넓이 : ${square.getArea()}`)
    </script>
</head>
<body>

</body>
</html>

- 상속은 어떤 클래스가 가지고 있는 속성과 메소드를 다른 클래스에 물려주는 형태로 사용


- 부모클래스 : 속성과 메소드를 주는 클래스


- 자식클래스 : 속성과 메소드를 받는 클래스

  • private 속성/메소드 : 클래스 내부에서만 접근할 수 있는 속성/메소드

- 클래스 사용자가 클래스 속성을 의도하지 않은 방향으로 사용하는 것을 막아 클래스의 안정성을 확보하기 위해 나온 문법

class 클래스 이름 {
    # 속성이름
    # 메소드 이름() {

    }
}

- private 속성 사용 (#)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        // 정사각형 클래스
        class Square {
            #length // private 속성 선언

            constructor(length) {
                if (length <= 0){
                    throw '길이는 0 보다 커야합니다.'
                }
                this.#length = length
            }
            getPerimeter() {return 4 * this.#length}
            getArea() {return this.#length * this.#length}
        }
        // 클래스 사용하기
        const square = new Square(10)

        square.#length = - 10 // 클래스 외부에서 접근 못하기때문에 Syntax 에러 발생

        // square.length = -10 // private 속성 때문에 반영 X

        console.log(`정사각형의 돌레 : ${square.getPerimeter()}`)
        console.log(`정사각형의 넓이 : ${square.getArea()}`)
    </script>
</head>
<body>

</body>
</html>

  • 게터(getter) : getOO() 형태로 값을 확인하는 기능을 가진 메소드
  • 세터(setter) : setOO() 형태로 값을 지정하는 기능을 가진 메소드
class 클래스 이름 {
    get 이름 () { return 값 }
    set 이름 (value) { }
}

- get 키워드와 set 키워드 조합하기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>get 키워드와 set 키워드 조합하기</title>
    <script>
        // 정사각형 클래스
        class Square {
            #length // private 속성 선언

            constructor(length) {
                this.length = length
            }

            get length () {
                return this.#length
            }

            get perimeter() {return 4 * this.#length}
            get area() {return this.#length * this.#length}

            set length (length) {
                if (length <= 0){
                    throw '길이는 0 보다 커야합니다.'
                }
                this.#length = length
            }
        }

        // 클래스 사용하기
        const squareA = new Square(10)
        console.log(`한 변의 길이는 ${squareA.length}입니다.`)
        console.log(`둘레 : ${squareA.perimeter}입니다.`)
        console.log(`넓이 : ${squareA.area}입니다.`)

        // 예외 발생시키기
        const squareB = new Square(-10)
    </script>
</head>
<body>

</body>
</html>

 

  • static : 인스턴스를 만들지 않고 사용할 수 있는 속성과 메소드, 일반적인 변수와 함수처럼 사용 가능
class 클래스 이름 {
    static 속성 = 값
    static 메소드() {

    }
}

- static 사용 방법

클래스 이름.속성
클래스 이름.메소드()

- static 키워드 사용하기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>static 키워드 사용하기</title>
    <script>
        // 정사각형 클래스
        class Square {
            #length // private 속성 선언

            static #counter = 0
            static get counter() {
                return Square.#counter
            }

            constructor(length) {
                this.length = length
                Square.#counter += 1
            }

            static perimeterOf (length) {
                return length * 4
            }

            static areaOf (length) {
                return length * length
            }

            get length () { return this.#length}
            get perimeter() {return this.#length * 4}
            get area() {return this.#length * this.#length}


            set length (length) {
                if (length <= 0){
                    throw '길이는 0 보다 커야합니다.'
                }
                this.#length = length
            }
        }

        // 클래스 사용하기
        const squareA = new Square(10)
        const squareB = new Square(20)
        const squareC = new Square(30)

        console.log(`지금까지 생성된 Square 인스턴스는 ${Square.counter}개 입니다.`)
        // static 메소드 사용하기
        console.log(`한 변의 길이가 20 인 정사각형의 둘레는 ${Square.perimeterOf(20)}입니다.`)
        console.log(`한 변의 길이가 30 인 정사각형의 넓이는 ${Square.areaOf(30)}입니다.`)

    </script>
</head>
<body>

</body>
</html>

  • 오버라이드 : 부모가 갖고 있는 메소드와 같은 이름으로 메소드를 선언해서 덮어 쓰는 것

- 오버라이드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>오버라이드</title>
    <script>
        class LifeCycle {
            call() {
                this.a()
                this.b()
                this.c()
            }

            a() { console.log('a() 메소드를 호출')}
            b() { console.log('b() 메소드를 호출')}
            c() { console.log('c() 메소드를 호출')}
        }

        class Child extends LifeCycle { // 오버라이드
            a() {
                console.log('자식의 a() 메소드 호출')
            }
        }

        // 인스턴스 생성
        new Child().call()
    </script>
</head>
<body>

</body>
</html>

a() 메소드 덮어씀

- 부모에 있던 내용 가져오기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>부모에 있떤 내용 가져오기</title>
    <script>
        class LifeCycle {
            call() {
                this.a()
                this.b()
                this.c()
            }

            a() { console.log('a() 메소드를 호출')}
            b() { console.log('b() 메소드를 호출')}
            c() { console.log('c() 메소드를 호출')}
        }

        class Child extends LifeCycle { // 오버라이드
            a() {
                super.a() // 부모의 a() 메소드 호출
                console.log('자식의 a() 메소드 호출')
            }
        }

        // 인스턴스 생성
        new Child().call()
    </script>
</head>
<body>

</body>
</html>

부모의 a() 메소드 호출후 자식이 덮어쓴 a() 메소드 호출

============================================================================================

출처 : 혼자 공부하는 자바스크립트

============================================================================================

내배캠4기 노드트랙 본 캠프 시작 하루전 일요일...

 

미루다 미루다 겨우 다했다(?)

 

아... ch10 리액트는 안하겠지 하고 패스... 몰라~

 

내일부터 본격적인 node 트랙 본 캠프가 시작된다.

 

9 to 9 이 두렵기는하지만, 완주한 나의 모습을 기대하며 오늘은 여기서 마무리하고,

 

그만 쉬어야 겠따... 

(현재시각 : 저녁 9시 54분...)

 

20000