함수와 함수 외부 변수와의 관계를 말합니다.
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()함수는 선언되었을 당시 순서를 보면
이를 통해 클로저로 인한 내부 변수 접근 불가에 대해 충분히 이해할 수 있었습니다.
결국 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로 접근이 가능합니다.
좋은 코드는 아니지만 간단한 코드이니 넘어가기로..
좋은 정보 감사합니다.