웹(WEB)/자바스크립트(JS)

자바스크립트 객체 지향(프로토타입, 클래스)

마달랭 2024. 8. 5. 15:56
반응형

개요

자바스크립트는 프로토타입 기반 객체지향 프로그래밍 언어이다.

  1. 객체지향 프로그래밍 언어는 class 기반과 prototype 기반이 있다.
  2. class 기반 : C++ / Java / C# / Python
  3. prototype 기반 : JavaScript / Lua / R / Perl
  4. JavaScript는 Prototype 기반 언어으로, 과거 class가 없었으나 ES6부터 Prototype 문법을 이용하여 class 문법이 추가 되었다.
const a = [1, 2, 3];
console.log(a);

 

콘솔을 확인해 보면 프로토타입을 확인할 수 있다.

 

자바스크립트의 모든 객체들의 조상은 “Object” 객체이다.

  1. 자바스크립트는 기본적으로 원시타입을 제외한 모든 타입은 객체
  2. 함수, 객체, 배열 모두 객체
  3. 최상위 객체이며, 객체 생성시 기본적으로 Object를 상속한다.

자바스크립트에서도 Class 사용 가능하다.

실제로는 프로토타입 기반을 편하게 사용하기 위해 class라는 명칭이 붙은 상태

 

예제

1. 클래스 생성

클래스를 생성하고 생성자에 내 이름을 저장 후 내 이름을 출력해 보기

코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Human {
            constructor(name) {
                this.name = name;
            }

            myname() {
                console.log(`내 이름은 ${this.name}`);
            }
        }

        const p1 = new Human("김똥끼");
        p1.myname();
        const p2 = new Human("황똥깡");
        p2.myname();
        const p3 = new Human("베리굳");
        p3.myname();
    </script>
</body>
</html>

 

출력

 

2. 클래스 상속(super 활용)

super 활용 시 두가지 특징이 있다.

  1. 부모 클래스에 정의된 메서드에 접근이 가능
  2. 부모 생성자를 호출 할때 사용

 

실습

1. student 클래스 생성

생성자로 이름, 나이, 자기소개가 들어갈 수 있게 만든 뒤 introduce 메서드 호출 시 이름, 나이, 자기소개를 console.log로 출력하기

 

코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Student {
            constructor(name, age, myself) {
                this.name = name;
                this.age = age;
                this.myself = myself;
            }
            introduce() {
                console.log(this.name);
                console.log(this.age);
                console.log(this.myself);
            }
        }
        const student = new Student("전똥끼", 30, "안녕하세요우!");
        student.introduce();
    </script>
</body>
</html>

 

출력

 

2. Hero 클래스 만들기

batman 인스턴스를 만들어 showHP(), run(), showHP() 메서드 호출하기

HP의 초기값은 100, run() 호출 시 HP 10 감소, showHP() 메서드 호출 시 HP 값 출력

 

코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Hero {
            constructor() {
                this.hp = 100;
            }
            showHP() {
                console.log(this.hp);
            }
            run() {
                this.hp -= 10;
            }
        }
        const batman = new Hero();
        batman.showHP();
        batman.run();
        batman.run();
        batman.showHP();
    </script>
</body>
</html>

 

출력

 

3. 계산기 클래스 만들기

  1. 기본 값 = num 입력하기
  2. add(num) 메서드 : num 만큼 더하기
  3. mult(num) 메서드 : num 만큼 곱하기
  4. sub(num) 메서드 : num 만큼 빼기
  5. divide(num) 메서드 : num 만큼 나누기
  6. getResult(num) 메서드 : 값 출력하기

코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Calc {
            constructor(num) {
                this.num = num;
            }

            add(num) {
                this.num += num;
            }

            mult(num) {
                this.num *= num;
            }

            sub(num) {
                this.num -= num;
            }

            divide(num) {
                this.num /= num;
            }

            getResult() {
                console.log(this.num);
            }
        }

        const calc = new Calc(50);
        calc.add(5)
        calc.mult(2)
        calc.sub(3)
        calc.divide(2)
        console.log(calc.getResult());
    </script>
</body>
</html>

 

출력

 

4. 클래스 상속하기

코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Hero {
            constructor(hp) {
                this.hp = hp;
            }
            
            walk() {
                console.log("조금 빠르게 걷기");
            }
            
            run() {
                this.hp -= 10;
            }
        }

        class SuperMan extends Hero{
            constructor(hp, mp) {
                super(hp)
                this.hp = hp;
                this.mp = mp;
            }
            
            walk() {
                super.walk();
                console.log("완전 빠르게 걷기");
            }

            fly() {
                console.log("fly");
                console.log(this.hp);
            }
        }

        let superman = new SuperMan(100, 100);

        superman.run();
        superman.fly();
    </script>
</body>
</html>

 

출력

728x90
반응형