객체지향프로그래밍의 핵심개념 클래스

zin·2023년 8월 25일

클래스 (class)

클래스(class)는 객체지향프로그래밍에서 핵심적인 개념으로 기존 프로토타입 기반 상속을 바탕으로 주어진 이름의 새로운 타입을 만들어내는 도구이다.

필요한 구조와 기능을 미리 정의해놓은 템플릿 역할을 해서, 이 템플릿을 기반으로 객체를 생성하고, 관리하기위해 사용된다. (객체는 클래스의 인스턴스)

클래스 선언하기

class Person {
    // 클래스의 생성자 함수. 하나의 클래스는 하나의 생성자만 정의할 수 있음. 
	// 생성자 함수는 new 키워드가 호출될때 자동으로 실행
    constructor(name) {
      //프로퍼티 선언하고싶을때 constructor안에서 선언
        this.name = name; 
      // 'this'는 생성된 객체를 나타냄. 객체의 'name' 속성을 인자로 설정함.
    }

    // 메소드는 클래스가 생성한 인스턴스를 통해 사용할 수 있음
    sayYourName() {
        console.log(`삐리비리. 제 이름은 ${this.name}입니다.`);
    }
}

이 클래스를 기반으로 객체를 생성하면, 각각의 객체는 자신만의 name 속성과 sayYourName 메소드를 가지게 된다. 이를 통해 각 로봇 객체는 자신의 이름을 말할 수 있게 된다.

클래스 상속받기

기존 클래스에서 상속된 새로운 클래스를 만든다. 상속 받으려면 extends 키워드를 사용해야한다.

class BabyPerson extends Person { 
    constructor(name) {
        super(name); // 부모 클래스 생성자 호출
        this.ownName = 'loopy';
    }

    sayBabyName() {
				// 상속을 받게되면 부모 클래스의 메소드를 사용할 수 있음
        this.sayYourName();
        console.log('Hi');
    }
}

super() 는 부모 클래스의 메소드를 *오버라이딩 할 때 사용된다.
부모 클래스 Person으로 name을 상속받기 때문에 다시 선언,초기화할 필요가 없다.

*오버라이딩(Overriding)은 상속 관계에서 부모 클래스에 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 개념.


메소드를 사용하지 않은 코드

class Zin
  constructor(name,age){ 
    this.info = `내 이름은 ${name}이고,나이는 ${age}야.` 
		
  }
}
console.log(new Zin('loopy',21).info)

//class 상속받기
class babyZin extends Zin{ 
  constructor(info){
    super(info) 
  }
}
console.log(new Zin('zin',25).info)

부모클래스에서 메소드를 정의하지않고, 생성자만 정의하였다.
메소드를 안쓰면 추가적으로 프로퍼티를 선언할수 없어서 추가정보를 담을 수 있는 방법이 제한된다.
새로운 기능을 추가하거나 정보를 확장하기 위해서는 부모 클래스에 있는 프로퍼티를 활용해야한다.


비공개 프로퍼티

#을 이용한 비공개필드라는 개념으로 클래스 내부에서만 접근가능한 비공개 프로퍼티를 만들 수 있다.
class를 통해 인스턴스를 만들었을 때 제약없이 인스턴스의 프로퍼티에 접근하는 것이 가능하다.

getter, setter로 값 제어하기

class Person {
    #password 

    constructor(id, pw) {
        this.id = id;
        this.#password = pw; //'password'비공개 필드 초기화
    }


    sayYourName() {
        console.log(`제 이름은 ${this.id}입니다.`);
    }

      get password(){ //비밀번호 반환
        return this.#password
      }

      set password(pw){ //비밀번호 설정
        this.#password = pw;
      }
   }

        const person = new Person('loopy', 123);
        console.log(person.password)
        person.password = 456 //'set'메소드로 값을 변경
        console.log(person.password) 

객체의 속성을 접근,설정하는 메소드

  • get 메소드는 객체의 속성을 가져올 때 호출되며, 값을 반환한다.
  • set 메소드는 객체의 속성을 설정할 때 호출되며, 값을 설정한다.

객체의 비밀번호 정보를 클래스 내부의 비공개 필드를 통해 관리하고, 클래스 외부에서 getset을 통해 비밀번호를 설정하거나 가져올 수 있다.


클래스를 사용하여 객체를 생성하고 관리하면 코드의 구조가 더 명확하고 간결해지고, 다양한 객체를 생성할 수 있다. 또 상속을 통해 재사용성이 좋고, 확장할 수 있다.
profile
프론트엔드 가보자고-!

0개의 댓글