Q1.
궁금한게, React용 JSX에서, const navigate = useNavigate(); 이렇게 선언하면 훅을 상수로 선언한거잖아? 그런데 이때, navigate("이동할 URL")로 쓰게 되면, 상수로 선언한 내용과는 무관한거야? JS에서 기본 데이터 타입 이외의 대상을 상수로 선언한다는 것은, 어떤 객체의 틀을 고정한다는 것의 느낌이지, 선언된 대상의 모든 코드를 고정한다는 것은 아닌거야? const 선언을 기본 데이터 타입에 하는 것과는 또 다른 경우인건가?
개념 정리
- const navigate = useNavigate();라는 코드를 보면, useNavigate() 훅으로부터 반환되는 함수를 navigate라는 상수 변수에 할당하는 것입니다.
- 여기서 const 키워드는 **변수(식별자)**에 대한 재할당(reassignment)을 금지하는 역할을 합니다. 즉, navigate 변수 자체가 가리키는 값(함수 참조)을 다른 값으로 바꿀 수 없다는 뜻입니다.
- 하지만 navigate 자체가 함수이므로, 그 함수를 호출하는 것은 변수의 재할당이 아니라, 그 함수(객체) 내부 동작을 실행하는 것입니다. 이는 const 선언과 전혀 충돌하지 않습니다.
상수로 선언된 객체나 함수에 대한 오해
const 키워드를 사용할 때 흔히 갖는 오해는 "이 변수에 담긴 모든 정보가 불변(immutable)해진다"는 것이지만, 실제로 const는 변수 참조를 재할당할 수 없게 만들 뿐, 그 변수에 담긴 객체나 함수의 내부 상태를 변경 못하게 하는 것은 아닙니다.
예를 들어,
const obj = { name: 'John' };
obj.name = 'Jane'; // 가능, obj가 가리키는 참조 내부 변경
// obj = { name: 'Dave' }; // 불가능, obj에 새로운 객체를 재할당하려고 하면 에러
위와 같은 경우 obj는 const로 선언되었지만, obj가 가리키는 객체 자체의 프로퍼티 변경은 가능합니다. 단지 obj 변수 자체를 다른 객체로 바꿀 수 없을 뿐입니다.
함수의 경우
navigate 또한 함수 객체이므로 호출(navigate('이동할 URL'))하는 것은 당연히 가능합니다. 함수를 호출하는 행위는 "그 함수를 다른 걸로 바꾸는 것"이 아니라 "그 함수가 수행하도록 정의된 로직을 실행하는 것"입니다.
결론
- const navigate = useNavigate();로 선언했다고 해서 navigate 함수를 불변으로 만드는 것이 아닙니다.
- const는 변수의 재할당을 막는 것이며, 그 변수가 가리키는 객체(함수 포함) 내부를 변경하거나 함수를 호출하는 것까지 막지는 않습니다.
- 따라서 navigate('이동할 URL')로 호출하는 것은 정상적인 동작이며, 이는 const로 선언한 것과 모순되지 않습니다.
- 결국 기본 데이터 타입(숫자, 문자열 등)을 const로 선언하는 것과 객체나 함수를 const로 선언하는 것은 의미가 다소 달라 보일 수 있지만, 원리는 같습니다: 변수 자체를 재할당할 수 없게 할 뿐, 그 변수에 담긴 참조값(객체나 함수)이 어떠한 상태 변화를 내부적으로 일으키거나, 함수를 실행하는 데에는 영향을 주지 않습니다.
나의 말:
즉, JS에서 const 키워드는, 재할당을 금지한다는 것이지, 불변의 대상이 된다는 내용이 아닌거란 말이지?
대답은 핵심에 대한 개념만을 다루어서 짧게 해주고, 예시는 필요없어.
A2.
ChatGPT
1초 동안 생각
네. const는 변수에 대한 재할당을 막을 뿐, 해당 변수에 담긴 값(객체나 함수)의 내부 상태 변화나 조작을 불가능하게 만들지는 않습니다.
'언어 및 도구들 공부 > Javascript' 카테고리의 다른 글
JS에서 Json의 키에 연결된 함수값으로의 접근 (0) | 2024.12.09 |
---|---|
JS의 getter, setter (0) | 2024.12.06 |
JS ES6 export(default, named) (0) | 2024.12.06 |
서로 의존하는 기능들 중 하나만 import 하는 경우 (0) | 2024.12.06 |
조건에 대한 참/거짓을 리턴 (feat. filter()) (1) | 2024.12.05 |