2019.01.29 javascript 콜백함수, 객체 지향

  • 생활 코딩을 바탕으로 공부하였습니다.

객체

javascript에서는 함수도 객체다. = 값이다.
함수 자체가 값이 될 수 있다.

Function a(){} === var a = function(){}

값으로서의 함수는 변수안에만 담길 수 있는 것이 아니라
A = { b : function(){} } 처럼 값이기 때문에 객체 안에도 담길 수 있다.

객체에서 b는 key로서 그릇이며 변수와 같은 역할을 한다.
객체 안에서 변수의 역할을 한다는 것을 속성 , property라고 한다.
속성 값으로 담긴 함수를 메소드(method)라고 부른다.

()는 함수를 호출한다는 의미이다.
함수는 값이기 때문에 다른 함수의 인자로도 전달 될 수 있고
리턴값(반환값)으로도 저장될 수 있다.
배열 값으로도 가능하다.
함수는 값이기 때문에 값을 저장하는 컨테이너인 배열에도 저장 될 수 있다.

함수는 값이기 때문에
변수, 매개변수, 리턴 값, 배열 값 등에 쓰일 수 있다.
====> first - class citizen(object, value)

콜백 함수

값으로서의 함수와 밀접하게 연관된다.
어떠한 함수가 수신하는 인자가 함수인 경우 배열도 객체이다.

자바스크립트가 가지고 있으면서 쓰게 되는 메소드는 내장 객체, 메소드
우리가 만든 함수는 우리가 만든 것이기 때문에 사용자 정의 객체라고 한다.

우리가 만든 함수를 통해서 (값으로서 함수를 쓸 수 있기 때문에) 오리지널 함수의 사용방법을 완전히 바꿀 수 있다 ====> 콜백 이것이 가능한 것은 자바스크립트의 함수가 값이기 때문이다.

콜백 함수를 잘 이해해야지 나중에 좀 더 쉬운 코드들을 지속적으로 작성 할 수 있게 된다.

잘 몰라도 누군가가 물어본게 잘 몰라도 된다. 그냥 모르면 모르는대로 이해할려고 노력하면 된다.

비동기 처리 — 이해가 안되었다. ㅠㅠ (나중에 꼭 다시 봐야겠다)
동기적 처리 : 순서대로 쭉 처리 했다
비동기적 처리 : 오래걸리는 작업이 있을 때 이 작업이 완료된 후에 처리해야 할 일들로 지정 후 처리

클로저

내부함수가 외부함수의 맥랙에 접근할 수 있는 것.
함수 안에 함수를 선언하면 그 함수안에서만 작용하는 함수이므로 안정적이다.
내부함수에서 외부함수의 지역변수에 접근 할 수 있다.—> 이건 항상 쓰던건데??
외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 외부함수의 변수에 접근 할 수 있다.

ex)

function outter(){

    var title = 'coding everybody';  

    return function(){        

        alert(title);

    }

} ——> return 이 나옴으로서 function이 생을 마감했는데 

inner = outter();

inner(); ———> 변수에 접근 가능하게 됨

Private variable 가 왜 필요한가?

소프트웨어가 커지게 되면 많은 사람들이 코드를 작성하게 된다. 미래의 자기자신 과 과거의 자기 자신도 포함.

title을 설정해놓고 set_title을 이용해서 title을 바꾸고 get_title로 title을 가지고 오고 / 따라서 title을 막 수정 못하게 만듬

arguments

배열과 비슷하나 배열은 아니다.

함수에 매개변수를 정의하지 않다고 하더라도, 인자의 수를 마음대로 지정하더라도 문제가 나지 않는다.

arguments안에는 사용자가 전달한 인자가 들어가 있다.

a+=1; => a=a+1

Arguments.length —> 어떤 함수에 들어온 인자가 몇개인지 파악

ex)

function one(arg1){

    console.log(

        'one.length', one.length,    //1

        'arguments', arguments.length  //2

    );

}



one('val1', 'val2');  // one.length 1 arguments 2 

함수의 호출

객체는 속성을 가지고 있고 속성의 값이 저장되어 있다면 property라고 한다.

가장 기본적인 방법 function func();

객체 지향

객체지향 프로그래밍은 크고 견고한 프로그램을 만들기 위한 노력의 산물이다. 객체지향이라는 큰 흐름은 현대적 프로그래밍 언어들을 지배하고 있는 가장 중요한 맥락이라고 할 수 있다. 하지만 자바스크립트의 객체지향은 다른 언어들의 객체지향과 사뭇 다르다. 특히 Java나 C++과 같은 주류 객체지향 언어에 익숙한 독자라면 극심한 혼란을 경험할 수도 있다. 바로 이러한 특성 때문에 웃으면서 들어갔다가 울면서 나오게 된다.

Object Oriented Programming

객체 - 변수와 메소드를 그룹핑한 것 이렇게 그룹핑 하고 나면 다른 사이트에도 또 이용 가능(재활용성에 객체가 기여한 것)

  1. 하나의 객체 안에는 그 객체가 가지고 있는 취지에 따라 객체라는 껍질안에 넣어둔 것.

  2. 그 사이에서 여러 가지 문제들이 나타나는데 그 문제들을 해결 하기 위한 것이 지금 우리가 마주하고 있는 객체지향의 여러가지 기능들이다.(ex. This. Prototype)

객체 지향 프로그래밍 - 객체를 만들어가는 것

객체 지향 공부 방법

문법 : 객체지향을 편하게 할 수 있도록 언어가 제공하는 기능을 익히는 것.

객체를 만든다는 것은 부품화 시키는 것이다.

메소드를 사용하는 기본 취지는 연관되어 있는 로직들을 결합하여 메소드라는 완제품을 만드는 것.

은닉화 캡슐화 - 제대로 된 부품이라면 어떻게 만들어지는지 몰라도 모르는 사람도 사용 할 수 있도록 하는 것.

내부의 동작 방법을 다양한 케이스 안(객체)으로 숨기고 그 부품의 사용 방법(메소드)만을 알려준다.

인터페이스 - 부품과 부품을 서로 교환 할 수 있도록 한다. 따라서 표준이 필요하다. 그 표준에 맞추어 연결점을 인터페이스 이다. 이질적인 것들을 미리 막을 수 있도록 한다.

설계 : 좋은 객체를 만드는 것 / 현실이 훨씬 복잡하다.

오늘 배운 것 내 스스로 정리해보기

1, 객체 지향의 전체적인 그림

  • 객체 지향은 큰 프로그램을 만들기 위한 노력의 산물이다. 객체란 큰 프로그램 내에 연관되어 있는 것들을 묶어서 하나의 틀안에 넣어 놓는 것이고, 객체 지향이란 그런 객체들을 만들어가는 과정들이다. 이런 것들은 코드의 재사용성을 높여주는데 다른 곳에 재사용하면서 여러가지 문제점들이 나타난다. 이러한 문제점들을 해결해 주기 위해 객체에는 여러가지 기능들이 존재한다. 예를 들면 this. prototype 같은 것들은 객체의 재사용 과정에 생기는 문제점들을 해결.
  1. function 과 콜백함수

    • function은 하나의 객체이면서 값이다. 따라서 값이기 때문에 매개변수에 들어갈 수도 있고, 인자로도 들어갈 수 있으며, 배열 속에도 오브젝트 속에도 들어갈 수 있다. (오브젝트의 value로 쓰일 때는 메소드라고 부른다.)

    • 콜백함수는 조금 더 정의를 익히기 위해 노력해야겠다. 코드를 통해 명시적으로 호출하는 함수가 아니라 특정시점에 도달하였을 때 시스템에서 호출되는 함수.????.....

###2019.03.12 TIL

클로저

클로저(closure)은 닫혀있다는 의미다.
우리가 일반적으로 배운 함수는 output이 input에 의존하여 나와야 하나, 이제는 함수에 초기 값을 넣어주면
그게 상태정보가 되고 그 상태정보에 따라 내부에서 함수를 호출했을 때 새로운 input과 내부의 상태정보를 함께 연산하여 새로운 출력값을 나타낼 수 있게 된다.
즉 함수 내부에 상태 정보를 클로징하고 있다하여 클로저라고 부른다.
원래 함수는 실행 이후에 스택프레임이 사라지면서 사라져야 하지만 클로저는 주도권만 주고 그대로 살아 있다.

전제조건

파이썬은 first class function을 지원한다.

first class function

  1. 매개변수로 함수를 줄 수 있다.
  2. return 값으로 함수를 줄 수 있고 함수 내부에 함수 정의 가능
  3. 함수를 변수에 할당할 수 있다.

따라서 함수 내부에 새로운 함수를 정의할 수 있다.
이것을 기본 전제조건을 가지고 클로저를 만들기 위한 조건이 있다.

클로저 생성 조건

그럼 이제 파이썬에서 클로저를 만들기 위한 조건을 정리해보자.

  • 중첩 함수(Nested Function)를 갖는다.
  • 중첩 함수는 자신을 감싸고 있는 함수 영역(부모함수)의 변수를 참조하고 있다.
    • 만약 부모 함수의 변수를 변경하고 싶으면 nonlocal로 참조한다고 설정해주어야 한다.
  • 부모함수는 중첩 함수(자식 함수)를 반환한다.
  • 새로운 변수에 부모함수를 할당해주어야 한다.
    • 새로운 변수에 새로운 값을 넣게 되면 내부 상태정보와 함께 새로운 출력값을 나타낸다.

클로저 예시)

def account(clnt_name, balance):  
    def change_money(money):   #매개변수도 지역변수 이다.
        nonlocal balance            #부모 함수의 변수를 변경하기 위해 nonlocal을 사용한다.
        balance += money      #balance 는 account의 지역변수이다. global도 아니다 
        return (clnt_name, balance)
    return change_money
my_acnt=account("greg", 5000)    #원래라면 함수 호출 이후에 스택프레임이 사라져야 하지만
my_acnt(1000)   # ('greg', 6000)   #내부의 상태정보를 가지고 있다가 새로운 출력값을 나타낸다.

클로저는 class를 사용할 수 없을 때 쓴다????

파이썬에서는 class를 지원하기 때문에 클로저의 효용가치가 많이 떨어진다.
왜냐하면 굳이 클로저로 구현하지 않고 클래스를 만들어서 클래스 내부에 함수를 정의해 놓으면 언제든지 객체를 만들어서 해당 인스턴스를 불러올 수 있기 떄문이다.
따라서 클로저 같은 경우 class를 지원하지 않는 자바스크립트와 같은 언어에서 class를 재현하기 위해 사용한다. 즉 프로토타입 기반의 언어인 자바스크립트는 클로저를 통해서 클래스 기반 언어처럼 캡슐화, 모듈화 작업을 수행할 수 있다.

참조 : 자바스크립트 클로저(Closure)

+ Recent posts