TIL_28_with Wecode 018 JavaScript about Class
🦨 class
클래스는 객체지향 프로그래밍의 핵심입니다.
객체지향 프로그래밍이란, 프로그램을 객체들로 구성하고,
객체들 간에 서로 상호작용하도록 작성하는 방법입니다.
클래스는 { num: 1 } 처럼 생긴 객체(object)를 잘 설계하기 위한 틀은 맞습니다.
그런데 이 때의 객체는 특정로직을 갖고 있는 행동(method)와 변경 가능한 상태(멤버 변수)를 가집니다.
원하는 구조의 객체 틀을 짜놓고, 비슷한 모양의 객체를 공장처럼 찍어낼 수 있습니다.
객체를 매번 만들어서 사용해도 좋지만,
큰 큐모의 객체이거나 비슷한 모양의 객체를 계속 만들어야 한다면,
class라는 설계도를 통해 만들 수 있습니다.먼저, 'ray' 차를 객체로 정의해보겠습니다.
ray 라는 객체는 5개의 프로퍼티를 갖고 있습니다.
각 프로퍼티 이름은 아래와 같습니다.
- name
- price
- getName
- getPrice
- applyDiscount
let ray = { name: 'Ray', price: 2000000, getName: function() { // ray 라는 객체의 getName 프로퍼티 값에 함수가 할당됨. return this.name; }, getPrice: function() { // getPrice 프로퍼티 값 안에 함수가 할당됨. return this.price; }, applyDiscount: function(discount) { // applyDiscount 프로퍼티 값 안에 함수가 할당됨. return this.price * discount; } }
프로퍼티 값에 함수가 할당되었습니다.
이렇게 객체의 프로퍼티 값에는 함수도 넣을 수 있습니다.위에서 getPrice라는 함수는 다음과 같이 호출할 수 있습니다.
const rayPriceByFunction = ray.getPrice(); console.log('함수로 접근 => ' +rayPriceByFunction);
객체 내부에서, 해당 🧘♂️객체의 프로퍼티에 접근하려면
"this"
라는 키워드를 사용할 수 있습니다.
그래서 getPrice 메서드에서 this.price로 price 키에 접근할 수 있었고,
2000000 값을 갖고 올 수 있습니다.
새로운 모델이 나왔다면, 여러 코드를 다시 쓸 필요없이 필요한 정보를 담은 Car라는 클래스(class)를 생성하여 관리할 수 있습니다.class Car { constructor(name, price) { this.name = name; this.price = price; this.department = "선릉지점"; this.salesAmount = 0; } applyDiscount(discount) { return this.price * discount; } addSales() { this.salesAmount++; } }
🦨 생성자(Constructor)
객체(object)의 설계도인 클래스(class)는 문법이 비슷합니다.
둘의 가장 큰 차이는 cunstructor 라는 생성자 함수입니다.
아래와 같이 class로 객체를 생성하는 과정을 '인스턴스화'라고 부릅니다.const morning = new Car('Morning', 2000000);
class를 통해 생성된 객체를 인스턴스라고 부릅니다.
class는 새로운 instance를 생성할 때마다 constructor()메서드를 호출합니다.class Car { // Car 가 클래스를 통해 생성된 객체 constructor(name, price) { this.name = name; this.price = price; } }
- Car는 class이름입니다. 항상 대문자로 시작하고, CamelCase로 작성해야 합니다.
- Car class의 instance를 생성할때마다 constructor메서드가 호출됩니다.
- constructor()메서드는 name, price 2개의 argument(인자)를 받습니다.
- constructor()메서드에 this 키워드를 사용했습니다. class의 실행범위(context)에서 this는 해당 instance를 의미합니다.
- constructor()에서 인자로 넘어오는 name과 price를 사용해 Car instance의 name, price 프로퍼티에 값을 할당했습니다.
- 이렇게 클래스 내에서 name, price와 같이 변경 가능한 상태값이자 class내의 컨텍스트에서 어느 곳에서나 사용할 수 있는 변수를 '멤버 변수'라고 부릅니다.
- 멤버 변수는 'this' 키워드로 접근합니다.
🦨 인스턴스(Instance)
위에서 class instance를 생성했습니다.
인스턴스(Instance)는 class를 통해 생성된 객체입니다.
인스턴스는 class의 property이름과 method를 갖는 객체입니다.
인스턴스 마다 모두 다른 property 값을 갖고 있습니다.const morning = new Car('Morning', 20000000);
- 인스턴스는 Class 이름에 new를 붙여서 생성합니다.
- 클래스 이름 우측에 () 괄호를 열고 닫고, 내부에는 constructor에서 필요한 정보를 인자로 넘겨줍니다.
- Car클래스의 instance를 morning이라는 변수에 저장했습니다.
- 다시 한 번! Car 클래스의 새로운 instance를 생성하려면 new 키워드가 필요합니다. new키워드는 constructor() 메서드를 호출하고 새로운 instance를 return해줍니다.
- 'Morning'이라는 String과 2000000이라는 Number를 Car 생성자에 넘겨주었고, name, price 프로퍼티에 각자의 값이 할당되었습니다.
새로운 차 등록하기.const spaceship = new Car('우주선', 25000000); console.log(spaceship); console.log(spaceship.name); console.log(spaceship.price); console.log(spaceship.applyDiscount(0.5));
🦨 메서드(Methods)
메서드는 함수입니다.
그런데 객체가 프로퍼티 값으로 갖고 있는 것을 메서드라고 부릅니다.
Class의 method는 Object(객체)의 문법과 똑같습니다.
다만 객체는 프로퍼티마다 comma(,)로 구분해줘야 했지만, 클래스는 그렇지 않습니다.
Car 객체에 changeDepartment 메서드를 추가했습니다.class Car { constructor(name, price) { this.name = name; this.price = price; this.department = "선릉지점"; } applyDiscount(discount) { return this.price * discount; } changeDepartment(departmentName) { this.department = departmentName; } } const spaceship = new Car('우주선', 25000000); spaceship; /* 결과 Car { name: '우주선', price: 25000000, department: '선릉지점', __proto__: Car { constructor: ƒ Car(), applyDiscount: ƒ applyDiscount(), changeDepartment: ƒ changeDepartment() } } */ spaceship.name; //우주선 spaceship.price; //25000000
changeDepartment 메서드를 호출해보고 해당 인스턴스의 department 정보가 바뀌었는지 확인해봅시다.
🧘♂️ this?
🦨 Assignment
class 생성을 연습해보겠습니다.
- MyMath라는 class를 생성해주세요.
- constructor에서는 숫자 2개를 인자로 받아 프로퍼티로 저장합니다.
- 총 4개의 메서드를 구현해주세요. getNumber: 두 개의 숫자가 무엇인지 배열로 반환하는 메서드 ex) [1, 2]
- add: 두 개의 숫자를 더하는 메서드
- substract: 두 개의 숫자를 빼는 메서드
- multiply: 두 개의 숫자를 곱하는 메서드
답변:
class MyMath { constructor(number1, number2) { this.number1 = number1; this.number2 = number2; } getNumber(){ let arr = []; arr.push(this.number1); arr.push(this.number2); return arr; } add(){ return this.number1 + this.number2; } substract() { return this.number1 - this.number2; } multiply(){ return this.number1 * this.number2; } }
Author And Source
이 문제에 관하여(TIL_28_with Wecode 018 JavaScript about Class), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@poohv7/TIL27with-Wecode-017-JavaScript-about-Scope저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)