함수 형태

함수 형태

728x90

함수 선언

function fn1(){

console.log("fn1함수 입니다.");

}

함수 선언식은 실행위치에 상관없다.

함수 선언을 위에 작성해도 함수는 실행된다.

글로벌 객체로 등록이 되어서 함수를 분석하고, window라는 글로벌 객체에 등록되고 실행된다.

함수 표현식 : 이름 없는 익명함수를 함수표현식으로 정의하고 변수에 대입한 것

var fn2 = function(){

console.log("fn2함수 입니다.");

}

함수표현식은 함수표현식 아래에 작성을 해야 실행이 가능하다.

위치에 따라서 실행이 될 수도 있고, 안될 수도 있기 때문이다.

var a = 10;

var b ="햄스터";

var c = function(a, b) {

return a + b;

}

으로 진행을 할 경우 변수 호이스팅, 변수 끌어올리기가 실행된다.

var a, b, c;

//선언 변수를 최상단에 올려버린다. undifiend의 값이 저장된다.

c();//함수를 선언하게 되면 함수가 아닌 undifiend의 값이 실행된다. 그래서 값이 없다고 나온다.

a = 10;

b = "햄스터";

c = function(a, b) {

return a + b;

}

그렇기 때문에 에러가 나는 부분을 확인하면 fn2 is not a function at이라는 함수가 아니라는 글이 뜬다. 변수끌어올리기가 실행되어서 메소드가 실행되지 않는다.

함수를 매개변수로 사용하기 , 단일책임의 원칙을 지켜주자

자바스크립트는 매개변수에 함수를 넣어 연산을 할 수 있다. 자바의 방식의 경우

function 계산기(num1, num2, type) { //계산을 하는데 어떤 연산이 올지 몰라 type을 매개변수로 둠

if(type === '더하기') {

console.log("결과" ,num1 + num2)

} else if(type === '곱하기') {

console.log("결과" ,num1*num2)

}

} 이 계산기는 수정을 할 수 없고, 정해져 있기 때문에 값을 변경할 수 없다. 계산기(10,20,'더하기');

계산기(10,20,'곱하기');

좀더 나은 방식으로 계산기를 작성하고 싶다. 함수를 매개변수로 전달받는 함수 새로운 연산기능의 추가 되더라도 계산기2()의 코드가 변경되지 않도록 만들고 싶다. function 계산기2(num1, num2, fn) {//fn에 함수가 들어오게 함, 자바스크립트는 함수를 매개변수로 전달할 수 있다.

fn(num1, num2); //함수안에 (숫자1, 숫자2)를 넣는다.

}//계산기2는 이코드가 끝이다. 계산기 2()는 두 수를 연산하는 기능을 직접 구현하지 않고, 연산기능이 구현된 함수를 전달 받아서 그 함수를 실행시키기만 한다. 실제로 실행할 부분은 개발자가 구현해놨으니까 함수를 매개변수로 전달받은 함수 너는 구현만해 확장성이 넓어졌다. 새로운 함수를 추가되더라도 계산시2의 메소드는 변경하지 않아도된다. 실제 실행하는 코드는 다양한 기능을 수행하기 때문에 이런 형태의 메소드들이 많다. 계산하는 코드를 따로 둔다.

function plus(a, b){

console.log(a + b);

}

function minus(a, b){

console.log(a - b);

} 사용한다. 계산기2(100, 200, plus); //plus의 기능을 전달해줌 계산기2(100, 200, function plus(a, b) {console.log(a + b)}) 계산기2(100, 200, minus); 계산기2(100, 200, function minus(a, b) {console.log(a - b)}) 아래 작성된 부분이 사실은 이런 형태로 전환되는 것을 의미한다. 그냥 계산기2()함수를 실행할 때 익명함수를 호출시점에 직접 작성해서 전달해도 상관없다. 계산기2(100,200,function(a, b) {

console.log(a*b);

}) 그냥 그자리에서 즉석으로 함수를 만들어서 전달해도 된다. 내가 실행시키고싶은 함수를 직접 구현해서 전달하고 싶을 때 함수를 만들어서 메소드 호출시점에 전달해도된다. 계산기2(100,200,function(a, b){

console.log(a/b);

})

화살표 함수 (함수 표현식을 더 단순하고 간결한 문법으로 정의하는 것)

var 변수 = (매개변수, 매개변수, 매개변수) => 수행문

//function이라는 기호를 사라지게 하는 것

var 변수 = (매개변수, 매개변수, 매개변수) =>{

수행문;

수행문;

}

//수행문이 2개이상이면 중괄호가 필요하다.

화살표 함수의 특징 매개변수가 없는 화살표 함수는 다음과 같이 작성하고, 괄호를 생략할 수 없다. var 변수 = () => 수행문 매개변수가 하나만 있는 화살표 함수는 매개변수를 감싸는 괄호를 생략할 수 있다. var 변수 = 매개변수 => 수행문 var 변수 = (매개변수) =>수행문 수행문이 하나만 있는 화살표 함수는 중괄호가 필요없다. 수행문이 하나만 있는 화살표 함수에서는 return키워드를 생략해도 수행문의 실행결과가 반환값이 된다. 수행문이 2개 이상 있는 화살표 함수는 중괄호가 필요하다. 수행문이 2개 이상 있는 화살표 함수가 반환값이 있는 경우 return키워드를 사용해서 값을 반환해야한다.

함수는 어떤 작성 방식이 좋을까? 첫번째 고려대상은 언제나 함수선언이다. 함수선언 방식으로 정의한 함수는 그 함수를 선언위치와 상관없이 사용할 수 있다. 함수의 이름을 통해서 어떤 기능이 정의된 함수인지 빠르게 파악할 수 있다. 함수의 몸체에 해당하는 부분에 복잡한 수행문을 작성할 수 있다. function 계산기(a, b, fn) {

var x = fn(a, b);

console.log("결과", x);

} 함수로 구현한 기능이 딱 한군데에서만 사용되거나 혹은 다른 함수의 매개변수로 전달하는 함수인 경우 함수표현식을 고려할 수 있다. 함수 표현식도 중괄호 안에 복잡한 수행문을 작성할 수 있다. 함수를 호출할 때 그 함수의 매개변수로 함수가 전달되는 경우, 전달되는 함수를 함수표현식으로 작성하는 것이 좋다. 함수를 호출할 때 그 함수의 매개변수로 함수가 전달되는 경우 전달되는 함수의 코드가 간단하다면 화살표 함수를 고려할 수 있다. 계산기(10,20, function(a, b){

return a + b;

}) 화살표 함수 계산기(10, 20, (a,b) =>a - b); 중괄호로 묶게되면 return문을 꼭 적어주어야한다.

자바의 람다식 (타입변수명, 타입변수명) => 수행문; (변수명, 변수명) =>수행문 특징 반드시 부모는 거의 다 인터페이스나 부모클래싀 메소드를 재정의할 때 사용한다. 무조건 부모가 있어야한다. 재정의할 메소드가 딱 하나만 존재해야한다. ex)interface A{void m1(); void m2();} //불가하다

ex ) interface Pen() { void draw()} public class Painter {public void (Pan pan) { pen.draw(); }} //선긋기 작업 Painter painter = new Painter() painter.drawLine(Pen타입의 객체가 들어가야한다. ); 1번 Pen을 구현한 구현클래스로 객체를 만들어서 전달한다. class Yellowpen implements Pen{public void draw(){노란색으로 그려요 }} Pen p1 = new YelloPen(); painter.drawLine(p1); 2번 익명객체를 만들어서 전달하기 Pen p2 = new Pen(){public void draw(){빨간색으로 그려요 }} painter.drawLine(p2); 3번 drawLine메소드의 매개변수자리에서 익명객체를 만들어서 전달하기 painter.drawLine(new Pen(){ public void draw(){파란색으로 그려요}}) java 7에서는 타입추론기능이 가능해진다. List books = new ArrayList(); 이젠 List books = new ArrayList<>(); 타입을 추론해서 ArrayList자리에 객체가 뭐가 들어갈 지 아는 것이다. 그럼 3번을 다시 추론하면, painter.drawLine(?); 물음표에 Pen객체가 들어가는 사실을 추론한다. painter.drawLine(() ->파란색으로 그려요);라고 작성하면 메소드와 객체의 추론하여 compile시 3번처럼 변경되어 입력이 된다. compile시 직접 익명객체로 만든다. 수행문이 2개이상이면 중괄호로 묶어주고 return을 작성해주어야한다. 수행문이 1개면 수행문으로 인식하여 return을 작성하지 않아도 된다.

함수는 f(x) = 2x + 1 을 말한다. 값 = 수행문; 예전에는 f(x) 자리에 그리스 언어인 람다를 작성했다. 자바스크립트에서는 함수로 function을 작성하고, 자바의 경우 이전의 언어인 람다식이라는 단어를 붙여서 사용한다. 값 = 수행문 이렇게 생긴 형태를 딴다고 생각하면 된다.

사용하는 경우 (람다식) interface추상메소드가 1개만 있는 경우 추상메소드가 2개이상있지 않은 경우 java의 람다식은 독립적으로 만들어 지지 않는다 . JVM이 메소드와 어떤 객체인지, 매개변수가 뭔지 추론을 할 수 있게 되었다. 수학함수에서 제일 중요한것은 f(x, y) 몇 개 입력했는가 2x + y (표현식)이 중요하다.

이것을 자바스크립트의 코드와 자바로 변경해보자 방정식(x, y) => 2x + y; public int 방정식(x, y) {return 2x + y } 껍데기는 중요하지 않다. 간단하게 적자!

728x90

from http://lionpower.tistory.com/262 by ccl(A) rewrite - 2021-12-16 19:01:12