날아라쩡글이의 블로그입니다.
함수 형태 본문
728x90
반응형
함수 선언
function fn1(){
console.log("fn1함수 입니다.");
}
- 함수 선언식은 실행위치에 상관없다.
- 함수 선언을 위에 작성해도 함수는 실행된다.
- 글로벌 객체로 등록이 되어서 함수를 분석하고, window라는 글로벌 객체에 등록되고 실행된다.
함수 표현식 : 이름 없는 익명함수를 함수표현식으로 정의하고 변수에 대입한 것
var fn2 = function(){
console.log("fn2함수 입니다.");
}
- 함수표현식은 함수표현식 아래에 작성을 해야 실행이 가능하다.
- 위치에 따라서 실행이 될 수도 있고, 안될 수도 있기 때문이다.
- <script>{
var a = 10;
var b ="햄스터";
var c = function(a, b) {
return a + b;
}
</script> 으로 진행을 할 경우 - 변수 호이스팅, 변수 끌어올리기가 실행된다.
<script>
var a, b, c;
//선언 변수를 최상단에 올려버린다. undifiend의 값이 저장된다.
c();//함수를 선언하게 되면 함수가 아닌 undifiend의 값이 실행된다. 그래서 값이 없다고 나온다.
a = 10;
b = "햄스터";
c = function(a, b) {
return a + b;
}
</script> - 그렇기 때문에 에러가 나는 부분을 확인하면 fn2 is not a function at이라는 함수가 아니라는 글이 뜬다.
- 변수끌어올리기가 실행되어서 메소드가 실행되지 않는다.
- <script>{
함수를 매개변수로 사용하기 , 단일책임의 원칙을 지켜주자
- 자바스크립트는 매개변수에 함수를 넣어 연산을 할 수 있다.
- 자바의 방식의 경우
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는 이코드가 끝이다.
- function 계산기2(num1, num2, fn) {//fn에 함수가 들어오게 함, 자바스크립트는 함수를 매개변수로 전달할 수 있다.
- 계산기 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) {
- 그냥 그자리에서 즉석으로 함수를 만들어서 전달해도 된다.
- 내가 실행시키고싶은 함수를 직접 구현해서 전달하고 싶을 때 함수를 만들어서 메소드 호출시점에 전달해도된다.
- 계산기2(100,200,function(a, b){
console.log(a/b);
})
- 계산기2(100,200,function(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<Book> books = new ArrayList<Book>();
- 이젠
- List<Book> 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 } 껍데기는 중요하지 않다. 간단하게 적자!
반응형
'중앙 HTA (2106기) story > javascript story' 카테고리의 다른 글
배열 메소드 (0) | 2021.12.16 |
---|---|
문자메소드 (0) | 2021.12.16 |
DOM (0) | 2021.12.16 |
event (0) | 2021.12.16 |
자바스크립트의 연산자, 함수 (0) | 2021.11.24 |
Comments