본문 바로가기

웹언어/JAVASCRIPT

[JS강좌] 9강 자바스크립트 객체와 생성자함수 - 오쌤의 니가스터디

728x90
반응형

 

 

 

 

 

 

 

** 동영상으로 공부하고 싶은 분은 아래 주소를 클릭해 주세요.

https://www.youtube.com/watch?v=k0HterZEszY 

 

 

 

 

 

 

 

 

 

 

 

1. 객체의 종류

- 객체는 자바스크립트가 명령가능한 모든 대상을 의미합니다.

 

1) 객체의 큰 부분

 

종류 설명
기본내장객체 기본적인 객체들로 보통 컴퓨터 언어들은 갖고 있는 객체
BOM(Browser Object Model) 브라우저오브젝트 모델, 브라우저 관련 객체
DOM(Document Object Model) 문서객체모델, 태그나 컨텐츠 등을 의미하는 객체
사용자정의객체 개발자가 직접적으로 생성하는 새로운 객체

 

 

 

 

 

 

2) 기본내장객체

종류 설명
String 문자열 객체
Number 숫자 객체
Math 수학 객체
Array 배열 객체
Date 날짜시간객체

- 기본내장객체는 첫 글자를 대문자로 작성하는 것이 규칙

 

 

 

 

 

 

 

 

3) BOM객체

종류 설명
window 브라우저 창 객체, BOM의 최상위 객체
location 주소표시줄 객체
screen 운영체제 화면 객체
history 방문기록 객체
navigator 브라우저정보 객체
document 문서객체 - body태그부분을 의미

- BOM은 전부 소문자로 쓰는 것이 규칙입니다.

- DOM은 BOM의 일부이나 매우 중요하기 때문에 따로 나눠서 봅니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

 


 

 

 

 

 

 

 

 

 

 

 

 

2. 객체 - Object

- 여기서 말하는 객체는 사용자(즉 개발자)가 만드는 사용자 정의 객체를 의미합니다.

- 그래서 객체 종류를 확인하면 위와 같이 첫 글자가 대문자인 [Object]로 처리됩니다.

 

 

 

 

 

1) 객체모델링

- 보통 컴퓨터 언어에서 말하는 객체모델링이란 현실 세계 객체를 컴퓨터객체로 변경하는 것을 의미합니다.

- 예시로 자동차를 들어보도록 하겠습니다.

 

 

## Object

현실에서 존재하는 객체입니다.

 

속성설명

자동차이름 : MINI

자동차모델 : MINI COOPER S

자동차색상 : 빨간색

자동차연비 : 12.3km/

 

움직임설명

자동차의 시동을 킨다.

자동차가 움직인다.

자동차가 멈춘다.

자동차의 시동을 끈다.

 

 

 

 

 

 

 

## javascript 식 문법으로 정리

Object Properties Method
car car.name = 'MINI' car.start()
car.model = 'MINI COOPER S' car.drive()
car.color = '빨간색' car.brake()
car.mileage = 12.3 car.stop()

 

 

 

## 속성과 메서드 

- 속성(properties) : 객체가 갖고 있는 고유한 특징을 기술한 것을 말합니다.

- 메서드(method) : 객체가 갖고 있는 동작 혹은 객체에 주는 명령을 의미합니다. 

 

 

 

 

 

 

 

 

2)  객체 선언

## 객체 선언 문법

var 객체명 = {
	속성명: 값,
        메서드: function(){

        }
}

- JS에서의 속성 : 값이 함수가 아닌 숫자, 문자열, 불, 객체로 이루어진 것입니다.

- JS에서의 메서드 : 값이 함수인 것을 의미합니다. 

 

 

 

 

## 예시 코드

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS 객체</title>
        <script>
            var car = {
                name: 'MINI',
                model: 'MINI COOPER S',
                color: ['red','green','blue'],
                mileage: 12.3,
                starting: function(x){
                    if(x == 'on'){
                        alert('자동차시동이 켜집니다.');
                    }else if(x == 'off'){
                        alert('자동차시동이 꺼집니다.');
                    }
                }
            }
        </script>
    </head>
    <body>
        
    </body>
</html>

 

 

 

 

 

 

 

 

 

 

3)  객체 호출

## 문법

//속성호출1
객체명.속성명;

//속성호출2
객체명["속성명"];

//메서드호출
객체명.메서드명();

 

 

 

## 예시 코드

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS 객체</title>
        <script>
            var car = {
                name: 'MINI',
                model: 'MINI COOPER S',
                color: ['red','green','blue'],
                mileage: 12.3,
                starting: function(x){
                    if(x == 'on'){
                        alert('자동차시동이 켜집니다.');
                    }else if(x == 'off'){
                        alert('자동차시동이 꺼집니다.');
                    }
                }
            }

            //속성호출
            alert(car.model);
            alert(car.color[0]);
            
            //메서드호출
            car.starting('on');
        </script>
    </head>
    <body>
        
    </body>
</html>

 

 

 

## 코드 결과

각각의 속성값이 잘 호출되고, 메서드가 실행되는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

4) this키워드

- this키워드는 함수에서는 함수의 '소유자'를 의미합니다.

- 객체에서는 이 함수를 소유하고 있는 객체를 의미합니다. 

- 자세한 내용은 추후에 새로운 챕터에서 따로 공부할 예정입니다. 

 

 

## 예시 코드

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS 객체</title>
        <script>
            var car = {
                name: 'MINI',
                model: 'MINI COOPER S',
                color: ['red','green','blue'],
                mileage: 12.3,
                myCar: function(){
                	alert('내 차이름은 ' + this.name + '입니다');
                }
            }

            car.myCar();
        </script>
    </head>
    <body>
        
    </body>
</html>

- [this.name]부분에 [car.name]을 써도 현재 인식은 잘 됩니다.

- 하지만 객체가 한 개 사용되는 것이 아니라 여러 개 사용되는 경우 선택이 모호해집니다.

- 그래서 this키워드를 쓰는 것이 좋습니다.

 

 

 

## 코드 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

3. 객체 생성자함수

1) 생성자 함수

- 생성자 함수란 [객체]를 생성할 때 사용하는 함수입니다.

- 여러 개의 통일한 속성을 가지는 객체를 생성하기 위해 필요합니다.

- Protptype을 이용해서 메모리를 절감을 위해서도 필요합니다.

 

 

## 선언 문법

function 생성자함수명(){
	this.속성 = 값;
}

- 생성자함수명은 대문자로 시작하는 것이 관례입니다. 

- 이는 함수와 구분 짓기 위해서 그렇습니다. 

- 약간 C++이나 JAVA의 클래스(class)처럼 사용된다고 보면 됩니다.

- 하지만 자바스크립트도 클래스 방식이 새롭게 나왔습니다.

 

 

 

## 호출 문법

var 변수명 = new 생성자함수명();

- new라는 생성자함수 키워드를 사용해서 객체를 새로운 인스턴스로 생성합니다.

 

 

 

## 예시코드

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS 객체</title>
        <script>
            function Mini(model, color, mileage){
                this.model = model;
                this.color = color;
                this.mileage = mileage;
                this.starting = function(x){
                    if(x == 'on'){
                        alert(this.color + '인 ' + this.model + '가 시동이 켜졌습니다.');
                    }else if(x == 'off'){
                        alert(this.color + '인 ' + this.model + '가 시동이 꺼졌습니다.');
                    }
                }
            }

            var johnCar = new Mini('Mini Cooper S','빨간색',12.3);
            var janeCar = new Mini('Mini Cooper 5Door','노란색',11.7);

            johnCar.starting('on');
            janeCar.starting('on');
        </script>
    </head>
    <body>
        
    </body>
</html>

- Mini라는 차를 생성자함수로 생성했습니다.

- 그리고 존의 차와 제인의 차로 각각 생성했습니다. 

 

 

 

## 코드 결과

둘다 실행이 잘되고 매개변수별로 처리되는 것이 확인됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2) Prototype(프로토타입)

- Prototype이란 생성자 함수로 생성한 객체들이 properties(속성)과 method(메서드)를 공유하기 위해 사용하는 객체입니다.

- new를 통해 새롭게 생성한 객체의 속성과 메서드가 복사된 객체만큼 계속 생성되어 메모리를 많이 차지하기 때문에 비효율적입니다. 

- 같은 속성과 메서드이기 때문에 메모리를 잡아먹지 않도록, 이를 해결하기 위해 나온 것이 프로토타입입니다. 

 

 

 

 

## __proto__ 속성

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS 객체</title>
        <script>
            function Mini(model, color, mileage){
                this.model = model;
                this.color = color;
                this.mileage = mileage;
                this.starting = function(x){
                    if(x == 'on'){
                        alert(this.color + '인 ' + this.model + '가 시동이 켜졌습니다.');
                    }else if(x == 'off'){
                        alert(this.color + '인 ' + this.model + '가 시동이 꺼졌습니다.');
                    }
                }
            }

            var johnCar = new Mini('Mini Cooper S','빨간색',12.3);
            var janeCar = new Mini('Mini Cooper 5Door','노란색',11.7);

            console.log(johnCar);
            console.log(janeCar);
        </script>
    </head>
    <body>
        
    </body>
</html>

- 모든 JavaScript객체는 prototype의 속성과 메서드를 상속합니다. 

- 동일한 생성자 함수로 생성된 객체들은 내부적으로 [__proto__]라는 속성을 사용하여 생성자 함수에 존재하는 prototype이라는 속성을 참조하여 같은 공간을 공유하고 있습니다.

 

 

## 프로토타입으로 빼기

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS 객체</title>
        <script>
            function Mini(model, color){
                this.model = model;
                this.color = color;
            }

            //공통 주제를 프로토타입으로 빼고 처리
            Mini.prototype.mileage = 14;
            Mini.prototype.starting = function starting(x){
                if(x == 'on'){
                    alert(this.color + '인 ' + this.model + '가 시동이 켜졌습니다.');
                }else if(x == 'off'){
                    alert(this.color + '인 ' + this.model + '가 시동이 꺼졌습니다.');
                }
            }

            var johnCar = new Mini('Mini Cooper S','빨간색');
            var janeCar = new Mini('Mini Cooper 5Door','노란색');

            console.log(johnCar);
            console.log(janeCar);
        </script>
    </head>
    <body>
        
    </body>
</html>

- 마일리지도 14로 공통이라고 보면 바꿀 필요가 없어서 프로토타입으로 뺐습니다.

- 시동을 키는 것도 공통적인 메서드로 뺐습니다. 

 

 

## 결과 보기

- 보면 전면적으로 호출은 생성자 함수 내부의 코드만 호출이 되고, 나머지는 프로토타입으로 들어가게 됩니다.

- 그러면 호출시 바뀌는 값만 찾기 때문에 메모리 절감이 됩니다. 

 

 

 

 

 

 

 

 

 

## 문제

학생들의 국어, 영어, 수학점수를 통해 평균을 구하시오.
단, 객체로 생성하시오.

 

 

 

## 예시 코드

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>JS 객체</title>
        <script>
            //각각의 학생의 이름과 국어,영어,수학점수는 모두 다르기 때문에 각각 받도록 작성
            function Score(name,kor,eng,math){
                this.name = name;
                this.kor = kor;
                this.eng = eng;
                this.math = math;
            }

            //평균은 그 점수로 인한 결과이므로 어떤 학생이든지 간에 수식이 같으므로 메모리를 덜 차지하게 하기 위해 prototype으로 작성
            Score.prototype.avg = function avg(){
                return "학생이름 : " + this.name + '<br>' + '평균 : ' + ((this.kor + this.eng + this.math) / 3).toFixed(2) + '<br>' + '===============<br>';
            }

            var student01 = new Score('홍길동',90,80,75); 
            var student02 = new Score('김철수',100,80,90); 
            var student03 = new Score('박영희',100,90,100); 

            document.write(student01.avg());
            document.write(student02.avg());
            document.write(student03.avg());
        </script>
    </head>
    <body>
        
    </body>
</html>

- 각각의 학생의 이름과 국어, 영어, 수학점수는 모두 다르기 때문에 각각 받도록 작성하였습니다.

- 평균은 그 점수로 인한 결과이므로 어떤 학생이든지 간에 수식이 같으므로 메모리를 덜 차지하게 하기 위해 prototype으로 작성하였습니다.

 

 

 

## 코드 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형