반응형

자바스크립트를 공부한다면

함수를 공부한다고 해도 과언이 아닐 정도로 

함수(function)는 정말 중요하답니다.

자바스크립트 함수란?

자바스크립트의 블록으로 감싼 실행문들을 모은 집합체?라고 생각하면 됩니다.

모듈? 기능집합? 메서드? 등 다양하게 표현할 수 있는데

학교 수학 수업때 배운 함수랑 같은 개념으로 보시면 되겠네요.

 

함수 선언

함수를 만드는 방법을 알아봅니다.

함수를 만들 때 사용하는 키워드는 다음과 같습니다.

  • function + 함수 이름을 지정한다. 
  • 함수 이름 옆에 괄호를 사용해서 콤마로 구분해서 입력받을 매개변수 목록을 정의한다.
  • 다음 중괄호{}를 사용해서 함수의 몸체를 구성한다.
  • 몸체에는 원하는 구현문을 코딩한다.
  • 결과를 내보내고 싶다면 return문을 사용한다.

위 순서대로 함수를 하나 만들어볼까요?

두 개의 숫자를 입력받아 더한 값을 내보내는 함수를 만들어볼게요.

1
2
3
function addNumber(num1, num2) {
    return num1 + num2;
}
cs

function 뒤에 addNumber로 함수 이름을 정했습니다.

이름은 함수가 어떤 기능을 하는지 누가 봐도 알 수 있는 것으로 자유롭게 만들어주면 됩니다.

기능이기에 동사로 시작하고 명사로 끝나면 좋겠네요.

결합하는 부분은 대문자로 구분해 주세요.
addNumber의 N처럼요.

이제 괄호()를 사용해서 입력받을 값을 콤마로 구분해서 정의해 줍니다.

개수는 상관없지만 꼭 필요한 만큼 만들면 좋겠지요.

숫자 2개를 받기로 정했기에 num1, num2라고 간단하기 매개변수 이름을 지정해봅니다.

이제 입력받을 매개변수를 정했습니다. 다음은 함수 몸체를 만들어봐야겠지요.

함수 몸체는 중괄호{}를 사용해 블록으로 지정해서 함수의 몸체임을 알려줍니다.

{} 안에는 원하는 표현식 등 실행 로직을 구성하면 된답니다.

그리고 결과로 더한 값을 주기 위해 return문을 사용했습니다.

addNumber 함수는 입력받은 두 개의 숫자를 더한 값을 돌려주기로 했기에

return문을 사용하고 num1 + num2 식을 만들었습니다.

한 문장이 끝나면 세미콜론을 붙여주는 건 잊으면 안 되겠지요?

그래서 함수 블록문 (몸체)는 { return num1 + num2; }로 구성했습니다.

축하합니다.

이제 우리는 자바스크립트로 함수를 선언하는 방법을 알게 되었습니다.

 

좀 더 살펴보기.

하나 더 알아두면 좋은 정보가 있습니다.

우리는 함수에 입력받은 값을 숫자로 지정했습니다.

함수에 전달하는 매개 변수는 자바스크립트 기본형 데이터들도 가능하고

배열, 객체 심지어 함수도 매개 변수로 전달할 수 있습니다.

1
2
3
4
5
6
7
8
var funA = function(a) { return a * a;};
 
function testParam(func, num) {
    var b = func(num);
    return b;
}
 
console.log(testParam(funA, 4));
cs

위 예제를 보면 testParam 함수의 매개변수에 함수와 숫자를 받게 구현했습니다.

8번 라인을 보면 함수 funA를 넘겨주고 해당 함수가 testParam에서 받아

잘 실행됨을 확인할 수 있습니다.

값은 4 * 4로 16이 출력된답니다.

 

함수 표현식

앞에서 설명한 함수 선언은 일반적으로 함수를 선언할 때 사용합니다.

그런데 자바스크립트에서는 함수를 변수처럼 선언해서 사용할 수 있는데요.

함수 표현식으로 불립니다.

특이한 점은 함수에 이름이 없어도 된답니다.

익명 함수라고 합니다. function 다음에 함수 이름을 지정하지 않거든요.

그런데 이름을 지정할 수 도 있답니다.

함수 내에서 재귀로 자신을 다시 호출해서 참조하고 싶을 때 사용합니다.

함수 표현식은 위 예제에서도 사용했습니다. funA.

바로 인자로 넘기는 경우 사용한다는 것이지요. 간단한 익명 함수 표현식의 예를 보겠습니다.

1
2
3
4
var addNum = function (num1, num2) {
    return num1 + num2;
};
console.log(addNum(34));
cs

익명 함수를 만들었습니다.

addNum에 담겼으며 num1, num2 매개변수(인수)가 지정되었네요.

그리고 결과로 인수로 받은 두 값을 더하고 있습니다.

결과는 3 + 4를 계산해서 7을 출력하게 됩니다.

 

마치면서.

이번 포스팅은 여기서 마치겠습니다.

자바스크립트에서 함수는 정말 중요한 역할을 담당합니다.

함수형 자바스크립트라는 책이 출판될 정도면 아시겠지요?

그래서 다음 포스팅도 함수에 대한 이야기를 더 하려고 합니다.정말 재미있고 중요한 자바스크립트 함수 이야기다음 편에 만나요~.

 

반응형
반응형

루프 반복문에서  label문, break문 그리고 continue문 활용하기.

 

>>  신기한 연구소 tiboy.

루프 반복문으로 for문, for..in문, for..of문, while문 그리고 do..while문에 대해
포스팅을 했습니다.

더 자세한 내용은 이전 포스팅을 참조하세요.

그런데, 이 반복문을 컨트롤 할 수 있는 추가 명령어들이 있답니다.

좀 더 편하고 효율적으로 사용할 수 있는 명령어들인데요.

label문, break문 그리고 continue문이 바로 반복문의 감초 역할을 하는 친구들입니다.

그럼 label문부터 같이 알아볼까요?

 

label문

 

기본 구문은 다음과 같답니다.

label : 
  실행문장;

label에 사용하는 값은 자바스크립트에서 사용하는 정해진 식별자가 아니고
내가 원하는 식별하기 편한 값을 사용하면 된답니다.

다음처럼요.

1
2
3
4
5
6
7
goPrint:  {
    console.log('a');
    console.log('b');
    break goPrint;
    console.log('c');
}
console.log('d');
cs

goPrint라는 label이름을 지정하고 콜론 : 으로 시작합니다.

블럭문으로 범위를 정합니다.

블럭문을 실행하다가 break goPrint를 만나면 해당 블럭문의 실행을 멈춘답니다.

 

어떤 의미인지 이해가 되었나요?

원하는 기능을 하는 명령어 모음을 블럭문으로 묶어주고 이름 label을 지정해서 컨트롤할 수 있게 된 겁니다.

 

다음 예를 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var firstWhile = true;
var secondWhile = true;
var i = 0, j;
 
oneWhile : while (firstWhile){
    console.log(i);
    i++;
    j = 0;
    twoWhile : while(secondWhile) {
        console.log(j);
        j++;
        if (i == 2break oneWhile;
        if (j == 10) {
            break twoWhile;
        }
        
    }
}
console.log('i ==>' + i + ', j ==>' + j + 'end');
cs

onwWhile과 twoWhile 레이블명을 지정했네요.

oneWhile은 바로 뒤 while문을 범위로 가져갑니다.

twoWhile은 중간 while문을 범위로 가져갑니다.

oneWhile문은 twoWhile문을 포함하고 있네요.

 

oneWhile에서 i++를 실행합니다.

그럼 0이었던 i는 1이 됩니다.

두 번째 twoWhile에서 j++를 실행합니다.

그럼 0이었던 j는 1이 됩니다.

i가 2라면 oneWhile레이블을 벗어납니다.

j가 10이면 twoWhile레이블을 벗어나고 oneWhile로 이동합니다.

이유는 아직 oneWhile레이블이 살아있으니까요.

 

break문

 

이제 break문에 대해 알아볼건데요.

이미 break문을 위에서 사용했답니다.

1
2
3
        if (j == 10) {
            break twoWhile;
        }
cs

break문은 label이 있다면 해당 label을 종료하고 빠져나갑니다.

label문이 없으면 바로 위 for, while, do..while, switch문이 있다면 종료하고 
다음 문장으로 이동하게 됩니다.

break문을 사용하는 방법은 다음과 같습니다.

break [label];

예를 들어볼게요.

1
2
3
  while(true){
    break;
  }
cs

while문의 조건이 true리터럴이라 무한루프인데
실행 구문이 바로 break로 while문을 종료하게 됩니다.

break label 예제는 위 label문 예제를 참고하세요.

 

continue문

 

continue문은 이해를 잘해야 합니다.

다음 예를 보고 설명하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (var i = 0; i < 10; i++){
    
    console.log("front value i ==>" + i);
    
    if (i == 5) {
        continue;
    }
    
    console.log("back value i ==>" + i);    
}
 
...
front value i ==>4
test.js:594 back value i ==>4
test.js:588 front value i ==>5
test.js:588 front value i ==>6
test.js:594 back value i ==>6
...
cs

i가 5면 continue;입니다.

그런데 결과를 보면 4, 4, 5, 6, 6으로 5는 한 번만 출력되었습니다.

front만 출력되고 if문 아래의 back은 출력되지 않았습니다.

즉, continue문을 만나면 더 이상 해당 조건 상태의 구문을 진행하지 않고
다음 조건으로 이동하게 된다는 의미겠네요.

label문이 있다면 continue [label]로 구현해서
continue문 뒤는 실행하지 않고 다시 label로 돌아가서 실행한다는 의미입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var i = 0, j = 0;
lblFirst : while(true) {
    if (i == 4break lblFirst;
    console.log(i)
    i++;    
    if (i == 3continue;
    j=0;
    lblSecond : while(true) {
        console.log(j);
        j++;
        if (j == 4continue lblSecond;     
        if (j == 8continue lblFirst;
        console.log(j);
    }
    
    console.log(i);
}
cs

if (j == 4) continue lblSecond;

if (j == 8) continue lblFirst;

이 두 구문을 보면 j가 4면 lblSecond의 while문을 다시 실행하고
j가 8이면 lblFirst로 이동합니다.

 

지금까지 루프 반복문에서 감초처럼 사용하는
label, break 그리고 continue문에 대해 알아봤습니다.

자주 연습해서 실전에서 잘 활용해보길 바랍니다.
즐 코딩하세요.

반응형