[Closure] : 함수의 변수 접근

ESH'S VELOG·2023년 11월 23일
1

💡 [Closure]

함수와 함수 외부 변수와의 관계를 말합니다.

let a = 1;
function b () {
	console.log('abc')
}

이 때 b의 클로저 관계에 있는 외부 변수를 a라 볼 수 있습니다.

이렇게만 보았을 때, 쉽게 와닿지 않을 수 있습니다.
이번에 백준 알고리즘을 풀면서 이 문제에 쉽게 접근할 수 있었는데, 예시를 보겠습니다.

⏰ 문제

  • 문제는 10950번으로 테스트 케이스 개수 T가 있고
    각 테스트 케이스는 한 줄이며 A와 B가 주어져 T의 개수만큼 입출력되는 프로그램을 짜는 것 입니다.

  • 입출력을 프로그램을 짤 때 사용되는 모듈은 두 가지가 있는데, readline과 fs(file system)입니다.

  • fs가 코드량이 적어서 많이 사용하지만 저는 VS code로 연습해가면서 사용하기에는 readline이 편해서 rl을 사용하였습니다.

const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

rl.on('line', function (line) {
    let input = []
    input.push(line)
    rl.close()
})
rl.on('close', ()=> {
    console.log(input)
    process.exit()
})
  • 실행결과

우선, 입력받은 line을 배열에 밀어넣은 후 반복문을 돌리기 위해 테스트 코드를 작성했습니다.
또한 출력 시간을 단축하기 위해 close될 때 변수 input을 console.log를 찍어보았습니다.
이 때, input이 정의되지 않았다고 console.log가 찍히지 않는다고 에러가 뜹니다.
이는 rl.close()함수가 rl.on()함수 내부의 변수인 input에 접근할 수 없기때문에 생기는 일입니다.


실행기에서 코드를 접어보면 더 정확히 알 수 있는데요, close()함수는 선언되었을 당시 순서를 보면

  • rl.close() -> anonymous
  • rl.on('line'),()=>...) -> anonymous
    위와 같이 각 함수들은 서로 내부 함수에 선언된 변수에 접근할 수 없습니다.

이를 통해 클로저로 인한 내부 변수 접근 불가에 대해 충분히 이해할 수 있었습니다.

결국 input 변수에 접근하기 위해서는 전역변수를 사용해주어야 합니다.

const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

let input = []
rl.on('line', function (line) {
    input.push(line)
    rl.close()
})
rl.on('close', ()=> {
    console.log(input)
    process.exit()
})

이렇게 전역변수를 선언해주면 close함수도 console.log로 접근이 가능합니다.
좋은 코드는 아니지만 간단한 코드이니 넘어가기로..

profile
Backend Developer - Typescript, Javascript 를 공부합니다.

1개의 댓글

comment-user-thumbnail
2023년 11월 28일

좋은 정보 감사합니다.

답글 달기