즐코

Function 함수/ return vs. console.log 본문

JavaScript

Function 함수/ return vs. console.log

YJLEE_KR 2022. 1. 6. 13:09

1. 함수 (function)

2. 함수 (function) 의 사용법

   1/ 함수 선언

   2/ 함수 호출

3. Parameter 매개변수/인자에 대하여

4. Return에 대하여

**Return vs. console.log 

 

Function 개념 정리를 미루다미루다 이제야 써본다..

return이랑 console.log의 차이에서 좀 많이 헤맸다 ^^

 

 

1. 함수(function) 

 

- JavaScript에서 이 function은 하나의 sub-program 역할을 한다고 보면 된다.

- 프로그램이 input 을 받아서 잘 처리한 다음에 output을 내어주는 개념

 

- 바로 이 sub-program인 Function이 우리가 특정 task를 동일하게 반복 수행할 때,

  우리가 반복적으로 코드를 적지 않아도 한 번만 만들어 놓으면 언제나 재사용이 가능하게끔 도와주는 아이다. 

- 이 함수는 절차지향적이지 않아서 코드의 어디에 위치하던 매번 재사용이 가능하다.

 

크게, 넓게 생각하면

언어 자체에 존재하는 기능들을 쓰거나, API를 쓸 때 함수가 생긴 걸 보고, 즉 인터페이스를 보고 

함수이름 = '아 ~ 이 함수는 이런 일을 하는 애구나'

들어갈 값 = '내가 어떤 인자를 전달해야하는 거지?'

나오는 결과 = '흠.. 어떤 값이 리턴되어서 나오겠구나..'

이런걸 생각해볼 수 있기 때문에, input/output 중요하고 + function의 이름을 잘 정하는 것이 중요하다. 

 

Point!

* 1 function은 1 task 를 하게끔 만드는 게 기본.

* 함수를 네이밍 해줄 땐 변수이름 지정할 때와 달리, 다른 사람이 봐도 아 ~ 이게 무슨 일을 하기 위한 프로그램이구나!    알 수 있게 동사, 즉 명령하는 형태로 만들어 주는 것이 좋다고 한다.  ex) PrintNumber( ) DoSomething( )

* JS에서 function의 data type은 object 이다! 

  따라서, 변수에다가 할당할 수도 있고, 다른 함수의 인자로도 전달이 가능하다.

 


2. 함수(function)의 사용법  - 함수를 어떻게 쓸 것인가?

 

우선 크게 2가지를 우리가 해줘야한다.  선언과 호출 

1- 함수를 선언하고 

2- 함수를 호출한다. 

 

1/  함수 선언

 

 #1. function 이라는 예약어를 사용해서 나 함수, 작은 프로그램 하나 만들거야 라고 선언해준다. 

 #2. function의 이름, 즉 함수명을 지정해준다.

 #3. function이라는 작은 기계에 넣을 재료, 즉 인자들을 넣을거라면 (parameter1, parameter2,...) 로 지정해준다.

 #4. task를 처리할 수 있게 코드를 작성해주는데, 중괄호 {} 를 써서 code block (코드 블럭)을 만들어준다. 

 

정리하자면, 기본적으로

function 함수명(인자1,인자2...){실행할 코드블럭...} 이렇게 선언한다.

 

 

2/ 함수 호출

 

 #1. 간단하다. 지정한 함수명을 고대로 가져온다.  printsth( ) 

 #2. 함수 종류는 크게 2가지로 볼 수 있다. 

     1- 하나는 기능을 수행하고 그냥 끝내는 아이

     2- 다른 하나는 어떤 특정한 인자를 받아와서 계산을 한 다음에, 그 계산한 특정값을 전달하는 아이(return)

1/ 함수를 정의한 부분
function sayHello(){
	console.log('hello world');
}​

2/ 함수를 실행, 사용하는 부분

sayHello()

 hello world 가 출력됨

위의 함수 같은 경우,
sayHello() 에 어떤 인자를 넣던 간에, 오직 hello world만 출력되는 단순하고 약간 쓸모없는 아이다. 

이를 좀 더 쓸모 있게 만드려면?
아래와 같이, parameter로 메시지를 전달했을 때, 이 전달된 메시지가 출력되도록 해주는 게 좋다.

function sayHello(message){
	console.log(message);
}

sayHello('Hi there!');

 


 

3. Parameter 매개변수에 대하여

 

함수에 들어갈 수 있는 인자는 가변적인 것이다.

가변적인 건 결국 '변수'라는 뜻이기 때문에 매개변수라고 한다. 

 

크게 변수는 두가지로 볼 수 있는데, 

 

 #1. primitive parameters : 단순히 숫자, 문자 등 value가 그대로 메모리에 전달되는 형태

 #2. object parameters : object 형태도 인자로서 함수에 들어갈 수가 있다.

 

저번에 공부했던 object equality 개념이 등장한다. (https://yjleekr.tistory.com/17?category=1249724)

각 object들이 같은 key:value를 가졌어도, 다른 뿌리로 여겨져서 서로 다른 object로서 메모리에 저장되듯이,

object는 특정하게 매겨진 뿌리, 원산지 reference로 함수에 전달되어진다. 

 

숫자, 문자 같은 경우는 간단하니 패스하고, 인자에 object 객체 자체를 넣을 때와 함수를 넣을 때를 생각해보자. 

object parameter의 예시 1  - 객체를 함수에 넣을 때
(객체.key로 key를 써서 객체 안의 데이터값을 불러온 거 기억하기..)

function changeName(obj){
	obj.name = "cat";
} // 객체의 key(name)의 value를 cat으로 해라. 라는 기능을 가진 함수 선언

const hoochu = {name:'hoochu'}; // 'hoochu'라는 객체를 선언함
changeName(hoochu); // hoochu 객체를 인자로 가져와 함수를 호출한다. 
console.log(hoochu); // 화면에서 결과를 보려면 함수를 출력해야지

출력물 : {name: 'cat'}

 

object parameter의 예시 2 - 함수 자체를 함수에 넣을 때
function add(a,b){
 let sum = a + b;
 return sum;
}
add(1,2);​

add 라는 함수부터 만들었고, 이 add 함수를 다른 함수에 인자로 전달해보자.

function doSomething(add){
	console.log(add)
}
doSomething(add)

이 때, 주의할점은,
함수를 인자로 넣을 때 add( ) 를 넣으면 doSomething(add())를 넣으면,
add()의 return값인 sum이 호출되야하는데, 인자 a,b가 값이 들어가지 않은 빈 상태이므로,
sum = NaN이 나오고
이 NaN이 doSomething함수로 들어가서 최종 출력은 NaN이 나온다. 
따라서, 함수 자체를 인자로 전달할 땐 함수의 이름만 넣을 것. add()가 아닌 add만 넣기 


본론으로 돌아와서, doSomething(add)는 아래와 같이 함수 자체가 출력된다. 


이 때, 전달받은 add라는 함수를 이용해서 뭔가를 하고 싶다면, 
인자를 넣은 add 함수를 변수로 선언하고 -> 변수를 출력해주면 -> add 함수가 작동해서 3이 출력됨

function doSomething(add){
	console.log(add)
    const result = add(1,2); // 받아온 인자를 할당해주고
    console.log(result) // 출력까지 해주기
}
doSomething(add)​

혹은, 그냥 간단하게 doSomething 함수에 인자값을 넣은 add()를 넣어줘도 출력됨

 

아 그런데, 매개변수, 전달인자는 같은 것 같지만 사알짝 다른 개념인듯하여 정리해보았다.

 

매개변수 (parameter) vs. 전달인자 (Argument)

 

매개변수 (parameter) 전달인자 (Argument)
함수를 정의,선언할 때 나열하는 변수 함수를 호출할 때 전달되는 실제 값
들어가는 값 : variable (변수) 들어가는 값 : value (값)
ex) 함수 정의할 때 사용되는 a,b가 매개변수

ex) 함수를 호출할 때 함수 자체에 넣어주는 1,2가 전달인자

 


 

4. return 예약어

 

return의 기능

 

#1. 함수라는 작은 프로그램안에서 어떤 값을 되돌려주는 output의 역할

    즉, 함수 내부의 내용을 저장해놨다가 외부에서 사용하게 해주는 역할

 

#2. 함수를 종료해주는 기능

 : 코드블럭 안에서 return이 중간에 나오면, return 줄에 있는 연산을 실행하고 그 결과물을 반환 해주고

 그 이후 코드 블럭에 있는 코드들은 무시한채 함수의 실행을 종료 시키고, 그 함수를 호출했던 지점으로 돌아간다.

 

즉, return 뒤에 있는 코드들은 실행되지 않기 때문에 dead code라고 하니까 되도록 넣지 말자. 

 

근데,

나는 return과 console.log가 정말 헷갈렸고 드디어 이해했다.. 정리를 해놔야겠다.

 

return vs. console.log

#1. function내부에 console.log를 쓴 경우 
function printOut(a,b){
	console.log(a*b);
}

PrintOut(3,2);

console.log 라는 출력문이 있기 때문에 바로 ! 6 이 출력되어 화면상에 찍힌다.


#2. function 내부에 return 을 쓴 경우

function returnOut(a,b){
	return a * b;
}

returnOut(3,2);

returnOut이라는 함수 내부에서 3 x 2를 하기만 하고 return이 함수를 종료해버린다. 
즉, 출력은 못한 채로 저장만 해둔 상태이다.

function returnOut(a,b){
	return a * b;
}

returnOut(3,2);
console.log(returnOut(3,2));

이 때, console.log로 출력하는 기능을 써주면, 드디어 6이 출력되고 화면상에 나오게 된다.


#3. 만약 console.log를 가진 함수를 또 출력할 경우는?

console.log(printOut(3,2))

 

처음에는,, printOut(3,2) = 6 이니까 이걸 고대로 console.log에 넣어주면 console.log(6) 이니까 6을 출력해줘야하는 거 아님?!?!? 라고 생각했는데, undefined 가 떠서 뭐지!? 싶었다.

하지만, 그렇게 단순하게 생각해서는 안되는 부분인 걸 깨달았다.

printOut 함수는 return문이 없고, 단순히 console.log로 출력하는 함수다.

즉, 화면상에 출력물이 보이긴 하지만,
실상 6이라는 숫자가 그 코드 안에서만 출력해버리고 저장은 못해준다.
값을 담고 있지 않다. 
 
return이 없는 함수들은 내부에 return undefined 가 들어있는 것과 마찬가지로 생각해도 된다. 

return이 있어줘야, 값을 저장해두는 효과가 발휘된다. 

 

좀 더 시각적으로 확인하고자 콘솔창을 이용해보았다.

function 내부에 console.log 사용 function 내부에 return 사용
출력문
3이 출력되긴 하지만, undefined도 같이 return됨

출력문
딱 3만 출력됨!

 

Comments