꾸준하게 기록하기
article thumbnail

class 

class person{
 name;
 age;
 speak();
}

연관 있는 데이터를 묶어 놓는 컨테이너 같은 존재

persion클래스 안에 name과 age 같은 속성(field), speak()와 같은 행동(method)이 들어있다.

→ 변수들이나 함수들을 묶어 놓은 것을 class 라고 한다.

 

클래스 내에서도 내부적으로 보여지는 변수와 밖에서 보일 수 있는 변수를 나누어서 캡슐화라고 한다.

그리고 클래스를 이용해서 상속다형성이 일어날 수 있는데 이런 모든 것들이 가능한 것이 객체 지향 언어이다.

 

Class 

 - template : 클래스 자체에는 데이터가 들어있지 않고 틀(template)만 정의

 - declare once : 한번만 선언 

 - no data in 

 

object : 클래스를 이용해 실제 데이터를 만드는 것을 object 라고 한다.

 - instance of a class 

 - created many times 

 - data in 

 

→ 클래스는 데이터가 들어있지 않아 메모리에 올라가지 않지만 object는 메모리에 올라가게 된다.

 

클래스는 ES6에서 도입된 것으로 그 전에는 클래스를 사용하지 않고 오브젝트를 사용해 만들 수 있었다.

 

1. Class declarations

class Person {
	constructor(name, age) {	// 생성자
    	// fields
    	this.name = name;
        this.age = age;
    }
    
    // methods
    speak() {
    	console.log(`${this.name}: hello!`);	// this 는 생성된 object 를 가리킨다
    }  
}

// object 생성 
const dream = new Person('MARK', 22);

console.log(dream.name);	// MARK
console.log(dream.age);		// 22

dream.speak();				// MARK: hello!

- 새로운 object 를 만들 때는 new 키워드를 사용

 

2. Getter & Setter 

class User {
	constructor(firstName, lastName, age) {	// 생성자
    	// fields
    	this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}

get age() {
	return this._age;
}

set age(value) {
	this._age = value;
}

const user1 = new User('Steve', 'Job', -1);
console.log(user1.age)

사용자가 age를 -1 이라고 잘못 설정해도 우리가 좀 더 방어적인 자세로 만들어줄 수 있는 것이 getter와 setter이다.

age가 -1은 말이 안되기 때문에 get 메서드로 값을 리턴하고 set이라는 키워드로 값을 설정할 수 있다.

get에선 age 값을 리턴하고 set에서는 새로운 value를 받아와야 한다.

 

age getter를 정의하는 순간 생성자에 this.age는 메모리에 올라간 데이터를 읽어오는 것이 아니라 getter를 호출

setter를 정의하는 순간 값을 할당할 때 바로 메모리에 값을 할당하는 것이 아니라, setter를 호출

 

User라는 클래스 안에는 총 3개의 field가 있는데 firstName, lastName, _age 가 있다.

 

3. Public & Private

class Experiment {
	publicField = 2;
	#privateField = 0;
}

const experiment = new Experiment();
console.log(experiment.publicField)
console.log(experiment.privateField)

생성자를 사용하지 않고 필드 정의할 수 있다.

그냥 정의하게되면 Public 외부에서 접근 가능하다.

해시기호를 붙이게 되면 Private 필드. 클래스 내부에서만 접근 가능하다.

 

4. Static

class Article {
	static publisher = 'cooo';
	
    constructor(articleNumber) {
    	this.articleNumber = articleNumber;
    }
    
    static printPublisher() {
    	console.log(Article.publisher);	// cooo
    }
}

 

Static은 클래스 자체에 연결되어 있다. Article(클래스명).publisher 로 사용가능하다.

 

5. Inheritance (상속) / 다형성

 

도형을 그릴 때 네모 동그라미 세모를 그렸을 때 3가지 도형은 모두 width, height, color를 가지고 있다.

공통된 속성들을 묶어 놓은 클래스를 미리 만들어 놓고 재사용하면 유지보수도 쉽다. 

class Shape {
	constructor(width, height, color) {
		this.width = width;
		this.height = height;
		this.color = color;
	}
    
	draw() {
	   console.log(`drawing ${this.color} color of`);	// drawing blue color of
	}
	
	getArea() {
	   return this.width * this.height;
	}
}

class Rectangle extends Shape{}
class Triangle extends Shape{
	draw() {
		super.draw() // 부모의 draw 호출
		console.log(`Triangle drawing`);	// Triangle drawing
	}
	getArea() {
	   return (this.width * this.height) / 2;
	}
}

const rectangle = new Rectangle(20, 20, 'blue');
rectangle.draw();	
console.log(rectangle.getArea); // 400

const triangle = new Triangle(20, 20, 'red');
console.log(triangle.getArea); // 200

Shape라는 공통된 클래스를 만들고 extends 를 사용해서 재사용 할 수 있다.

rectangle은 Shape클래스를 상속 받았으므로 Shape 클래스의 field나 method를 사용할 수 있게 된다.

 

Triangle클래스 내에서 Shape클래스의 getArea()메서드를 다시 재정의해서 사용할 수 있는데 이것을 override라고 한다.

Triangle클래스에서 draw메서드를 override 했기 때문에 Shape클래스의 draw함수는 호출하지 않는다.

 

super.draw() 를 사용하면 부모의 draw( ) 를 호출한다.

 

6. InstanceOf

console.log(rectangle instanceof Rectangle);	// true
console.log(triangle instanceof Rectangle); // false
console.log(triangle instanceof Triangle); // ture
console.log(triangle instanceof Shape); // true

// JS에서 만든 모든 클래스는 JS에 있는 Object를 상속한 것이다.
console.log(triangle instanceof Object); // true

왼쪽에 있는 object가 오른쪽에 있는 클래스의 인스턴스인지 아닌지 확인 (object가 class를 이용해서 만들어졌는지)

true 와 fasle 반환 한다.

 

 

 

드림코딩 by 엘리 의 JS 강의를 시청 후 정리한 내용입니다.

728x90

'Frontend > JavaScript' 카테고리의 다른 글

[JS] Array 개념과 APIs 총정리  (0) 2022.04.08
[JS] Object 란?  (0) 2022.04.05
[JS] Function  (0) 2022.03.31
[JS] 데이터 타입  (0) 2022.03.30
[JS] async 와 defer의 차이점  (0) 2022.03.30
profile

꾸준하게 기록하기

@:_:

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!