λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

JavaScript

JavaScript (ES6) - class 와 object 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°

글을 μž‘μ„±ν•˜κΈ°μ— μ•žμ„œ 이 κ²Œμ‹œκΈ€μ˜ 지식은 유튜브 λ“œλ¦Όμ½”λ”© by μ—˜λ¦¬λ‹˜μ˜ λ™μ˜μƒμ΄ μΆœμ²˜μž„μ„ μ•Œλ €λ“œλ¦½λ‹ˆλ‹€.

https://www.youtube.com/watch?v=1Lbr29tzAA8&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=7

 

 

Class와 Object κ°œλ… 정리

 

Javaλ₯Ό λ°°μš°λ©΄μ„œ 객체지ν–₯에 λŒ€ν•΄ μ‘°κΈˆμ΄λ‚˜λ§ˆ 배운 적이 μžˆλŠ”λ° μ΄λ²ˆμ— μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό λ°°μš°λ©΄μ„œ λ‹€μ‹œ ν•œλ²ˆ 정리할 ν•„μš”μ„±μ΄ μžˆλ‹€κ³  λŠκ»΄μ‘Œλ‹€

​

class λž€ μƒμ„±ν•˜κ³ μž ν•˜λŠ” 물체의 μ’…λ₯˜ λ˜λŠ” 틀이라고 μƒκ°ν•˜λ©΄ νŽΈν•˜κ² λ‹€

 

 

class person {
  name;
  age;
  spaek();
]

 

μœ„λŠ” person μ΄λΌλŠ” 클래슀λ₯Ό λ§Œλ“€μ—ˆλŠ”λ° μ‚¬λžŒμ€ 이름과 λ‚˜μ΄λΌλŠ” ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§€κ³  있고

spaek() function이 μžˆλŠ”λ°

​

nameκ³Ό ageλ₯Ό 속성 ( field )

spaek() λ₯Ό 행동 ( method ) 라고 ν•œλ‹€

즉 ν΄λž˜μŠ€λž€ fields 와 methodκ°€ μ’…ν•©μ μœΌλ‘œ λ¬Άμ—¬μžˆλŠ” 것을 λ§ν•œλ‹€

κ°„ν˜Ή 클래슀 내뢀에 methodλŠ” λ“€μ–΄μžˆμ§€ μ•Šκ³  field만 λ“€μ–΄μžˆλŠ” 경우λ₯Ό data class 라고 λ§ν•œλ‹€

​

 

 

 

클래슀λ₯Ό λΆ•μ–΄λΉ΅μ˜ 틀이라고 κ°€μ •ν•΄ λ³΄μ•˜μ„ λ•Œ 클래슀 μžμ²΄μ—λŠ” 데이터가 λ“€μ–΄μžˆμ§€

μ•Šκ³  μ–΄λ–€ λ°μ΄ν„°λ§Œ λ“€μ–΄μ˜¬ 수 μžˆλ‹€κ³  μ§€μ •ν•΄λ†“λŠ” 것이닀

 

μ‹€μ œλ‘œ 이 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ 데이터λ₯Ό λ„£μ–΄μ„œ λ§Œλ“œλŠ” 것이 λ°”λ‘œ object ( 객체 ) 이닀 .

 

 

 

 

 

ν΄λž˜μŠ€μ— νŒ₯μ΄λΌλŠ” fieldλ₯Ό λ„£μ–΄ λ§Œλ“  object !

 

objectλŠ” 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ ꡉμž₯히 많이 λ§Œλ“€ 수 μžˆλ‹€

ν΄λž˜μŠ€λŠ” μ •μ˜λ§Œ ν•˜λŠ” κ²ƒμ΄λΌμ„œ μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€μ§€ μ•Šμ§€λ§Œ

μ˜€λΈŒμ νŠΈλŠ” λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€λŠ” 것이닀

 

 


 

 

Classλ₯Ό μ„ μ–Έν•˜λŠ” 방법

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” 졜근인 ES6 이후에 ν΄λž˜μŠ€λΌλŠ” κ°œλ…μ΄ λ„μž…λ˜μ—ˆκΈ° λ•Œλ¬Έμ—

κ·Έ μ΄μ „μ—λŠ” 였브젝트둜만 λ§Œλ“€μ—ˆλ‹€κ³  ν•œλ‹€.

 

클래슀의 μ•ž κΈ€μžλŠ” 항상 λŒ€λ¬Έμžμ—¬μ•Ό ν•œλ‹€κ³  λ°°μ› λ‹€

 

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

 

 

μœ„μ™€ 같이 Person μ΄λΌλŠ” ν΄λž˜μŠ€μ— μƒμ„±μž ν•¨μˆ˜ constructorλ₯Ό μ΄μš©ν•΄ name κ³Ό age 데이터λ₯Ό 전달받아

이 클래슀 내에 μ‘΄μž¬ν•˜λŠ” this 둜 ν‘œν˜„λœ name κ³Ό age 에 ν• λ‹Ήν•˜κ²Œ λœλ‹€

// 이것이 fields !

​

그리고 κ·Έ μ•„λž˜μ—

 

spaek() {
  console.log(`${this.name}: hello!`);
}

 

μ΄λ ‡κ²Œ method λ₯Ό μ„ μ–Έν•˜λ©΄ λœλ‹€

method의 μ½˜μ†”μ— 좜λ ₯λ˜λŠ” 값은 ( this.name에 λ°›μ•„μ˜¨ κ°’ ) : hello ! λΌλŠ” κ²°κ³Όκ°€ 좜λ ₯이 λœλ‹€

 

 


 

Object 생성

 

μœ„μ—μ„œ λ§Œλ“  클래슀 μ•ˆμ— Song μ΄λΌλŠ” 객체λ₯Ό λ§Œλ“€μ–΄ 보도둝 ν•˜μž

μ˜ˆμ‹œλ₯Ό μœ„ν•΄ μœ„μ—μ„œ μƒμ„±ν•œ 클래슀λ₯Ό κΈ°μ€€μœΌλ‘œ ν•˜λ©΄

 

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  spaek() {
    console.log(`${this.name}: hello!`);
  }
}

 

μ΄λ ‡κ²Œ μ„ μ–Έλœ ν΄λž˜μŠ€μ— new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ songμ΄λΌλŠ” Objectλ₯Ό 생성해 보도둝 ν•˜μž

 

 

const song = new Person('song', 25);

​

μœ„μ™€ 같이 new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ objectλ₯Ό μƒμ„±ν•˜μ˜€λ‹€

κ΄„ν˜Έ μ•ˆμ— μˆœμ„œλŒ€λ‘œ 'song'은 name에, 25λΌλŠ” 값은 age에 ν• λ‹Ήλœλ‹€

​

이제 이 값을 좜λ ₯함과 λ™μ‹œμ— speak λ©”μ†Œλ“œλ„ μ‚¬μš©ν•΄λ³΄λ„λ‘ ν•˜μž

 

console.log(song.name);  
console.log(song.age);
song.spaek();

 

μœ„μ—μ„œ Object의 이름을 song 으둜 넀이밍 ν–ˆκΈ° λ•Œλ¬Έμ— song 뒀에 . 을 λΆ™μ—¬μ„œ name ν”„λ‘œνΌν‹°λ₯Ό κ°€μ Έμ˜¨λ‹€

μ•„λž˜λ„ λ§ˆμ°¬κ°€μ§€ !

​

결과값은 μ•„λž˜μ™€ 같이 좜λ ₯λœλ‹€ !

 

song
20
song: hello!

 

 


 

Getter & Setter

 

getter λŠ” ν΄λž˜μŠ€μ— μ„€μ •ν•˜λŠ” 것이며

객체 λ‚΄λΆ€μ˜ νŠΉμ • 값을 μ‘°νšŒν•  λ•Œ λ‚˜μ™€μ§€λŠ” 값을 μ„€μ •ν•˜λŠ” 것이닀

 

 

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
 get age() {
   return this._age;
}

 

 

μœ„μ—μ„œ μ„ μ–Έν•œ ν΄λž˜μŠ€μ— getμ΄λΌλŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ Person 클래슀둜 λ§Œλ“€μ–΄μ§„ μ˜€λΈŒμ νŠΈμ— age λ₯Ό

μ‘°νšŒν•˜λ €κ³  ν•  λ•Œ this._age λΌλŠ” 값이 좜λ ₯λ˜λ„λ‘ ν•œλ‹€

​

μ΄λ•Œ getter와 setter ν•¨μˆ˜ 내뢀에 ν”„λ‘œνΌν‹° 이름은 _ λ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ뢄해야 ν•œλ‹€!

 

 

setter λŠ” 객체의 값에 μƒˆλ‘œμš΄ 값을 μ‚½μž…ν•˜λ €κ³  ν•  λ•Œ νŠΉμ •ν•œ 쑰건을 μ£Όμ–΄ 쑰건에 μ£Όμ–΄μ§„ κ°’μ˜ λ²”μœ„λ₯Ό

λ²—μ–΄λ‚˜κ²Œ 되면 μ§€μ •ν•œ 값이 μ‚½μž…λ˜μ–΄μ§€λŠ” 것이닀

μ‚½μž…ν•˜λ €λŠ” 값이 value λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄κ°„λ‹€

 

set age(value) {
  if ( value < 0 ) {
    console.log('age 에 0 보닀 μž‘μ€κ°’μ„ μ‚½μž…ν•  수 μ—†μŠ΅λ‹ˆλ‹€');
}

 

μ΄λ ‡κ²Œ if 문을 톡해 0보닀 μž‘μ„ 경우 κ²½κ³  λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜κ²Œ ν•œλ‹€

​

λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ‚Όν•­μ—°μ‚°μžλ₯Ό 톡해 0보닀 μž‘μœΌλ©΄ 0이 μ‚½μž…λ˜κ³ 

아닐 κ²½μš°μ—λŠ” value 값이 μ‚½μž…λ˜λ„λ‘ ν•˜λŠ” 방식이닀

 

set age(value) {
  this._age = value < 0 ? 0 : value;
}

 

 


 

상속 & λ‹€μ–‘μ„±

 

상속은 μ‰½κ²Œ λ§ν•΄μ„œ 상속세λ₯Ό λ‚΄λŠ” κ²ƒμ²˜λŸΌ

λΆ€λͺ¨μ˜ 클래슀의 데이터λ₯Ό μžμ‹μ˜ λ°μ΄ν„°μ—μ„œ 상속받아 λ˜‘κ°™μ΄ μ“Έ 수 있게 ν•΄μ£ΌλŠ” 것이닀

 

 

class Shape {
  constructor(width, height, color) {
    this.width = width;
    this.height= height;
    this.color= color;
  }

  draw() {
    colsole.log(`drawing ${this.color} color of`);
  }
  getArea() {
    return this.width * this.height;
  }

 

 

μœ„μ™€ 같이 Shape μ΄λΌλŠ” 클래슀 μ•ˆμ— ν•„λ“œμ™€ λ©”μ†Œλ“œλ“€μ„ Triangle μ΄λΌλŠ” 클래슀λ₯Ό μƒμ„±ν•˜μ—¬ 상속을 ν•˜λ €λ©΄

​

 

class Triangle extends Shape {}

 

 

μœ„μ™€κ°™μ΄ extends λΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ Shapeμ•ˆμ— μžˆλŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ“€μ„ μ—°μž₯ν•˜μ—¬ Triangle ν΄λž˜μŠ€μ—μ„œ

μ‚¬μš©ν• μˆ˜ μžˆλŠ” 것이닀

​

이제 객체λ₯Ό μƒμ„±ν•˜μ—¬ Triangle ν΄λž˜μŠ€μ—μ„œ Shape에 μ„ μ–Έλœ ν•„λ“œμ™€ λ©”μ†Œλ“œλ“€μ„ μ‚¬μš©ν•΄λ³΄μž

 

 

const triangle = new Triangle (20, 20, 'blue');
triangle.draw();

 

 

μ΄λ ‡κ²Œ width에 20, height에 20, color 에 'blue'λ₯Ό μ‚½μž…ν•˜κ³ 

drawλΌλŠ” λ©”μ†Œλ“œλ„ ν˜ΈμΆœν•œ κ²°κ³Όλ₯Ό 보자

 

drawing blue color!

 

Triangle μ—μ„œ Shapeμ—μ„œ μ„ μ–Έλœ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 좜λ ₯을 ν•  수 μžˆλ‹€!

 

 

 

닀양성은 상속을 받은 ν΄λž˜μŠ€μ—μ„œ λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ ν•˜λŠ” 것을 λ§ν•œλ‹€

​

예λ₯Όλ“€μ–΄

 

 

class Triangle extends Shape {
  getArea() {
    return (this.width * this.height) / 2;
}

 

 

μœ„μ™€κ°™μ΄ Shapeμ—μ„œ μ„ μ–Έν•œ getArea λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλŠ” 것이 닀양성이닀

​

Triangleμ—μ„œ μž¬μ •μ˜ν•œ getArea λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ 값을 보자

 

colsole.log(triangle.getArea());

 

μ΄λ ‡κ²Œ ν˜ΈμΆœν•˜μ—¬ 좜λ ₯을 ν•˜κ²Œλ˜λ©΄

 

 

200

 

μœ„μ™€κ°™μ΄ λ‹€λ₯Έ 연산을 ν•˜κ²Œλ˜μ–΄ 200 μ΄λΌλŠ” 값이 λ‚˜μ˜€κ²Œ λœλ‹€ !

​

이것을 μ˜€λ²„λΌμ΄λ”© 이라고 ν•œλ‹€

 

 

 


 

 

instanceof

 

 

instanceofλŠ” λ°‘μ˜ μ˜ˆμ‹œμ™€ ν•¨κ»˜ μ‚΄νŽ΄λ³΄λ©΄ μ‰½κ²Œ 이해가 κ°€λŠ₯ν•˜λ‹€

 

 

console.log(triangle instanceof Triangle);

 

 

μ™Όμͺ½μ— μžˆλŠ” triangle μ΄λΌλŠ” μ˜€λΈŒμ νŠΈκ°€ Triangle μ΄λΌλŠ” 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€ μ•„λ‹Œμ§€λ₯Ό

true와 false둜 좜λ ₯ν•΄ μ£ΌλŠ” 것이닀

μœ„μ˜ κ²°κ³ΌλŠ” true !

​

또 λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ μ•„λž˜λ₯Ό μ‚΄νŽ΄λ³΄μž

 

 

console.log(triangle instanceof Shape);

 

 

μœ„μ²˜λŸΌ triangle μ˜€λΈŒμ νŠΈκ°€ Shape 클래슀λ₯Ό μƒμ†λ°›μ•˜κΈ° λ•Œλ¬Έμ— true!