Search

반응형

'자바스크립트'에 해당되는 글 38건

  1. 2022.09.25 [자바스크립트]함수 이야기 8탄, 매개변수(parameters)와 인수(arguments) 1
  2. 2022.09.12 [자바스크립트]함수 이야기 7탄, 클로저 사용하는 방법, 이해하기 편 (Closure)
반응형

여러분이 함수를 사용하려면 매개변수와 인수를 알아야 합니다.

매개변수(parameters, 파라미터), 인수(arguments, 아규먼트)의 의미 먼저 이해해 봅니다.

매개변수(파라미터)는 함수를 만들 때 어떤 값을 입력받을지 정하는 변수라 할 수 있습니다.

괄호() 안에 매개변수 이름을 지정해서 사용하면 됩니다.

1
2
3
function myFunc(a, b) {
    return a + b;
}
cs

myFunc는 함수 이름이고 괄호 안의 a, b가 매개변수가 됩니다.

인수(arguments)는 이렇게 함수를 정의할 때 선언한 a, b에 함수를 호출하면서 입력할 실제 값을 의미합니다.

myFunc(5, 6);

매개변수 a, b에 5, 6 값을 넣은 후 호출했습니다.

이때 5, 6이 인수입니다.

 

인수 사용하는 방법

인수는 객체입니다. 그리고 배열처럼 [i]를 붙여서 값을 가져올 수 있습니다.

함수를 호출할 때 설정된 매개변수로 인수를 전달하면 함수 내부에서 해당 인수 객체를

배열처럼 사용해서 값을 사용할 수 있습니다.

객체 이름은 arguments입니다.

arguments[i]; 

이렇게 함수 내에서 사용할 수 있습니다.

첫 번째 인수를 받으려면 arguments[0]로 i는 배열처럼 0으로 시작합니다.

중요한 점은 배열처럼이라는 표현을 썼는데요. 그 의미는 배열과 같은 객체는 아니라는 의미입니다.

사용법이 비슷해서 배열처럼이라는 표현을 사용하고 있습니다.

인수가 총 몇개인지 확인할 때 사용하는 속성은 length입니다.

var len = arguments.length;

1
2
3
4
5
6
7
function test(){
    for (var i = 0; i < arguments.length; i++){
        console.log(arguments[i]);
    }
}
 
test(12345);
cs

잠깐!

이 코드는 좀 이상합니다.

test() 함수는 매개변수가 1개도 선언이 되지 않았지만 7번 라인을 보면 1,2,3,4,5를 인수로 넘기고 있습니다.

보통 자바라면 오류가 발생했겠지만,

자바스크립트는 아무렇지도 않게 받아 줍니다.

그리고 해당 값은 선언된 매개변수가 없기에 사용할 수 없지만

arguments[]를 사용해서 순서대로 값을 꺼내서 사용할 수 있게 됩니다.

정말 황당하네요. ^^

매개변수가 정해졌지만 인수를 설정하지 않는다면 해당 매개변수는 함수 내에서 변수와 마찬가지로 undefined가 할당됩니다.

1
2
3
4
5
6
function test(a, b){
    console.log(a);
    console.log(b);
 
}
test(1);
cs

위 예제는 b 매개변수에 값을 넣지 않고 6번 라인처럼 호출을 한다면 undefined가 출력됩니다.

다르게 생각해 본다면 매개변수가 만들어지면 기본으로 undefined가 할당되어 있다고 생각하면 됩니다.

만약 b 값에 무조건 인수가 할당되어야 하고 undefined가 안되어한다면 기본값으로 설정할 수 있습니다.

test(a, b = 0)

이처럼 b 값이 필수여야 하며 기본(디폴트)으로 값이 무조건 있어야 한다면

그래서 사용자가 호출할 때 누락했다면 기본으로 0을 할당하는 방법으로 선언할 때 사용하면 됩니다.

 

나머지 매개변수 사용하는 방법

1
2
3
4
5
6
7
function test(a, ... others){
    console.log(a);
    console.log(others[0]);
    console.log(others[1]);
}
 
test('a'12);
cs

마지막으로 나머지 매개변수를 사용하는 방법을 알아봅니다.

위 예제를 보면... 뒤에 매개변수를 사용했습니다.

정해지지 않은 수만큼 인수를 받아야 하는 경우 위 예제처럼 점 3개를 사용하고 매개변수를 사용하면 됩니다.

해당 매개변수는 함수 내에서 배열로 사용할 수 있습니다.

자바스크립트는 정말 유연한 프로그램입니다.

그렇기에 더 자세히 살펴보면서 충분히 이해하고 사용한다면

다양한 기능을 사용할 수 있을 겁니다.

또한 자바스크립트를 깊이 공부하면서 다른 프로그램 언어 또한 깊이가 더해지는 느낌이 든답니다.

하나를 하더라도 제대로 전문가가 되어야 한다는 마음으로

열심히 읽고 코딩하면서 실력을 키워나가 봅니다.

반응형
반응형

여러분들이 자바스크립트를 공부하면 다양한 용어들을 만나게 되는데요.

가끔은 이해하기 힘든 어려운 의미를 가진 용어들을 만나게 됩니다.

그럴 땐 가끔 의욕이 상실되기도 하는데요. 하지만 걱정 마세요.

tiBoy도 자바스크립트를 공부하면서 간혹 어렵고 이해하기 힘든 용어들이 있거든요.

자바스크립트에서 클로저(closure)도 어려운 용어 중 하나입니다.

그럼 최대한 쉽게 이해할 수 있도록 같이 공부해보겠습니다.

 

클로저(closure)먼저 클로저의 정의를 찾아보겠습니다.

사전적 의미는 폐쇄입니다. 

없애거나 막거나 기능을 정지시킨다는 의미인데요.자바스크립트에서 클로저는 어떤 의미를 가지고 있을까요?

아마 폐쇄라는 의미를 활용한 기능을 의미한다고 추측해 볼 수 있겠네요.

"클로저는 어휘 환경 상태(Lexical Scoping)에 대한 참조와 함께 포함된 함수의 조합이다"

음, 무슨 의미인지 어렵네요.

먼저 Lexical Scoping(어휘 범위)라는 어려운 말이 있네요.

이 의미를 이해하는데 좀 시간이 걸렸답니다.

그럼 클로저를 이해하기 위해 필요한 용어를 하나씩 알아보겠습니다.

 

스코프(Scope, 범위) 란?

함수 또는 변수가 살아있는 시간으로 생각할 수 있습니다.

또는 메모리에 세팅되어 프로그램 내에서 아직은 접근해서 사용할 수 있는 상황도 됩니다.

함수가 선언되면 메모리에 세팅이 되고 아직은 살아있습니다.

그 뒤로 함수를 호출하고 난 뒤 남은 실행 범위 또는 종료되기 전까지 호출되지 않는다면 사라지게 됩니다.

어떤 함수 내부에 다시 함수를 선언할 수 있습니다.

내부에 선언된 함수는 내부 함수이며 이 함수의 범위(스코프)는 이를 포함하고 있는 외부 함수입니다.

외부 함수 밖 범위에는 내부 함수의 범위가 아니므로 호출할 수 없다는 의미입니다. 

렉시컬 스코프(Lexical Scope, 어휘적 범위)란?

사실 어휘적 범위? 이 말 자체가 이해하기 힘들 수 있습니다.

어휘적(lexical)은 단어들의 관계 또는 어떤 범위 안에서 쓰이는 단어들로 범위와 관계에 대한 의미가 있습니다.

즉 변수든 함수든, 함수에 대한 포스팅이니 함수를 기준으로 이야기 하자면,

자바스크립트에서 함수 function의 단어를 사용함에 그 범위는 (=어휘적 범위) 선언된 위치에 의해 결정됩니다.

전역에 function 단어로 함수를 선언하면 그 범위(렉시컬 스코프)는 전역이 될 것입니다.

외부 함수 내 선언된 내부 함수도 위치가 외부 함수 내이므로 그 어휘적 범위는 외부 함수 내부가 됩니다.

 

클로저(closure) 만드는 방법

사전적으로 폐쇄인데 이를 자바스크립트 클로저로 활용한다면,

어떤 무엇인가를 잡고 잡아둔다는 의미로도 해석할 수 있겠네요.

슬슬 자바스크립트 클로저의 의미에 근접하고 있습니다.

실제 자바스크립트 소스를 가지고 설명한다면 더 이해가 빠를 겁니다.

내부 함수에 대해 알아봤습니다.

내부 함수의 스코프는 그 함수가 선언된 범위까지입니다.

재귀는 당연히 가능할 것이며

내부 함수가 선언된 외부 함수에서도 호출할 수 있습니다.

또한 내부 함수에서는 자신을 선언한 외부 함수의 변수와 인수에도 접근이 가능합니다.

그 반대인 외부 함수에서는 내부 함수의 변수나 인수에 접근할 수 없습니다.

만약,

내부 함수에서 외부 함수의 변수 또는 인수를 사용해서 어떤 식을 완성했다고 가정합니다.

그리고 외부 함수는 내부 함수를 return으로 넘기게 됩니다.

이제 외부 함수를 실행하면

외부 함수의 변수를 물고 있는(연결되어 사용하고 있는) 내부 함수를 받게 됩니다.

여기서 주의하면서 생각할 부분은

자바스크립트에서 함수를 실행할 때마다 새로운 실행 콘텍스트(실행환경)를 생성합니다.

처음 실행한 외부 함수와 다시 실행한 외부 함수는 같은 함수를 호출했어도 다른 공간에 있으며

return 된 내부 함수도 전혀 다른 상관없는 함수가 됩니다.

다시 돌아와서 이렇게 외부 함수를 실행해서 내부 함수를 받았습니다.

이제 외부 함수의 수명은 끝났습니다.

내부 함수는 어떤 변수에 표현식으로 받았다고 치면,

그 변수를 함수 스타일로 () 실행한다면 작동을 할 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function outFunc(){
    var oa = 'out';
 
    function inFunc(i) {
        var ia = 'in';
        return oa + "==" + i;
    }
    //console.log(ia);  내부 함수 inFunc의 변수 ia 접근할 수 없다. 오류 ia is not defined
    return inFunc;
}
 
var inClosure = outFunc();
 
console.log(inClosure(99));
cs

이제 다시 생각해 봅니다.

방금 호출했던 외부 함수의 수명은 다했습니다. (물론 다시 호출하면 새로운 실행 콘텍스트에서 생성되고 수명을 다하겠지요?)

내부 함수가 외부 함수의 변수를 물고 있으면서 내부 로직에 사용하고 있다고 했습니다.

외부 함수는 이미 수명을 다했는데 말이죠.

그럼 알 수 없는 또는 선언되지 않은 변수라는 오류 메시지가 나올까요?

오류는 나지 않습니다.~

이렇게 내부 함수가 외부 함수의 변수 또는 인수를 사용해서 구현이 되어 있고

외부 함수의 수명은 다 했지만 내부 함수가 외부 함수의 return 값으로 사용되면서

외부 함수의 값을 오류 없이 사용할 수 있도록 가둬둔 의미를 클로저(closure)라고 합니다.

외부 함수의 변수를 잡아 두고 있다는 의미에서 폐쇄로 생각할 수 있겠네요.

결론.

이렇게 자바스크립트의 클로저는 정말 중요하고 잘 활용한다면 멋진 코드가 만들어질 수 있습니다.

공통에서 중요한 함수를 다룰 때도 클로저는 필요한 기능이랍니다.

이제는 클로저를 이해했으니 소스를 보면 클로저의 특징을 잘 분석할 수 있을 거라 생각해봅니다.

 

 

 

반응형