[코어 자바스크립트] 2.4 변수와 상수
출처 : 모던 JavaScript 튜토리얼
1. 변수(variable)
- 대다수의 자바스크립트 애플리케이션은 사용자나 서버로부터 입력받은 정보를 처리하는 방식으로 동작하는데, 변수는 이러한 정보를 저장하는 용도로 사용된다.
- 변수는 데이터를 저장할 때 쓰이는 ‘이름이 붙은 저장소’이다.
- 자바스크립트에서는
let키워드를 사용해 변수를 생성한다.
let variable;
- 할당 연산자
=를 사용하여 변수 안에 데이터를 저장할 수 있다.
let message;
message = 'Hello'; // 변수에 문자열 저장
- 문자열이 변수와 연결된 메모리 영역에 저장되었기 때문에, 변수명을 이용하여 문자열에 접근할 수 있다.
let message;
message = 'Hello';
alert(message); // 변수에 저장된 값을 보여준다.
- 변수 선언과 값 할당을 한 줄에 작성할 수도 있다.
let message = 'Hello!' // 변수 정의 후 값 할당
alert(message); // Hello!
- 한 줄에 여러 변수를 선언할 수도 있다.
let user = 'John', age = 25, message = 'Hello!';
- 한 줄에 여러 개의 변수를 선언하는 것은 코드가 더 짧아 보이긴 하지만 가독성이 좋지는 않다. 한 줄에 한 개의 변수를 작성하면 코드가 길어 보이지만 읽기에는 편하다.
let user = 'John';
let age = 25;
let message = 'Hello!';
- 개발자마자 변수를 선언하는 방식이 다양하다.
let user = 'John',
age = 25,
message = 'Hello';
let user = 'John'
, age = 25
, message = 'Hello';
let 대신 var
- 만들어진 지 오래된 스크립트에서
let대신var라는 키워드를 발견하는 경우가 있다.
var message = 'Hello';
var과let은 거의 동일하게 동작한다.var도let처럼 변수를 선언하는 데 쓰인다. 다만var는 오래된 방식이고 미묘하게 차이가 있다.
2. 현실 속의 비유
- ‘상자’ 안에 데이터를 저장하는데, 이 상자에 ‘message’라는 이름표가 붙어 있다고 가정한다. 그리고이 상자에 “Hello!”라는 문자열이 적힌 넣는다. 상자 속에는 어떤 값이든지 넣을 수 있고 원하는 만큼 값을 변경할 수도 있다.
let message;
message = 'Hello!';
message = 'World!'; // 값이 변경되었습니다.
alert(message);
- 값이 변경되면 이전 데이터는 변수에서 제거된다. 변수 두 개를 선언하고, 한 변수의 데이터를 다른 변수에 복사할 수도 있다.
let Hello = 'Hello world!';
let message;
// Hello의 'Hello world' 값을 message에 복사한다.
message = Hello;
// 이제 두 변수는 같은 데이터를 가진다.
alert(Hello); // Hello world!
alert(message); // Hello world!
변수 두 번 선언
- 변수는 한 번만 선언해야 한다. 변수를 여러 번 선언하면 에러가 발생한다.
let message = "This";
// 'let'을 반복하면 에러가 발생한다.
let message = "That"; // SyntaxError: 'message' has already been declared
- 따라서 변수는 딱 한 번만 선언하고, 선언한 변수를 참조할 때는
let없이 변수명만 사용해 참조해야 한다.
함수형 언어
- 함수형(functional) 프로그래밍 언어는 변숫값 변경을 금지한다. 스칼라(Scala)와 얼랭(Erlang)은 대표적인 함수형 언어이다.
- 이런 언어에서는 변수에 값이 일단 저장되면, 그 값을 영원히 유지한다. 다른 값을 저장하고 싶다면 새로운 변수를 선언해야만 한다. 이전 변수를 재사용할 수 없다.
- 함수형 언어는 중대한 개발에 적합한 언어이다.
3. 변수 명명 규칙
- 자바스크립트에선 변수 명명 시 두 가지 제약 사항이 있다.
- 변수명에는 오직 문자와 숫자, 그리고 기호
$와_만 가능하다. - 첫 글자는 숫자가 될 수 없다.
- 변수명에는 오직 문자와 숫자, 그리고 기호
- 유효한 변수명의 예
let userName;
let test418;
- 여러 단어를 조합하여 변수명을 만들 때는 카멜 표기법(camelCase)가 흔히 사용된다. 단어를 차례대로 나열하면서 첫 단어를 제외한 각 단어의 첫 글자를 대문자로 작성한다.
- 변수명에서 달러 기호
$와 밑줄_가 일반 글자처럼 특별한 의미를 지니진 않는다.
let $ = 1; // '$'라는 이름의 변수 선언
let _ = 2; // '_'라는 이름의 변수 선언
alert($ + _); // 3
- 잘못된 변수명의 예
let 1a; // 변수명의 첫 글자는 숫자가 될 수 없다.
let my-name; // 하이픈 '-'은 변수명에 올 수 없다.
- 변수명은 대소문자를 구분한다. 아래 선언된 두 변수는 서로 다른 변수이다.
let apple;
let Apple;
- 모든 언어를 변수명에 사용할 수 있지만, 영어를 변수명에 사용하는 것이 국제적인 관습이다.
let имя = '...';
let 我 = '...';
예약어(reserved name)
- 예약어 목록에 있는 단어는 변수명으로 사용할 수 없다. 이 단어들은 자바스크립트 내부에서 이미 사용 중이기 때문이다.
- 예약어 예 :
let,class,return,function - 예약어를 변수명으로 사용한 경우 에러가 발생한다.
let let = 20;
let return = 21;
use strict 없이 할당하기
- 변수는 정의되어 있어야 사용할 수 있지만, 이전에는
let없이도 단순하게 값을 할당해 변수를 생성하는 것이 가능했다.use strict를 쓰지 않으면 과거 스크립트와의 호환성을 유지할 수 있기 때문에 여전히 이 방식을 사용할 수 있다.
// 이 코드에는 "use strict"가 없다.
num = 5; // 변수 'num'이 정의되어있지 않지만, 단순 할당만으로 변수가 생성된다.
alert(num); // 5
- 이렇게 변수를 생성하는 것은 엄격 모드에서 에러를 발생시킨다.
"use strict";
num = 5; // error: num is not defined
4. 상수(constant)
- 변화하지 않는 변수를 선언할 때는
let대신const를 사용한다.const로 선언한 변수를 상수라 부른다.
const myBirthday = '18.04.1991';
- 상수는 재할당 할 수 없으므로 상수를 변경하려고 하면 에러가 발생한다.
const myBirthday = '18.04.1991';
myBirthday = '01.01.2021'; // error, can't reassign the constant!
- 특정 변수의 값이 절대 변경되지 않는다고 확신한다면, 값이 변경되는 것을 방지하면서 다른 개발자들에게 이 변수는 상수라는 것을 알리기 위해
const를 사용해 변수를 선언한다.
대문자 상수
- 기억하기 힘든 값을 변수에 할당해 별칭으로 사용할 때, 대문자와 밑줄로 구성된 이름으로 명명한다.
- 예) 16진수 컬러 코드에 대한 상수 만들기
const COLOR_RED = "#F00";
const COLOR_GREEN = "#0F0";
const COLOR_BLUE = "#00F";
const COLOR_ORANGE = "#FF7F00";
// 색상을 고르고 싶을 때 별칭을 사용할 수 있다.
let color = COLOR_ORANGE;
alert(color); // #FF7F00
- 대문자로 상수를 만들어 사용하면 여러 장점이 있다.
- 기억하기 쉽다.
- 오타를 낼 확률이 낮다.
- 코드 가독성이 좋다.
- ‘상수’는 변수의 값이 절대 변하지 않음을 의미한다. 그 중에는 코드가 실행되지 전에 이미 그 값을 알고 잇는 상수도 있고, 런타임 과정에서 계산되지만 최초 할당 이후에 값이 변하지 않는 상수도 있다.
- 아래와 같은 경우에는, 페이지가 로드되기 전에는 값이 정해지지 않기 때문에 일반적인 방식으로 변수명을 지었다. 하지만 최초 할당 이후에 값이 변경되지 않으므로 상수이다.
const pageLoadTime = /* 웹페이지를 로드하는데 걸린 시간 */;
- 대문자 상수는 ‘하드코딩한’ 값의 별칭을 만들 때 사용한다.
4. 바람직한 변수명
- 변수명은 간결하고 명확해야 한다. 변수가 담고 있는 것이 무엇인기 잘 설명할 수 있어야 한다.
- 실제 프로젝트에서 변수 명명시 참고할 규칙
- 사람이 읽을 수 있는 이름을 사용한다. 예)
userName,javaClass - 무엇을 하고 있는지 명확히 알고 있지 않을 경우 외에는 줄임말이나
a,b,c와 같은 짧은 이름을 피한다. - 최대한 서술적이고 간단하게 명명한다. data와 value같은 이름은 아무것도 설명해주지 않기 때문에, 피하는 것이 좋다. 코드 문맥상 변수가 가리키는 데이터나 값이 아주 명확할 때에만 이런 이름을 사용한다.
- 자신만의 규칙이나 소속된 팀의 규칙을 따른다.
변수의 재사용
- 변수를 재사용하면 변수 선언에 쏟는 노력을 좀 덜 수는 있겠지만, 디버깅에 많은 시간을 쏟아야 한다.
- 값이 다른 경우에는, 새로운 변수를 선언하는 것이 코드 최적화에 도움이 된다.
5. 요약
var,let,const를 사용해 변수를 선언할 수 있다.let- 모던한 변수 선언 키워드var- 오래된 변수 선언 키워드const- let과 비슷하지만, 변수의 값 변경 불가능
- 변수명은 변수가 담고 있는 것이 무엇인지 쉽게 알 수 있도록 지어야 한다.
6. 과제
변수 선언과 값 할당하기
admin과name이라는 변수를 선언하세요.name에 값으로"John"을 할당해 보세요.name의 값을admin에 복사해 보세요.admin의 값을alert창에 띄워보세요. “John”이 출력되어야 합니다.
- 풀이
let admin;
let name;
name = "John";
admin = name;
alert(admin);
올바른 이름 선택하기
- 현재 우리가 살고있는 행성(planet)의 이름을 값으로 가진 변수를 만들어보세요. 변수 이름은 어떻게 지어야 할까요?
- 웹사이트를 개발 중이라고 가정하고, 현재 접속 중인 사용자(user)의 이름(name)을 저장하는 변수를 만들어보세요. 변수 이름은 어떻게 지어야 할까요?
- 풀이
let ourPlanetName = "Earth";
let currentUserName = "Jiyoun";