반응형

목차

1. 개요

2. 생성

3. 조회

4. 수정

5. 삭제


1. 개요

 Javascript의 가장 기본이 되는 개념인 객체의 생성, 조회, 수정, 삭제 방법에 대해 알아본다.


2. 생성

1
var foo = { name : 'ssk' };

중괄호 '{ }' 안에 key : value 형식으로 프로퍼티를 저장한다.

프로퍼티란 객체에 속한 데이터를 뜻한다.

 

※ key point

 foo라는 변수가 {name : 'ssk'} 라는 객체 자체에 대한 데이터를 가지고 있는 것이 아닌 객체의 주소를 가지고 있다.

var foo 는 해당 객체의 주소를 저장하고 있다.

 

  예를 들어, var foo2 = foo 라고 초기화시키면 foo2 또한 foo와 동일한 객체를 가리키게 된다.


3. 조회

 객체를 조회하는 방법은 크게 두 가지이다.

 1) 참조 연산자 (.) 사용

 2) 대괄호 ([]) 사용

1
2
3
console.log(foo.name); // 'ssk'
console.log(foo['name']); // 'ssk'
console.log(foo[name]); //undefined

  foo.name은 foo객체의 주소를 참조하고 그 안에 있는 name 값을 조회한다라는 의미이다. 'ssk'가 출련된다.

 

 foo['name']도 직관적으로 해석하면 foo객체의 key가 name인 value값을 조회한다인데, foo['name']과 foo[name]이 자꾸 헷갈려서 메커니즘을 찾아 이해해보았다.

 

 먼저 대괄호란 녀석은 배열에서 값을 참조할 때 쓰는 형식이다.

 javascript에서는 number, boolean, undefined, string, null이라는 기본 타입을 제외하고 모두 객체 타입이다. foo['name']은  객체 타입인 배열과 형식이 같은 것을 알 수 있다. (물론! 차이는 존재한다.)

쉽게 생각하면 foo['name']은 처럼 'name'이라는 key값(index)를 참조한다고 생각하면 이해가 쉽다. 객체의 key값은 String 값이기 때문에 작은 따옴표(')와 함께 입력해 준 것이다. 작은 따옴표가 없으면 name이라는 값은 String이 아닌 하나의 변수로 인식되고, name 변수 안에 있는 값을 참조하게 된다. name 변수는 호출이 된 최상위 객체인 window에 존재하지 않기 때문에 당연히 undefined가 출력된다.

 추가적으로 javascript는 대괄호 안에 데이터가 문자열이 아닐 경우 자동적으로 toString() 메소드를 적용시킨다. toString() 메소드는 어떠한 데이터를 문자열로 변환해주며, 변수.toString() 형식으로 사용할 경우 해당 변수에 들어있는 데이터를 문자열로 변환해주는 역할을 한다.

 즉, 대괄호 안에 있는 name이라는 데이터를 문자열이 아닌 변수로 인식하게 되면 name이라는 변수는 호출된 객체 영역 내에서 정의되지 않았기 때문에 문자열로 변환한들 당연히 값은 존재하지 않는다.

 

1
2
3
4
5
var name = 'name';
 
console.log(foo.name); // 'ssk'
console.log(foo['name']); // 'ssk'
console.log(foo[name]); // 'ssk'

 때문에 변수에 객체의 key값을 넣어 조회할때 위의 방식을 사용한다.

 간단히 name이라는 변수에 'name'이라는 key값을 넣었지만 key값이 많을 경우 반복문과 결합하여 사용할 수 있다.

 

foo['name']과 foo[name]의 차이를 정확히 알았으니 더이상 헷갈리는 일은 없겠지.


4. 수정, 추가

1
2
foo['name'= 'hky';
console.log(foo['name']) //hky

foo.name = 'hky' 라고 해도 동일하다. 

1
2
foo['age'= 25;
console.log(foo['age']) //25

추가도 수정과 동일한 방식이다.


5. 삭제

1
2
delete foo['age'];
console.log(foo['age']); //undefined

 삭제하고자 하는 객체의 키 값을 입력하며, 객체의 프로퍼티를 삭제할 때 사용한다.

 객체 자체를 삭제할 순 없다.

반응형
반응형

목차

1. 정규 표현식이란

2. 정규식 패턴

3. 정규식 메소드

4. 예제


1. 정규 표현식이란

 정규 표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

 형식 언어를 사용하여 특정한 규칙을 가진 문자열의 패턴을 파악한다면 텍스트 편집, 포맷팅, 검색, 치환 등의 문자열 작업이 가능하게 된다. 기본적으로 패턴은 두 개의 '/(슬래시)' 사이에 작성한다. 

 

 예를 들어 '20190809'라는 문자열에서 패턴을 파악하여 '2019''08''09' 형태로 나누고, 그 사이에'-' 문자열을 삽입하여 '2019-08-09' 형태로 만들 수 있고, 저렇게 만든 날짜형 데이터에서 사용 가능한 메소드인 getDay(), getFullYear() 등을 사용할 수 있게 된다. 표현을 위한 포맷팅뿐 아니라 메소드의 사용까지도 가능하게 해주는 좋은 녀석이다.


2. 정규식 패턴

 그렇다면 이 패턴은 어떻게 만들까? 패턴을 만드는 방법은 크게 두 가지이다.

 첫째, 단순 패턴 사용

 둘째, 특수 문자 사용

 

 2.1 단순 패턴 사용

  단순 패턴은 단순히 문자열을 대응시킬 때 사용한다. 예를 들어 /hi/라는 패턴은 문자열에서 hi라는 문자열이 그대로 나타나야 대응된다. "hi, hellow"에서 hi라는 문자열이 대응된다.

 연습이 필요하다고 생각한다면 정규식을 테스트할 수 있는 사이트(https://regexr.com)를 들어가 보길 권한다. 참고로 끝에 있는 'g'는 패턴 속성으로 대상 문자열의 처음부터 끝까지 해당 패턴을 적용시키는 것이다. 이 속성이 없다면 'hi hi hi' 문자열의 대응 부분은 처음의 'hi' 하나뿐이다.

regexr.com

 

 2.2 특수 문자 사용

  단순 패턴을 사용하여 대응하기 힘든 것을 대응시키고자 할 경우 패턴에 특수 문자를 사용한다. 예를 들어, /^hi/ 패턴은 문자열의 시작이 'hi' 문자로 시작되는 것에 대응한다. 만약 'hi, hellow' 문자열에 이 패턴을 적용시킨다면 'hi'가 대응되며, 'oh, hi'라는 문자열에 적용시킨다면 대응되는 문자는 아무것도 없다.

 

특수문자의 종류와 기능이다.

특수 문자 기능 예시
^ 입력의 시작 부분과 대응된다. /^시작/ 시작했다 시작
$ 입력의 끝 부분과 대응된다.  /끝$/ → 끝났다 
* 표현식이 0회 이상 연속으로 반복되는 부분과 대응된다.

/ab*c/ → cbbabbbbcdebc, acbd

+ 표현식이 1회 이상 연속으로 반복되는 부분과 대응된다. /ab+c/ → cbbabbbbcdebc, acbd
? 표현식이 0 또는 1회 등장하는 부분과 대응된다. {0,1} 과 같다. 있어도 ok, 없어도 ok 이라고 생각하면 편하다 /010?/ 01, 010, 011
. 개행 문자를 제외한 모든 단일 문자와 대응된다. /hi./ → hi, hi1, hi2, hi12, hi 
(x) 패턴의 부분을 나누는 것. 포맷팅에 유용하게 쓰인다.

/(a)(b)/ ab

replace(/(a)(b)/,'$1-$2') → a-b

x|y | 는 or 와 동일한 기능을 하며, 하나라도 있을 시 대응된다. /fuck|suck|dick/ fuckyou, suckyou
{n} 표현식이 n번 나타나는 부분에 대응된다. /(hi){2}/ → hi, hihi, hi hi
{n,m} 표현식이 n번~m번 나오는 부분과 대응된다. /(hi){2,3}/ → hi,hihi,hihihi,hihihihi
[abc] 대괄호 안의 문자가 하나라도 있을시 대응된다. /[abc]/g a,ab,abc

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D

 

정규 표현식

정규 표현식은 문자열에 나타는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다. 자바스크립트에서, 정규 표현식 또한 객체입니다.  이 패턴들은 RegExp의 exec 메소드와 test 메소드  ,그리고 String의  match메소드 , replace메소드 , search메소드 ,  split 메소드와 함께 쓰입니다 . 이 장에서는 자바스크립트의 정규식에 대하여 설명합니다.

developer.mozilla.org

더 많은 특수 문자에 대해 알아보고 싶다면 위의 링크로 들어가 보길 권한다.


3. 정규식 메소드

 정규식을 만들어 적용시키기 위해서는 정규식 메소드를 사용해야 한다.

 메소드 또한 위의 링크에서 잘 정리되어있기 때문에 많이 사용되는 메소드만 정리하겠다.

메소드 명 사용 방법 기능
exec pattern.exec(String) 패턴을 String에 적용하여 실행시킨다.
test pattern.test(String) 패턴을 String에 적용시킨 결과가 존재하는지 true와 false로 출력시킨다
replace String.replace(pattern,'type') 패턴을 String에 적용시키고 type으로 치환한다.

특정 문자를 제거하고 싶다면 String.replace(/\-/g, '')

 

반대로 String에 구역을 나눠 해당 구역 간격으로 '-' 문자를 넣어주고 싶다면 

 

번호에 '-' 기호 삽입

참고로 replace의 두 번째 인자인 $1, $2, $3는 정규식에서 대응되는 각각의 부분이다.


4. 예제

 입력받은 두 날짜의 시간 차이 계산하기

 

 4.1) 소스코드

  4.1.1) html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>Page Title</title>
    <script type="text/javascript" src="3js.js"></script>
</head>
<body>
    <input type="text" id = "date1">
    <input type="text" id = "date2">
    <input type="button" id = "dateButton" value="계산">
</body>
</html>

 

  4.1.2) Script

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
26
27
28
29
30
31
32
33
34
35
36
window.onload = function(){  
    document.getElementById("dateButton").addEventListener("click",dateCalcul);
    function dateCalcul(){
        var date1 = document.getElementById("date1").value;
        var date2 = document.getElementById("date2").value;
        var pattern = /(^(19|20)\d{2})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$/
        if(pattern.test(date1) && pattern.test(date2)){
            var formatDate1 = date1.replace(/(\d{4})(\d{2})(\d{2})/,'$1-$2-$3'); //YYYYMMDD 형태
            var formatDate2 = date2.replace(/(\d{4})(\d{2})(\d{2})/,'$1-$2-$3');
            var checkDate1 = new Date(formatDate1).getDate(); //1,2,3,4 형태, 메소드 적용 데이터
            var checkDate2 = new Date(formatDate2).getDate();
            checkDate1 = zeroFormat(checkDate1); //D 형태일때 0 추가 = DD형태
            checkDate2 = zeroFormat(checkDate2);
            var formatDate1Date = formatDate1.split('-')[2]; //DD 추출, 순수 입력 데이터
            var formatDate2Date = formatDate2.split('-')[2];
            
            if(formatDate1Date != checkDate1 || formatDate2Date != checkDate2){ //DD 형태 비교
                alert("입력한 날짜는 존재하지 않습니다");
                return;
            }
            var convertDate1 = new Date(formatDate1).getTime();
            var convertDate2 = new Date(formatDate2).getTime();
            var absDate = Math.abs(convertDate1-convertDate2);
            var result = absDate/(24*60*60*1000);
            alert(formatDate1+" 과 "+formatDate2+" 의 사이 날짜는 "+result+"일 입니다.");          
        }else{
            alert("19~20년도 사이의 정확한 날짜를 입력해주세요");
        }
    }
}
function zeroFormat(input){
    if(input<10){
        input = "0"+input;
    }
    return input;
}
 

 2번 라인 - dateButton Click 이벤트 추가 및 함수 실행

 

 4~5번 라인 - 날짜 데이터인 date1, date2의 value 값을 가져옴

 

 6번 라인 - 정규식 패턴 생성(사용자가 YYYYMMDD 형태로 입력했는지 검사)

 (^(19:20)\d{2}) - 제일 앞이 19 아니면 20, 그 뒤 숫자 2개 : 1900~2099

 (0[1-9]|1[0-2]) - '0 다음 1부터 9 사이 값' 또는 '1 다음 0부터 2 사이 값 : 01~12

 (0[1-9]|[12][0-9]|3[01])$ - '0 다음 1부터 9 사이' 또는 '1 또는 2 다음 0부터 9 사이' 또는 '3 다음 0 또는 1' : 01~31

 $ - (YYYYMMDDD와 같이 형식을 오버했을 때 검출함)

 

 7번 라인 - 입력한 두 텍스트 박스의 value에 패턴을 적용시키고 대응 여부를 확인(true or false)

 

 8~9번 라인 - Date 객체를 생성하기 위한 데이터 형식인 (YYYY-MM-DD)를 맞춰주기 위한 포매팅

 

 10-11번 라인 - 객체의 메소드를 적용하여 날짜를 가져옴

 

 12-13번 라인 - 날짜가 1일, 2일 과 같이 한 자리 수일 때 형식이 DD가 아닌 D가 됨. 즉 비교가 안되므로 DD형태로 변경해주기 위한 메소드인 zeroFormat() 호출

 

 ※ DD 형태로 변형해야 하는 이유

   사용자의 입력 날짜가 윤월일 인지 판별하기 위함 (2월 30일처럼 없을 수도 있는 날짜 판별)

   Date 객체의 getDate() 메서드는 입력한 날짜의 '일자'를 받아옴. 그런데 만약 2018년 2월 30일의 일자를 받아오면

   3일이 나오게 됨. 즉, 없는 일자만큼 카운트를 계산하여 가까운 있는 날짜에 더해줌. 2월 31일의 가장 가까운 날짜는

   3월 1일이며, 2월 28일에서 초과된 2일만큼 증가시키면 3월 3일이 나옴. = 계산 오류 발생.

   이러한 오류를 막기 위해 DD 형태로 변형하여 사용자가 입력한 날짜의 일자와 메소드를 적용시킨 일자를 비교하여

   일치할 경우 존재하는 날짜로 판별하고, 불일치할 경우 존재하지 않은 날짜로 판별하기 위함 

 

 14-15번 라인 - split 메소드를 사용하여 '-' 기준으로 나눈 배열의 3번째인 일자가 저장된 값을 읽어옴.

 

 17번 라인 - 사용자가 입력한 일자와 메소드를 적용시킨 일자를 비교

 

 21번 라인 - 입력 날짜에 문제가 없으면 해당 시간의 날짜를 시간으로 변환(milis)

 

 23번 라인 - 밀리 초로 변환된 두 날짜의 시간을 빼고 그 데이터를 절댓값으로 변환

 

 24번 라인 - 밀리초를 날짜로 변환하기 위해 각각의 단위를 곱 연산 후(1000*60*60*24 = 1일) 앞의 계산 결과와 나눔

 

4.2) 실행결과

실행결과 1
실행결과 2
실행결과 3

반응형
반응형

목차

1. 개요

2. __proto__

3. 정리


1. 개요

prototype에 대한 내용이 생각보다 많아 내용을 정리해나가며 공부를 하고 있다.

지금까지의 내용을 다시 정리하면

 

 1) 함수가 정의되면 prototype을 참조 가능한 prototype 프로퍼티, __proto__ 메서드가 생성된다.

 2) prototype은 constructor(생성자)를 참조 가능하다.

 3) 함수의 생성자로 생성되는 객체들이 prototype 객체를 상속받는다.

 4) prototype의 내용을 변경하면 생성자로 생성된 객체는 변경된 내용을 상속받게 된다. (당연한 얘기)

 5) prototype 객체를 참조하는 것은 생성한 객체의 __proto__ 메서드이다.

 

function - __proto__ - prototype 간의 관계


 

 그렇다면 __proto__에 대해 알아보도록 하자.


2. __proto__

 __proto__란 prototype link라고 불리며 객체가 생성될 때 조상이었던 함수의 prototype 객체를 가리킨다.

 

간단한 실험을 통해 알아보자

 

 1) function a(){} - 함수를 생성한다.

 2) a.prototype.a_val = 1; - 해당 함수의 prototype 객체에 a_val = 1이라는 값을 추가한다.

 3) b = new a(); - 생성자를 통해 b라는 객체를 생성한다.

 4) b.__proto__를 확인한다!

 5) __proto__에는 조상 함수의 prototype 객체인 a.prototype을 나타낸다.

 6) 이러한 관계를 b가 a를 상속받았다고 한다. 왜냐고? b.a_val를 출력하면 1이 나오니까!

b.__proto__ 객체

 

b를 출력하면 알 수 있겠지만 b객체 자체는 a_val를 가지고 있지 않는다.

__proto__ 객체밖에 없다. 바로 이 객체가 a_val 속성을 찾을 때까지 조상 prototype을 참조해나간다!

b 객체

최상위인 Object의 prototype 객체까지 찾지 못했을 경우 undefined를 리턴한다.

이렇게 __proto__ 속성을 통해 상위 프로토타입과 연결되어있는 형태를 prototype Chain이라고 한다.


3. 정리

 1) 함수가 정의되면 메모리에 함수와 생성자를 생성할 수 있는 prototype 객체가 생성된다.

 

 

 2) 함수에는 prototype 객체를 참조 가능한 prototype 프로퍼티__proto__ 객체가 생성된다. 

 

 3) 1)에서 생성된 prototype 객체 안에는 constructor 프로퍼티가 있고 이는 자신을 생성한 생성자 함수를 가리킨다.

 

 4) 함수의 생성자(new)로 생성되는 객체들은 __proto__ 객체를 상속받는다.

 

 5) __proto__ 객체는 자신의 조상 prototype 객체를 가리킨다.

 

 6) 상속된다.

 

 이 정리가 이해가 가지 않는다면 __proto__ 실험 과정과 맨 위의 그림을 번갈아가며 과정을 따라가다 보면 prototype, 즉 상속의 원리와 과정을 이해할 수 있을 것이다. 

 

 이로써 prototype을 마무리하도록 하겠다.

반응형
반응형

목차

1. 개요

2. prototype

3. 테스트


1. 개요

 앞선 글에 이어서 prototype과 __proto__의 정체에 대해 파악해보도록 하겠다.


2. prototype

 함수가 생성되면 prototype 프로퍼티와 __proto__라는 메소드가 생성된다.

 prototype 프로퍼티는 생성된 함수의 원형 정보를 가지고 있는 prototype 객체에 접근할 수 있고,

prototype 객체는 생성된 함수 객체를 가리킨다.

잊어버리지 않게 이들의 관계를 다시한번 그림으로 나타내면 아래와 같다.

prototype과 constructor의 관계


3. 테스트

 prototype이 정확히 무슨 역할을 하는지 알기 위해 몇 가지 테스트를 진행하였다.

 

1) 함수를 정의하고 prototype 출력

1
2
3
4
5
6
7
8
<script>
        function a(){
            val_a = 1
        }
        //a.prototype.val_a = 2
        console.log(a)
        console.log(a.prototype)
    </script>

console 화면

a를 출력했더니 a 함수를 정의가 나오고

a.prototype을 출력했더니 객체가 나오고 그 객체에는 constructor(생성자)와 __proto__가 정의되어 있다.

 

 

console 화면

prototype 객체가 원래의 함수객체에 어떤 영향을 미치는지 확인하기 위해 5번 라인의 주석을 해제하고 컴파일하였더니

a에는 정의했던 함수의 원형이, a.prototype에는 val_a = 2라는 프로퍼티가 추가되어 출력되었다.

 

여기에서 얻은 결론은 prototype이 함수의 원형에는 영향을 미치지 못한다는 것이었다.

원형의 의미를 가진 prototype이 원형에 영향을 못미치는게 아이러니하다. 더 파고들어 이 의미를 이해해야겠다.

 

2) 생성자 호출

1
2
3
4
5
6
7
8
9
10
11
    <script>
        function a(){
            val_a = 1
        }
        a.prototype.val_a = 2
        console.log(a)
        console.log(a.prototype)
 
        b = new a()
        console.log(b)
    </script>

 b라는 변수에 a 생성자를 생성하여 대입하고 b를 출력하였다.

 

console.log(b)

 b를 출력했더니 생성자인 a가 출력되었고, 그 안에는 __proto__가, 그 안에는

val_a : 2, constructor : f a(), __proto__: Object 가 있었다.

그리고 이 내용은 위에서 출력한 a.prototype의 내용과 동일했다.

 

이로써 prototype에 대한 정보를 얻었다.

1. 함수에 대한 prototype은 생성자를 통해 정의된 객체가 상속받는 정보이다.

2. __proto__는 해당 객체가 상속받은 prototype의 정보를 갖고 있다.

 

정확한 확인을 위해 b.__proto__ === a.prototype 라는 코드를 넣어보았더니

true가 출력되는 것을 확인할 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <script>
        function a(){
            val_a = 1
        }
        a.prototype.val_a = 2
        console.log(a)
        console.log(a.prototype)
 
        b = new a()
        console.log(b)
        console.log(b.val_a)
 
        console.log(b.__proto__ === a.prototype)
    </script>
 

b.__proto__ === a.prototype

 

공부한 내용을 정리하면

1) 함수가 정의되면 prototype을 참조 가능한 prototype 프로퍼티, __proto__ 메소드가 생성된다.

2) prototype은 constructor(생성자)를 참조 가능하다. 이를 통해 해당 함수의 생성자로 생성되는 객체들이 prototype 객체를 상속받게 되며, prototype의 내용을 변경하면 객체들은 변경된 내용을 상속받게 된다.

3) 이 prototype 객체를 참조하는 것은 생성한 객체의 __proto__ 메소드이다.

 

function - __proto__ - prototype 간의 관계

 

공부하다보니 이해가 안가는 부분이 계속 나타나고 있다. 다음 게시글로 이어가도록 하겠다.

반응형
반응형

목차

1. 개요

2. 함수 생성

3. prototype과 __proto__


1. 개요

 OOP(객체 지향 프로그래밍)에서는 객체간의 상속을 프로토타입이라는 메커니즘을 통해 구현한다.

 prototype의 사전적 의미는 원본, 초본이며, 이처럼 수정하지 않은 메소드나 생성자의 '원본'을 상속시키는 역할을 한다.

굉장히 생소해보이지만 프로그래밍 언어를 조금이라도 다뤄본 사람이라면 쉽게 이해가 가능하다.


2. 함수 생성

함수 생성 및 확인

 

F12를 눌러 관리자모드로 들어간 후 a(name)이라는 함수를 정의한다.

a를 출력해보니 위처럼

arguments, caller, length, name, prototype, __proto__가 나오는걸 볼수있다.

 

위의 용어를 하나하나 살펴보자.

용어 의미
arguments(인수) 함수가 호출될 때 함수로 값을 전달해주는 값
parameter(매개변수, 없지만 헷갈릴까봐) 전달받은 argument를 함수 내부로 전달하기위해 사용하는 변수 
caller 현재 함수를 호출한 함수
length 인수의 개수(길이)
name 함수의 이름
prototype 상속시킬 객체의 원형
__proto__ 상속받은 객체

 이 중에서 오늘의 주제인 prototype과 __proto__에 대해 알아보도록 하자.


3. Prototype

 prototype의 사전적 의미는 '원형, 원본'이다. 상속을 받을 때 해당 함수의 원형을 받아야 하기 때문에 prototype이라는 단어를 사용하는 것 같다. 그리고 prototype 객체는 함수를 생성할때 동시에 생성된다. 왜? 언제든 상속시켜줄수있도록 원본을 보존해야하니까.

 

function - prototype 구조

 

function은 prototype이라는 프로퍼티를 사용해 prototype에 새로운 프로퍼티나 메소드를 추가할 수 있고,

prototype은 constructor(생성자)를 사용해 function에 접근할 수 있다.

 

 

 

매개변수(parameter)란 함수의 정의에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수를 의미합니

 

반응형
반응형

모듈(module)

 - 코드를 재사용할 수 있는 단위로 나누어 다른 프로그램의 부품으로 사용하는 것.

 - 단위로 나누는 것은 모듈화(Modularization)이라 함.

 

날이 갈수록 프로그램은 복잡해지고 있습니다.

복잡한 프로그램일수록 유지보수와 관리, 재활용성을 높이기 위해 코드를 여러개의 파일로 나누기 시작합니다.

바로 이게 모듈입니다.

 

모듈의 장점 (출처 - 생활코딩)

 - 자주 사용되는 코드를 별도의 파일로 만들어서 필요할 때마다 재활용할 수 있습니다.

 - 코드를 개선하면 이를 사용하고 있는 모든 애플리케이션의 동작이 개선됩니다.

 - 코드 수정 시에 필요한 로직을 빠르게 찾을 수 있습니다.

 - 필요한 로직만을 로드해서 메모리의 낭비를 줄일 수 있습니다.

 - 한번 다운로드된 모듈은 웹브라우저에 의해서 저장되기 때문에 동일한 로직을 로드 할 때 시간과 네트워크 트래픽을 절약 할 수 있습니다.  

 

 

모듈 사용 예제

 그렇다면 '안녕하세요'라는 텍스트를 HTML상에 출력시키는 기능을 가진 모듈을 만들고, 다른프로그램에서 사용하는 코드를 만들어보겠습니다.

 아래의 두가지만 유의하세요

 1) 모듈파일의 확장자는 js파일.

 2) 모듈을 import시키는 코드는 head 태그 안에.

1
<script src = "모듈파일.js"></script>

3) 모듈은 javascript이므로 모듈에 있는 함수를 사용하려면 <script>태그 안에서 사용해야함

`


1. 모듈 파일을 만든다(modulefile.js). 파일 안에 output이라는 함수를 만들었다.

1
2
3
function output(){
    document.write("안녕하세요");
}

 

2. 모듈을 사용할 HTML 파일을 만들고 <script src = "modulefile.js"></script>를 입력한다.

3. body 태그 안에 <script> 태그를 넣고 그 안에 modulefile.js에서 쓸 함수명인 output()을 입력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<!doctype html>
<html>
<head>
    <title>?</title>
    <meta charset="utf-8">
    <script src = "modulefile.js"></script>
</head>
<body>
    <script>
        output();
    </script>
</body>
</html>
 

 

 


출력화면

module.html 파일에서 modultfile.js 내의 함수 호출 성공

반응형
반응형

Javascript에서의 객체(object)란?

 

사전적 의미

  1. 물건, 물체   2. 욕망, 연구, 관심 등의 대상

 

많은 사람들이 객체에 대한 정의를 하는데 조금씩 다름을 느꼈습니다.

쉬운 정의가 있는 반면, 되게 심오하고 복잡하게 정의하신 분도 있었습니다.

때문에 제가 내린 정의도 다른 정의 중 하나라고 생각하시고 글을 봐주시기 바랍니다.

 

제가 정의한 객체란

  1. 물건, 물체   2. 욕망, 연구, 관심 등의 대상

 

사전적 의미와 똑같습니다.

단! 차이점이 하나 있습니다. 바로 설명입니다. 

 

만약 우리가 자전거라는 객체 정보를 친구에게 준다고 가정해봅시다.


나(25살) : 친구야 내가 자전거에 대해 알려줄게. 자전거는 바퀴가 3개이고 페달을 밟으면 앞으로 나갈 수 있고... 

 

친구 : XX아


친구가 이미 자전거에 대한 정보를 알고 있고, 내가 아는 자전거에 대한 정보와 다를 수 있습니다. 친구는 말을 무시할 수도 있고, 자신이 생각하는 정보와 다르다면 그것을 비교하여 다시 재정의할 수 있습니다. 정보를 전달한다고 한들 그것을 받아들이는 것은 친구의 몫이죠.

 

그렇다면 컴퓨터에게 객체 정보를 준다고 가정해봅시다.


나 : 컴퓨터야 자전거에 대해 알려줄게. 자전거는 바퀴가 3개이고 페달을 밟으면 앞으로 나갈 수 있고... 

 

컴퓨터 : 아하 자전거는 바퀴가 3개이고 페달을 밟으면 앞으로 나갈수 있고... 


이처럼 컴퓨터는 자전거 객체에 대한 정보가 전~혀 없습니다.

따라서 알려주는 데로 정보를 받아들이게 됩니다. 정보가 잘못되었더라도 자전거라고 정의하게 되죠.

자전거가 멈추는 것을 알려주지 않으면, 컴퓨터에게 있어 자전거는 멈추지 않습니다. 마치 핸들이 고장 난 8ㅌ..

 

즉 설명에 따라 객체가 정의된다는 것입니다.

 

javascript에서 객체를 정의할 때에는 key값과 value값으로 나눠서 정의합니다.

 바퀴 : 2개

 소재 : 알루미늄

 무게 : 10kg

 가격 : 14만원

 기능 : 앞으로 가기, 멈추기, 점프하기

 

또한 함수를 넣을 수 있습니다.

객체를 정의할 때 함수 또한 그 객체에 포함시킬 수 있다는 것이죠.

 

그렇다면 컴퓨터에게 객체를 정의하는 것이 얼마나 중요한가를 느끼실 수 있을 겁니다. 바로 소스코드를 보겠습니다.


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<body>
    <script type="text/javascript">
        var bycycle={
            wheel : '2개',
            material : '알루미늄',
            weight : '10kg',
            price : '14만원',
            func : function(){
                document.write('앞으로가기 ');
                document.write('멈추기 ');
                document.write('점프하기 ');
            }
        }
    </script>
 
</body>
 

bycycle이라는 객체에 wheel, material 등의 변수와 func라는 함수 데이터를 넣어주었습니다.

정의하는 방법은

변수는 'key : value' 형태로 저장해야 합니다. 객체의 값은 key값을 통해 참조할 수 있기 때문입니다.

함수는 'key : funciont(){ 데이터 }' 형태로 입력해야 합니다.

 

정의를 했으니 이제 호출하는 방법을 알아보도록 하겠습니다


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<body>
    <script type="text/javascript">
        var bycycle={
            wheel : '2개',
            material : '알루미늄',
            weight : '10kg',
            price : '14만원',
            func : function(){
                document.write('앞으로가기 ');
                document.write('멈추기 ');
                document.write('점프하기 ');
            }
        }
 
        for (name in bycycle){
            document.write(name+': '+bycycle[name]+'<br>');
        }
        
    </script>
</body>

객체의 데이터를 출력하기 위해서는 반복문을 사용해야 합니다. 배열을 출력하는 것과 비슷한 맥락입니다.

다만 배열은 데이터에 대한 index값이 자동적으로 들어가고, 객체는 index값을 사용자가 정해줍니다.

 

array

index 0 1 2 3
value '핸들이' '고장난 '에이톤' '퉉'

for (int i=0;i<arr.length;i++){

      print(value[i])

}

이처럼 index값을 i라는 변수로 지정하여 value값을 출력.

 

 

object(객체)

index wheel material weight price func
value 2개 알루미늄 10kg 14만원 function()

그렇다면 객체는 어떻게 할까요.

array처럼 index 값을 변수로 지정해주는 것이 아닌 객체에서 직접 가져와야 합니다.

 

15번 라인은 bycycle이라는 객체 안에 있는 데이터의 key값을 반복문이 돌 때마다 하나씩 name으로 넣어줍니다.

아까 말씀드렸던 'key:value' 의 형태가 이처럼 사용되는 것입니다.

그렇다면 16번 라인의 name에는 객체의 첫 번째 키값인 'wheel'이 출력되게 됩니다.

 

value값은 객체명['key값']을 통해 참조할 수 있는데요.

16번 라인의 bycycle[name]은 곧 bycycle ['wheel']가 됩니다. wheel의 value값인 '2개'가 출력됩니다.

다음 반복문에서는 두 번째 key값인 material이 들어가겠고, bycycle[name]에는 bycycle['meterial']이 들어가게 되겠죠?


출력 화면

뭔가 불편한 출력화면

출력을 시켰더니 뭔가 이상하죠?

func 키값은 func이고 value는 function(){~~~} 라서 그렇군요

그럼 보기 좋게 출력시켜보도록 하겠습니다. 


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<body>
    <script type="text/javascript">     
        var bycycle={
            info:{wheel:'2개',material:'알루미늄',weight:'10kg',price:'14만원'},
            func:function(){
                document.write('앞으로가기 ');
                document.write('멈추기 ');
                document.write('점프하기 ');
            }
        }
        for (name in bycycle['info']){
            document.write(name+': '+bycycle['info'][name]+'<br>');
        }
        document.write('func: ');
        bycycle.func();
    </script>
 
</body>
 

위처럼 객체 안에 또 다른 객체를 정의해주었습니다.

4번 라인에 bycycle이라는 객체 안에 info라는 객체의 이름으로 또다른 객체를 정의했습니다.

객체 안에 또다른 객체를 정의할 때는 key:{key:value,key:value ...} 형태로 해주시면 됩니다.

 

11번 라인에 bycycle['info']라는게 뭔지 아시겠죠? bycycle의 객체의 info 객체입니다.

아까와 마찬가지로 name에는 info 객체 안의 key값인 wheel, material, weight, price가 차례로 들어가게 되고

bycycle['info'][name] 은 bycycle['info']['whell'] -> bycycle['info']['material'] -> ... 이 되어 각각에 해당하는 value값이 출력되게 됩니다.

15번 라인에 bycycle.func(); 은 bycycle 객체 안에 있는 func 함수를 호출합니다.

func 함수는 앞으로 가기, 멈추기, 점프하기라는 문자열이 HTML 문서에 출력되게 하므로 보기 좋게 앞선 14번 줄에 'func:'라는 문자열을 출력시켰습니다.


출력 화면

덜 불편한 출력화면

(whell 오타)

반응형

+ Recent posts