본문 바로가기
IT 개발/JavaScript

05. 함수

by Love of fate 2020. 1. 10.
728x90
반응형

함수

- 함수란 프로그램의 코드를 저장한 공간 

- 변수에는 데이터만 저장할 수 있고, 코드는 저장할 수없으며, 함수를 사용하면 코드를 메모리에 저장했다    가 필요할 때마다 호출하여 사용할 수 있다. 

 

* 변수와 함수의 차이점

변수 함수
1개의 데이터만 저장 자바스크립트 코드를 저장
var 라는 키워드를 이용하여 선언 function이라는 키워드를 이용하여 선언
문자형, 숫자형, 논리형 테이터를 보관 출력문, 제어문 등의 코드를 저장하고 데이터를 반환
객체를 참조함  

기본 함수 정의문

- 함수를 사용하여 코드를 저장한 것을 '함수 정의문'이라고 한다.

- 변수를 선언할 때 var 키워드를 사용한 것처럼 함수에서는 function 키워드를 사용해 변수를 선언

기본형

1. 일반 함수 정의
function 함수명(){
	자바스크립트 코드;
}

2. 익명 함수 정의
참조 변수 = function(){
	자바스크립트 코드;
}

//함수 정의문 안에 작성된 코드는 즉시 실행되지 않는다. 함수는 메모리에 할당되어 대기하고 있다가 
//함수가 호출되면 실행 된다.

함수 호출 기본형

함수명();
참조변수();

 

일반함수 정의 방식과 익명 함수 선언 참조 방식의 차이점

- 일반 함수 정의는 함수 호출 시 호이 스팅(hoisting) 기술을 지원한다. 

- 익명함수 선언 참조 방식은 호이 스팅을 지원하지 않는다.

- 호이스팅을 적용하면 함수 정의문보다 호출 문이 먼저 나와도 함수 정의문을 끌어올려 함수를 호출한다.

<script>
    var count = 0;

    //함수 호출문이 먼저 나와도 호이스팅 방식이 적용되어 정상적으로 함수를 호출
    myFnc();

    function myFnc(){
        count++;
        document.write("hello" + count, "<br/>");
    }

    myFnc();

    var theFnc = function(){
        count++;
        document.write("bye" + count,"<br/>");
    }

    theFnc();
</script>

매개변수가 있는 함수 정의문

- 기본 함수 정의문은 함수 안에 있는 코드를 실행할 때 단순히 함수명으로 호출해서 코드를 실행

  즉, 함수를 호출할때, 값을 전달할 수 업다. 

- 매개변수가 있는 함수 정의문은 함수를 호출할 때 전달하고자 하는 값을 입력하여 호출할 수 있다. 

  이렇게 전달된 값은 매개변수가 받아 함수 정의문에서 사용할 수 있다.

기본형 

function 함수명(매개변수 1, 매개변수 2, 매겨변수n){
	자바스크립트 코드;
}

함수명(데이터 1, 데이터 2, 데이터 n);

매개변수 없이 함수에 전달된 값 받아오기

- 함수 정의문에서 arguments을 사용하면 매개변수를 사용하는 것처럼 함수 호출 문의 값을 받아올 수 있다.

- 함수 정의문에 매개변수가 없는 상태에서 데이터를 전다 하여 함수를 호출하면 그 값은 배열에 저장된다.

- 함수 정의문에서는 그 값을 arguments라는 변수로 참조함

arguments 기본형

function 함수명(){
	arguments;
}

함수명(데이터1, 데이터2, 데이터3);

ex) 매개변수를 생략한 함수 호출 문에서 3개의 숫자형 데이터 전달

function sum(){
	//매개변수 없이 함수 호출문에 전달된 값들은 배열로 저장됨
	var sum = arguments[0] + arguments[1] + arguments[2];
    
    document.write(sum); //60
};

sum(10, 20, 30); 

//-----------------------------------------------------------

function sum(){
	var sum = 0;
    
    for(var i=0; i < arguments.length; i++){
    	sum += arguments[i];
    }
    document.write(sum); // 60
}

sum(10, 20, 30);

함수에서 return 문의 역할

- return 문은 함수에서 결괏값을 반환할 때 사용

- return 문이 실행되면 반복문의 break문과 비슷하게 코드가 강제로 종료됨

return 문의 기본형

function 함수명(){
	
    자바스크립트 코드1; --2 : 함수 코드 실행
    return 데이터(값); --3 : 자바스크립트 코드 2를 무시하고 데이터를 반환
    
    자바스크립트 코드2;
}

var 변수 = 함수명(); --1 : 함수 호출문

재귀 함수 호출

- 함수 정의문 내에서 작성한 코드로 함수를 다시 호출하는 것을 재귀 함수 호출이라 한다. 

- 재귀 함수 호출은 함수를 반복문처럼 여러 번 호출하기 위해 사용

재귀 함수 호출 기본형

function myFnc(){
	자바스크립트 코드;
    myFnc();
}

myFnc();

ex) 재귀 함수 호출을 적용하여 1~10까지의 값을 출력

<script>
    var num = 0;
    function testFnc() {
        num++;
        document.write(num, "<br/>");

        if(num == 10)return;

        testFnc();
    }

    testFnc();
</script>

함수 스코프 개념 이해

- 스코프(scope)의 사전적 의미는 '범위'이며, 여기에서는 변수 또는 함수의 유효 범위를 가리킴

- 스코프란 변수 또는 함수의 유효 범위

- 지역 변수란 스코프 영역에서 선언한 변수, 스코프 영역에서만 사용 가능

- 지역 함수란 스코프 영역에서 선언한 함수를 가리킴, 스코프 영역에서만 호출 가능

 

전역 함수와 지역 함수의 차이

- 전역 함수는 자바스크립트 어디에서든 사용할 수 있는 함수

- 지역 함수는 함수 스코프에서만 사용할 수 있는 함수

기본형

function 함수명1(){ //전역함수
	자바스크립트 코드; 
}

function 함수명2(){
	function 함수명3(){ //지역 함수
    	자바스크립트 코드;
    }
}

전역과 지역을 나누는 이유

- 프로그램을 개발할 때 전역(Global)과 지역(Local)을 나누면 충돌을 피할 수 있다.

- 같은 이름의 전역 변수나 전역 함수를 사용하면 충돌이 발생한다. 또 다른 개발자가 이미 개발해 놓은 라이브러리나 플러그인의 변수 또는 함수의 이름과 자신이 사용하는 변수나 함수의 이름이 같은 경우에도 충돌이 발생할 수 있다. 

<script>
	var num = 100;
    function menu(){ //개발자 1
    	num +=100;
        alert(num);
    }
    
    menu();
    
    function menu(){ //개발자 2
    	alert(num);
    }
    
  //B 개발자가 만든 함수명이 같아서 개발자 A가 만든 함수는 제거되고 개발자 B가 만든 함수만
  //호출 된다.
    
 </script>   

즉시 실행 함수

- 개발자 A와 B가 지역 함수를 사용하여 함수를 선언했다면 함수가 충돌하는 불상사를 피할  수 있다.

- 지역 함수 선언에 사용하면 효과적임

- 함수 선언과 동시에 함수를 호출할 수 있다.

기본형

(function(){
	자바스크립트 코드;	
}());

(function(){
	var 변수명; //지역 변수 
    
    function 함수명(){ //지역 함수
    	자바스크립트 코드;
    }
}());

ex) 개발자 A와 B가 즉시 실행 함수에 지역 변수와 지역 함수를 선언하여 충돌을 방지한 예제

(function(){
	var num = 100;
    
    function menu(){
    	num += 100; 
        alert(num);
    }
    
    menu();
}());

(function(){
	var num = 100;
    
    function menu(){
    	alert(num);
    }    
}());

객체 생성자 함수의 활용

객체 생성자 함수

- 내장 객체를 생성할 때는 이미 자바스크립트 엔진에 내장되어 있는 객체 생성자 함수(Object Constructor Function)를 사용하여 객체를 생성

기본형

function 함수명(매개변수1, 매개변수2, 매개변수n){ //객체 생성자 함수
	this 속성명 = 새 값;
    this 함수명 = function(){
    	자바슼립트 코드;
    }
}

var 참조 변수(인스턴스 네임) = new 함수명(); //객체 생성

var 참조 변수 = {속성 : 새 값, 함수명 : function(){}}

ex) CheckWeight라는 이름으로 객체 생성자 함수를 선언하고 2개의 객체를 생성

- 생성된 각각의 객체에는 속성(이름, 키, 몸무게)과 함수(getInfo(), getResult())를 등록

//객체 생성자의 함수명은 소문자로 시작해도 되지만 가능하면 대문자로 만드는 것이 좋다.
//(개발자 간의 약속)
function CheckWeight(name, height, weight){ 
	this.userName = name; //생성한 객체에 이름, 키, 몸무게 등의 속성을 등록한다.
    this.userHeight = height;
    this.userWeight = weight;
    this.minWeight;
    this.maxWeight;
    
    this.getInfo = function(){
    	var str = "";
        str += "이름 : " + this.userName + ",";
        str += "키 : " + this.userHeight + ",";
        str += "몸무게 : " + this.userWeight + "<br>";
        return str;
    }
    
    this.getResult = function(){
    	this.minWeight = (this.userHeight - 100)*0.9 -5;
        this.maxWeight = (this.userHeight - 100)*0.9 +5;
        
        if(this.userWeight >= this.minWeight && this.userWeight <= this.maxWeight){
        	return "정상 몸무게 입니다.";
        }else if(this.userWeight < this.minWeight){
        	return "정상 몸무게보다 미달입니다.";
        }else{
        	return "정상 몸무게보다 초과 입니다.";
        }
    }
}

var jang = new CheckWeight("장보리", 168, 62);
var park = new CheckWeight("박달재", 180, 88);
console.log(jang);
console.log(park);

document.write(jang.getInfo());
document.write(jang.getResult());

메모리 절약을 위한 프로토타입 사용하기

- 앞에서 설명한 대로 객체를 생성하면 객체를 생성한 만큼 함수가 등록된다

- 함수를 여러 개 등록하면 메모리 공간을 많이 차지하여 메모리를 낭비하게 된다

- 객체 생성자 함수에 프로토타입(Prototype)을 사용하여 함수를 등록하면 메모리 낭비를 줄일 수 있다

- 프로토타입(Prototype)의 사전적 의미는 '원형'이다

- 자바스크립트에서 '원형'은 객체 생성자 함수를 의미, 프로토타입을 사용하여 등록한 함수는 원형(객체 생성자 함수)에서 생성된 객체를 공유할 수 있다. / 여러 개의 함수를 등록할 필요가 없다.


자바스크립트 내장 함수

- 내장함수란 자바스크립트 엔진에 내장된 함수를 말함 / 개발자가 함수를 정의하고 호출문을 사용해 함수 안에 있는 코드를 실행, 하지만 내장 함수는 개발자가 함수를 직접 선언하지 않아도 된다. 

- 자바스크립트에 이미 내장된 함수는 바로 호출할 수 있다

 

내장함수의 종류

종류 설명 사용 예
encodeURI() 문자를 유니코드 값으로 인코딩함(영문, 숫자, 일부기호(; , / ? : @ & = + $)는 제외) encodeURI("?query=값"); -> "?query=%EA%B0%91"
encodeURIComponent() 문자를 유니 코드값으로 인코딩함(영문, 숫자 제외) encodeURICOmponent("?query=값")   -> "%3Fquery%3D%EA%B0%91"
decodeURI() 유니 코드값을 디코딩해 다시 문자화함 decomdeURI("?query=%EA%B0%91")   -> "?query = 값"
decodeURIComponent() 유니 코드값을 디코딩해 다시 문자화 함 decodeURIComponent("%3Fquery%3D%EA%B0%91") -> "?query=값"
parseInt() 문자열 데이터를 정수형 데이터로 반환 parseInt("5.12") -> 5
parseInt("15px") -> 15
parseFloat() 문자열 데이터를 실수형 데이터로 반환 parseFloat("5.12") -> 5.12
parseFloat("65.5%") -> 65.5
String() 문자형 데이터로 반환 String(5) -> "5"
Number() 숫자형 데이터로 반환 Number("5") -> 5
Boolean() 논리형 데이터로 반환 Boolean(5) -> true
Boolean(null) -> false
isNan() is Not a Number의 약자이며 숫자가 아닌 문자가 포함되어 있으면 true를 반환 isNaN("5-3") -> true
isNaN("53") -> false
eval() 문자형 데이터를 따옴표가 없는 자바스크립트 코드로 처리 eval("15+5") -> 20

 

728x90
반응형