본문 바로가기

블록체인_9기/💛 JAVASCRIPT

21강(과제X)_230331_Javascript(class 함수, constructor함수, static메소드, getter, setter, extends)

728x90

 

 

 


class 함수

  • Javascript에서 class는 함수의 한 종류이다.
  • class는 단순한 편의 문법이 아니다. (더 자세한 내용은 추후에 살펴보자)

 

 

 


constructor( )

  • 클래스의 생성자 함수이다.
  • 모든 함수의 프로토타입은 'constructor' 프로퍼티를 기본으로 갖고 있기 때문에 constructor 프로퍼티를 명시적으로 만들 필요가 없다.
class student{
    constructor(age, phone, city){
        this.age = age;
        this.phone = phone;
        this.city = city;
    }
    getInfo(){
        return "나이는 : " + this.age + "살이고 핸드폰 번호는 " + this.phone + " 사는 곳 : " + this.city + "이야"
    }
}

let st = new student(30,"010-0000-0000","서울");
console.log(st);		//키값 접근
/*결과
student
age: 30
city: "서울"
phone: "010-0000-0000"
*/
console.log(st.age);    //키값 접근
//결과: 30
console.log(st.phone);    //키값 접근
//결과: 010-0000-0000
console.log(st.getInfo());
//결과: 나이는 : 30살이고 핸드폰 번호는 010-0000-0000 사는 곳 : 서울이야

 

 

 


static

  • static 키워드는 정적 메소드를 정의한다.
    • 정적 메서드는 클래스의 인스턴스 없이 호출이 가능하며 클래스가 인스턴스화되면 호출할 수 없다.
    • 정적 메소드는 일반적으로 공용함수를 만들기 위해 사용한다.
  • 클래스를 동적할당할 때마다 생성되지 않는다.
    • 인스턴스를 생성할 때 더 생성되지 않는다.
class Character{
    constructor(hp, mp, atk){
        this.hp = hp;
        this.mp = mp;
        this.atk = atk;
    }
    getState(){
        return this.hp + this.mp + this.atk;
    }
    static getAtk(n){
        return n.atk;
    }
}


let ca = new Character(100,100,100);

console.log(ca);
/*결과
Character
atk: 100
hp: 100
mp: 100
*/

//이렇게 생성한 인스턴스에서 호출하면 안된다.
//console.log(ca.getAtk(1));// 결과가 불러와지지 않는다.

console.log(Character.getAtk(ca));
//결과: 100

 

 

 


getter와 setter

  • class함수도 getter나, setter를 지원한다.
  • 클래스의 값을 가져오거나 설정할 때 getter와 setter를 제공해준다.
  • 클래스의 값에 접근할 때 직접 변수에 접근하는 형태가 아닌, get과 set을 통한 접근방법의 장점
    • 내부구조를 캡슐화 하는데 좋다.
    • 전역적으로 데이터가 사용되지 않게 위험성을 방지해준다.
class Product{
    constructor(name, price){  
        this.name = name;
        this.price = price;
    }

    get getName(){
        return "제품이름 : " + this.name;
    }
    set setPrice(price){
        this.price = price;
    }
}

let pr = new Product("갤럭시 노트", 1000000);

console.log(pr);
/*결과
Product
name: "갤럭시 노트"
price: 1000000		//setter로 price 가격을 수정하기 전의 결과값
getName: (...)
*/


//getter를 확인해보자
console.log(pr.getName);
//결과: 제품이름 : 갤럭시 노트

//setter를 확인해보자
pr.setPrice = 2000;     //price 값이 수정된다.
console.log(pr);    
/*결과
Product
name: "갤럭시 노트"
price: 2000
getName: (...)
*/

 

 

 


extends

  • 클래스를 상속할 수 있다.
    • 자식 클래스가 부모 클래스를 상속받아서 부모 클래스의 기능을 사용할 수 있다.
class Mother{
    constructor(name, age){     //생성자 함수
        this.name = name;
        this.age = age;
    }
    getInfo(){
        return console.log(`이름은 : ${this.name} 나이는 : ${this.age} 입니다.`)
    }
}
let temp = new Mother("아무개", 30);
temp.getInfo();
//결과: 이름은 : 아무개 나이는 : 30 입니다.


class Child extends Mother{
    //비워놓자
    //비워놓으면 자동으로 생성자가 만들어진다.
    //constructor 자동으로 생성된다.
}

let temp2 = new Child('나는 자식', 30);
temp2.getInfo();
//결과: 이름은 : 나는 자식 나이는 : 30 입니다.
  • 부모의 함수를 받아서 오버라이딩(재정의) 할 수 있다.
class Animal{       //동물이라는 클래스
    constructor(name){      //생성자 함수
        this.name = name        //초기화
        this.speed = 0;         //초기화
        this.age = 20;          //기본값 지정
    }
    run(speed){
        this.speed += speed;
        console.log(`${this.name}은 ${this.speed}로 달리는 중 나는 부모의 함수야`);
    }
    stop(){
        this.speed = 0;
        console.log(`${this.name}이 멈춤`)
    }

}

let ani = new Animal("동물");
ani.run(10);		//결과: 동물은 10로 달리는 중 나는 부모의 함수야
ani.stop();		//결과: 동물이 멈춤


class Cat extends Animal{
    //부모의 함수를 받아서 오버라이딩
    //run이라는 함수가 없으면 부모에서 상속받은 run함수를 실행하고
    //run이라는 함수가 재정의 되면 재정의된 함수를 사용할 수 있다.(함수 오버라이딩)
    run(speed){
        this.speed = speed;
        console.log(`${this.name}은 ${this.speed}로 달리는 중 나는 자식의 오버라이딩 함수야`);
    }
    speak(){
        console.log("야옹");
    }
    stop(){
        //재정의 했음
        //부모의 stop을 실행 -> 재정의해서 사용할 수는 있는데
        //상속받은 부모의 클래스 키워드로 부모의 함수를 실행시킬 수 있다.
        //상속받은 부모의 클래스 키워드는 super
        super.stop();
        //본인을 참조해서 본인의 함수 실행
        this.speak();       //결과: 야옹
    }
}

let cat = new Cat("때껄룩");
cat.run(20);	//결과: 때껄룩은 20로 달리는 중 나는 자식의 오버라이딩 함수야
cat.stop();		//결과: 때껄룩이 멈춤
  • 상속 클래스는 반드시 부모 클래스의 생성자 함수를 호출해서 사용하여야 한다.
    • 상속 클래스의 생성자에서 super(...)을 호출하여 사용할 수도 있다.
    • 일반 클래스가 new와 함께 실행되면, 빈 객체가 만들어지고 this에 이 객체를 할당한다.
    • 반면, 상속 클래스의 생성자 함수가 실행되면, 일반 클래스에서 일어난 일이 일어나지 않는다.
      • 상속 클래스의 생성자 함수는 빈 객체를 만들고 this에 이 객체를 할당하는 일을 부모 클래스의 생성자가 처리해주길 기대한다.
class Human{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
}

class Man extends Human{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
}

let ma = new Man("ㅎㅎ", 30);
console.log(ma);	//결과: 에러
728x90