πŸ“ŒLanguage/JavaScript

TIL) 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°, 클래슀, μΈμŠ€ν„΄μŠ€, λͺ¨λ“ˆν™”λ₯Ό ν•˜λŠ” 이유

hellohailie 2022. 5. 25. 13:10

 

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° (OOP; Object-oriented programming)= 데이터와 κΈ°λŠ₯을 ν•œ 곳에 λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•œλ‹€. 

 

속성과 λ©”μ„œλ“œκ°€ ν•˜λ‚˜μ˜ '객체'λΌλŠ” κ°œλ…μ— ν¬ν•¨λ˜λ©°, μ΄λŠ” js λ‚΄μž₯ νƒ€μž…μΈ objectμ™€λŠ” λ‹€λ₯΄κ²Œ, ν΄λž˜μŠ€λΌλŠ” μ΄λ¦„μœΌλ‘œ λΆ€λ₯Έλ‹€. 

 

λ©”μ„œλ“œ ν˜ΈμΆœν•˜λŠ” 방법 // ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό 쓰지 μ•ŠλŠ”λ‹€. 

 

** ν™”μ‚΄ν‘œ ν•¨μˆ˜ **

thisλ‚˜ super에 λŒ€ν•œ 바인딩이 μ—†λ‹€. 

λ©”μ„œλ“œλ‘œ μ‚¬μš©λ  수 μ—†λ‹€. 

new.target ν‚€μ›Œλ“œκ°€ μ—†λ‹€. 

 


λͺ¨λ“ˆν™”λž€?

 

μ½”λ“œμ˜ μž¬ν™œμš©μ„±μ„ 높이고, μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 기법듀이 μ‚¬μš©λœλ‹€. 

==> κ·Έ 쀑 ν•˜λ‚˜κ°€ μ½”λ“œλ₯Ό μ—¬λŸ¬κ°œμ˜ 파일둜 λΆ„λ¦¬ν•˜λŠ” 것이닀. (λͺ¨λ“ˆν™”)

 

1. 자주 μ‚¬μš©λ˜λŠ” μ½”λ“œλ₯Ό λ³„λ„μ˜ 파일둜 λ§Œλ“€μ–΄μ„œ ν•„μš”ν•  λ•Œλ§ˆλ‹€ μž¬ν™œμš©ν•  수 μžˆλ‹€. 

2. μ½”λ“œλ₯Ό κ°œμ„ ν•˜λ©΄ 이λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ” λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ™μž‘μ΄ κ°œμ„ λœλ‹€. 

3. μ½”λ“œ μˆ˜μ • μ‹œ ν•„μš”ν•œ λ‘œμ§μ„ λΉ λ₯΄κ²Œ 찾을 수 μžˆλ‹€. 

4. ν•„μš”ν•œ λ‘œμ§λ§Œλ“€ λ‘œλ“œν•΄μ„œ λ©”λͺ¨λ¦¬μ˜ λ‚­λΉ„λ₯Ό 쀄일 수 μžˆλ‹€. 

5. ν•œλ²ˆ λ‹€μš΄λ‘œλ“œλœ λͺ¨λ“ˆμ€ μ›ΉλΈŒλΌμš°μ €μ— μ˜ν•΄ μ €μž₯되기 λ•Œλ¬Έμ— λ™μΌν•œ λ‘œμ§μ„ λ‘œλ“œν•  λ•Œ μ‹œκ°„κ³Ό λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½μ„ μ ˆμ•½ ν•  수 μžˆλ‹€. 

 


객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP; Object-oriented programming) μ‰¬μš΄ μ„€λͺ… 

=> ν•˜λ‚˜μ˜ λͺ¨λΈμ΄ λ˜λŠ” 청사진을 λ§Œλ“€κ³  (class), κ·Έ 청사진을 λ°”νƒ•μœΌλ‘œ ν•œ 객체(object)λ₯Ό λ§Œλ“œλŠ” (instance) ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄

 

μΈμŠ€ν„΄μŠ€(instance) = '청사진'을 λ°”νƒ•μœΌλ‘œ ν•œ 객체 (κ·Έλƒ₯ 객체x)

// μΈμŠ€ν„΄μŠ€ λ§Œλ“€ λ•Œ new ν‚€μ›Œλ“œλ₯Ό μ¨μ„œ λ§Œλ“ λ‹€.

=> μ¦‰μ‹œ μƒμ„±μž ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©°, λ³€μˆ˜μ— 클래슀의 섀계λ₯Ό 가진 μƒˆλ‘œμš΄ 객체 즉 μΈμŠ€ν„΄μŠ€κ°€ ν• λ‹Ήλœλ‹€. 

// 각각의 μΈμŠ€ν„΄μŠ€λŠ” 클래슀의 κ³ μœ ν•œ 속성과 λ©”μ„œλ“œλ₯Ό κ°–κ²Œ λ©λ‹ˆλ‹€. 

 

클래슀(class) = 청사진

// λŒ€λ¬Έμžλ‘œ, 일반λͺ…μ‚¬λ‘œ λ§Œλ“ λ‹€. 

// ν΄λž˜μŠ€μ— 속성과 λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜κ³ , μΈμŠ€ν„΄μŠ€μ—μ„œ μ΄μš©ν•œλ‹€. 

 

**속성과 λ©”μ†Œλ“œ

 

속성: λΈŒλžœλ“œ, μ°¨ 이름, 색상, 졜고 속λ ₯ λ“±λ“±

λ©”μ†Œλ“œ: 객체에 λ”Έλ¦° ν•¨μˆ˜ ex) μ—°λ£Œ μ£Όμž…, 속λ ₯ μ„€μ •, μš΄μ „

 

"학생"μ΄λΌλŠ” 클래슀λ₯Ό λ§Œλ“ λ‹€κ³  κ°€μ •ν•œλ‹€λ©΄!

 

속성: 학ꡐλͺ…, 반, 번호, 이름, κ³Όλͺ©λ³„ 성적

λ©”μ†Œλ“œ: 주쀑 기상 μ‹œκ°„, μ·¨μΉ¨ μ‹œκ°„, ν‰μ†Œ κ³΅λΆ€λŸ‰

 

 

ES5방법 : ν΄λž˜μŠ€λŠ” ν•¨μˆ˜λ‘œ μ •μ˜ν•  수 μžˆλ‹€.

function Car(brand, name, color){
// μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§ˆ λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
}

 

ES6방법 : classλΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μ •μ˜ν•  μˆ˜λ„ μžˆλ‹€.  (μ΅œκ·Όμ—λŠ” ES6방법 주둜 μ‚¬μš©)

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μƒμ„±μž ν•¨μˆ˜ (constructor) ==> μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§ˆ λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œλ‹€. 

class Car {
	constructor(brand, name, color){
    // μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§ˆ λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ
    }
}

 


클래슀: 속성 μ •μ˜

 

ES6μ—μ„œλŠ” this λΌλŠ” μƒˆλ‘œμš΄ ν‚€μ›Œλ“œ μ‚¬μš©! (객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 자주 λ‚˜μ˜¨λ‹€. )

class Car {
	constructor(brand,name,color){
    	this.brand = brand;
        this.name = name;
        this.color = color;
    }
}

thisλŠ” μΈμŠ€ν„΄μŠ€ 객체λ₯Ό μ˜λ―Έν•œλ‹€. 

parameter둜 λ„˜μ–΄μ˜¨ λΈŒλžœλ“œ, 이름, 색상 등은 μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μ§€μ •ν•˜λŠ” 값이닀. 

μ•„λž˜μ²˜λŸΌ this에 ν• λ‹Ήν•œλ‹€λŠ” 것은 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€μ— ...을 λΆ€μ—¬ν•˜κ² λ‹€λŠ” 것이닀. 

 

 

클래슀: λ©”μ†Œλ“œμ˜ μ •μ˜

 

ES5 => prototypeμ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€. 

function Car(brand, name, color){//μƒλž΅}
Car.prototype.refuel = function(){
	//μ—°λ£Œ 곡급을 κ΅¬ν˜„ν•˜λŠ” μ½”λ“œ
}
Car.prototype.drive = function() {
	//μš΄μ „μ„ κ΅¬ν˜„ν•˜λŠ” μ½”λ“œ
}

 

ES6=> μƒμ„±μž ν•¨μˆ˜μ™€ ν•¨κ»˜ class ν‚€μ›Œλ“œ μ•ˆμͺ½μ— λ¬Άμ–΄μ„œ μ •μ˜ν•œλ‹€. 

class Car {
	constructor(brand,name,color) {// μƒλž΅}
    refuel() {
    }
    drive() {
    }
}

 

 


  • prototype = λͺ¨λΈμ˜ 청사진을 λ§Œλ“€ λ•Œ μ“°λŠ” μ›ν˜• 객체
  • constructor = μΈμŠ€ν„΄μŠ€κ°€ μ΄ˆκΈ°ν™”λ  λ•Œ μ‹€ν–‰ν•˜λŠ” μƒμ„±μž ν•¨μˆ˜
  • this = ν•¨μˆ˜κ°€ 싀행될 λ•Œ, ν•΄λ‹Ή scopeλ§ˆλ‹€ μƒμ„±λ˜λŠ” κ³ μœ ν•œ μ‹€ν–‰ context( execution context) 그리고 new ν‚€μ›Œλ“œλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν–ˆμ„ λ•Œμ—λŠ”, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€κ°€ λ°”λ‘œ this의 값이 λœλ‹€. 

 

class Car {
	constructor(brand,name,color){
    	this.brand = brand;
        this.name = name;
        this.color = color;
        drive() {
        	console.log(this.name + 'κ°€ μš΄μ „μ„ μ‹œμž‘ν•©λ‹ˆλ‹€');
    }
    }
}

let avante = new Car ('hyundai', 'avante', 'black');
avante.color; // 'black'
avante.drive; // avanteκ°€ μš΄μ „μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.

 


배열은 λͺ¨λ‘ Array의 μΈμŠ€ν„΄μŠ€μ΄λ‹€. 

let arr = ['code', 'states', 'pre'];
arr.length; //3
arr.push('course') // μƒˆλ‘œμš΄ element μΆ”κ°€

 

λ°°μ—΄ λ©”μ„œλ“œ (push, filter, forEach λ“±λ“±) λͺ¨λ“  λ©”μ„œλ“œλŠ” 클래슀의 μ›ν˜• 객체 (prototype)에 μ •μ˜λ˜μ–΄ μžˆλ‹€. 

let arr = new Array['code', 'states', 'pre'];
arr.length; //3
arr.push('course') // μƒˆλ‘œμš΄ element μΆ”κ°€