본문 바로가기

JavaScript

객체지향 프로그래밍이란?

객체지향 프로그래밍은 독립된 객체(Object)의 집합으로 프로그래밍을 표현하는 패러다임 입니다

객체지향 프로그래밍의 장점으로는 상속을 통한 코드 재사용성이 좋고 캡슐화를 통해 유지보수의 우수성이 있고

대형 프로그래밍의 경우 클래스(객체)단위로 모듈화 개발을 통한 업무분담에서 장점이 있습니다

사람을 객체로 표현하자면 아래와 같은 코드로 작성 할 수 있습니다

 

1
2
3
4
5
6
7
//객체 person
const person = {
    //객체 person의 속성 name과 age
    name'Lee Joong Won',
    age: 20,
};
 
cs

 

객체지향 프로그래밍은 4가지 특징이 있습니다

4가지 특징으로는 추상화, 상속, 캡슐화, 다형성이 있습니다

 

추상화

사람(person) 에게는 다양한 속성이 있습니다

속성은 변수나(이름,나이,성별등등), 메소드(행동,실행 : 먹는다,잠을 잔다등등)이 될 수 있습니다

여기서 필요한 속성만 간추려 내어 표현하는것을 추상화라(abstraction)고 합니다

 

상속

상속은 객체지향에서 핵심적인 개념입니다

A라는 객체가 있을떄 다른객체인 B나 C가 A의 프로퍼티나 메서드를 상속받아 A의 기능을 사용 할 수 있는것을 의미합니다

상속을 이용하면 중복되는 코드를 상속을 통해 중복을 제거 할 수 있습니다

이렇게 되면 코드의 재사용성이 높아지고 불필요한 중복선언을 막아 메모리를 절약 할 수 있습니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//생성자 함수
function Student(name) {
    this.name = name;
 
    //일반 메서드
    this.printName2 = function () {
        console.log(this.name);
    };
 
    //프로토타입 메서드
    Student.prototype.printName = function () {
        console.log(this.name);
    };
}
// new 키워드로 인스턴스 생성
const person1 = new Student('Lee Joong Won');
const person2 = new Student('Kim Joong Won');
 
person1.printName2(); // 'Lee Joong Won'
person2.printName2(); // 'Kim Joong Won'
 
console.log(person1.printName === person2.printName);   // true;
console.log(person1.printName2 === person2.printName2); // false;
cs

위의 코드를 보면 일반메서드와 프로토타입 메서드가 있습니다

둘다 같은 동작을 하고 같은 결과값을 출력한다 하지만

메소드가 서로 같은지 비교했을때 프로토타입 메서드와(printName) 일반 메서드는(printName2) 서로 차이가 있었습니다  

console.log(person1.printName === person2.printName);   // true;
console.log(person1.printName2 === person2.printName2); // false;

 

프로토 타입 메서드는 인스턴스person1과 person2가 다르더라도 printName는 서로 같은 메모리 주소를 가르키고있어서 true가 출력되었고

 

일반 메서드는 프로토 타입 메서드와 다르게 같은 메모리 주소를 가르키고있지 않아서 false를 출력했습니다

일반메서드는 인스턴스마다 printName2 메서드가 각각 생성되어 중복선언이 된것이고
 
프로토타입 메서드는 인스턴스마다가 아닌 객체에 상속되어 하나의 메서드 printName을 각각의 인스턴스들이 공유(상속)받아서 사용하고있습니다
 
 
이처럼 인스턴스person1과 person2는 상위 부모역할을 하는 객체(Student)의 프로퍼티를 상속을 통해 공유합니다

*프로토타입에 대한 내용은 따로 다루겠습니다 *

 

캡슐화 Encapsulation

캡슐화는 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참고하고 조작 할 수 있는 동작인 메스드를 하나로 묶는 것을 의미합니다

캡슐화의 개념에는 은닉화의 개념도 있는데 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용하기도 합니다

(정보 은닉)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//즉시실행함수는 외부에서 접근 할 수 없는 자체적인 스코프를 가지고있다
//이것을 이용해 내부 변수를 외부로부터 private
const Student = (function () {
    // Student의 전역변수
    let _age = ''//private
    //생성자
    function Student(name, age) {
        this.name = name//public
        _age = age;
    }
 
    //프로토타입 메서드
    Student.prototype.print = function () {
        console.log(`name: ${this.name}, _age: ${_age}.`);
    };
    
    return Student;
})();
 
// new 키워드로 인스턴스 생성
const person = new Student('Lee Joong Won'20);
 
person.print();             // name: Lee Joong Won, _age: 20.
console.log(person.name);   // Lee Joong Won
console.log(person._age);   // undefined
cs

위의 코드는 변수 _age를 은닉화 한것이다

변수 _age는 외부에서 접근 할 수 없다 // console.log(person._age);   // undefined

캡슐화 하는 이유는  외부의 잘못된 사용으로 인한 객체,변수,데이터등등 손상(변경,삭제등등)을 방지하기 위함이다

 

다형성

다른 클래스들이 같은 메소드나 속성으로 정의될 수 있습니다

이 때 메소드는 메소드가 선언된 클래스로 실행영역이 한정됩니다

일반적으로 객체 지향에서 다형성의 개념은, 부모 객체에서 정의된 메소드를 자식 객체에서 사용할 때 override, 즉 덮어쓰기 하여 바꿀 수 있습니다

다형성으로 인해서 우리는 같은 동작을 하는 때에 종류마다 분기를 나누고 조건을 지정해 줄 필요가 없어집니다

'JavaScript' 카테고리의 다른 글

프로토타입 체인  (0) 2022.09.22
프로토타입  (0) 2022.09.21
클래스와 인스턴스  (0) 2022.09.21
함수란?  (0) 2022.09.20
변수와 타입  (0) 2022.09.20