Post

자바스크립트 함수 & 클래스

함수
함수는 선언문, 표현식이 있음.
둘다 arguments 객체를 가지고 있다.
(단, 화살표함수는 arguments 객체가 없음)
함수 인자는 기본 undefined, 리턴할때 별 다른것을 반환하지 않으면 undefined가 리턴됨.

함수는 함수의 인자로 전달될 수 있음.
함수 자체가 넘어가는게 아니라 메모리셀의 참조값이 넘어가는거임.
고차함수 안에서 해당함수가 실행됨. 콜백함수라고 함.
그리고 고차함수는 함수를 인자로 받거나, 반환하는 함수임.

함수 사용시 주의점
함수내부에서 외부의 값을 변경하는 것은 좋지 않다.
예를들어 배열이나 객체를 전달했는데, 함수내부에서 그 전달받은 배열이나 객체의 값 자체를 수정하는 부분은 좋지 않음.
얕은복사를 통해, 복사본을 처리하고 리턴하는게 좋음.(원본훼손X)
(얕은복사 방법 : Array의 from, slice, 전개연산자(…))
(깊은복사 방법 : structuredClone())
깊은복사는 객체내부에 또다른 객체가 존재하면 원본훼손의 위험이 있으니 이럴경우에 사용.

생성자 함수
이건 요즘 클래스로 사용하는 것과 비슷한데,
예전에는 클래스가 없을때 생성자 함수를 사용했닥 함.
지금 쓰는 클래스는 문법적 설탕 처리를 했다고 함..
국룰로 메서드이름 맨앞 철자를 대문자로 해야됨.
클래스와 다르게 컨스트럭터를 사용하지 않는데, 이건 생성자 함수가 자체적으로 컨스트럭터 역할을 한다고 함.
(근데 요즘은 생성자 함수 안쓴다넹..)

클래스
하.. 회사에서는 이미 만들어진 생성자 함수만 사용하다보니
내가 직접 클래스를 만들어볼 역사 자체가 없었다.
무려 5년 넘게 다니면서;

클래스 배우는데 헷갈리는 개념이 하나 있었으니..
바로 프로토타입과 화살표함수의 차이였다.
그냥 넘어갈 수 없었음.. 알때까지 파보았다.

프로토타입 메서드 & 화살표 함수
클래스는 Heap영역에 존재한다.
클래스는 프로토타입 객체를 가지고 있는데, 여기에 프로토타입 메서드가 있음.
결국 프로토타입 메서드도 Heap영역에 존재함. 해당 클래스로 만들어진 인스턴스가 프로토타입 메서드를 사용하게 되면
프로토타입 메서드가 존재하는 Heap영역의 메모리셀을 찾아간다.

인스턴스가 해당클래스로 1개가 만들어지든 2천개가 만들어지든 1만개가 만들어지든, 그 인스턴스들은 단 하나의 프로토타입 메서드를 서로 공유해서 사용하게 되는 것이다.

그런데 여기서 하나 문제가 발생할 수 있는 부분이 있음.
바로 해당 인스턴스의 프로토타입 메서드를 다른 메서드의 인자값으로 전달하거나 다른 변수로 전달하게 될 경우, this를 잃어버리기 때문에 해당 메서드를 온전히 전달할 수가 없게됨.

이 경우에는 클래스 컨스트럭터 내부에 프로토타입 메서드를 재정의 해야 하는데, bind(this)를 통해 해당 인스턴스로 이 메서드를 묶어주는 처리를 해줘야 한다.

그럼 고차함수의 인자로 전달되도 해당 인스턴스의 메서드로 잘 전달이 됨.

자 그런데 여기서 화살표 함수라는게 있다.
이 화살표 함수라는 것은 클래스에서 인스턴스를 만들게 되면,
해당 인스턴스를 this로 자동 인지되게 한다.
그래서 고차함수에 이 인스턴스의 메서드를 인자로 넘겨도 알아서 잘 사용 된다.

그럼 화살표함수 쓰면 만사 오케이! 아닌가?
그렇기도 한데, 대신 인스턴스가 생성될때마다 개별적인 메서드가 생성되는 것이기 때문에 프로토타입을 공유해서 사용할때보다는 메모리 비효율적인 측면이 부각될 수 있다.

그럼, 프로토타입으로 사용하다가, 고차함수 인자로 넘겨줄때에만
해당 함수를 재정의해서 bind(this)처리 한 후 사용하면 되지 않을까?
생각해봤지만, 이건 관리적 측면에서도 난감해지는 경우가 발생한다.
인스턴스별로 기능의 통일성이 훼손된다고 볼 수 있음.

내 개인적 생각으로는 보통은 화살표함수로 사용하지 않을까 싶다..

클래스를 배우면서 만들때 관계성이 상당히 중요한 부분이라 느꼈고,
DB 테이블 설계와 뭔가 비슷한 결이 느껴짐.

This post is licensed under CC BY 4.0 by the author.