본문 바로가기
언어/자바스크립트(Java Script)

[자바스크립트] 변수 / 자료형 / 형변환

by 골절문간신배신 2024. 7. 30.

1. 변수

  • 프로그램에서 사용하기 위해 값을 담아놓는 바구니
  • 일반적으로 변수는 프로그램 안에서 값이 달라질 수 있는 데이터를 가리킴
  • 하지만 프로그램 안에서 계속 값이 바뀌지 않더라도 변수로 만들어서 사용함 (상수 변수라고 함)

 


변수 이름 지정하기

  • 변수 이름을 지정하는 것은 값을 저장해 놓은 메모리 공간에 문패를 붙이는 것과 같다
  • 프로그램 안에서 사용할 값이 메모리의 어느 위치에 저장되어 있는지 신경쓰지 않고 문패 이름, 즉 값을 넣어놓은 변수 이름만 기억해 놓으면 됨
  • 변수 이름을 쉽게 가져와서 그 안의 값을 사용할 수도 있고, 같은 위치에 바뀐 값을 저장할 수도 있음
  • 따라서 변수 이름은 서로 다르게 만들어야 함!

 


변수 이름 정하는 규칙

  1. 변수 이름은 숫자로 시작할 수 없고 이름 안에 공백이 포함되어 있으면 안 된다
    • current, _current, $current // 사용 가능
    • 25current, curr ent, current* // 사용 불가능
  2. 자바스크립트는 영문자의 대소문자를 구별한다
    • current, Current, CURRENT // 모두 다른 변수
  3. 한 단어로 이루어진 변수를 사용할 때에는주로 소문자를 사용
    • current, age, sum
  4. 두 단어 이상으로 이루어진 변수는 언더바(_)로 연결하거나 중간에 대문자를 섞어 사용
    • current_year, total_area // 스네이크 표기법
    • currentYear, totalArea // 카멜 표기법
  5. 자바스크립트에서 미리 정해 놓은 예약어(예: let 등) 는 변수 이름으로 사용할 수 없음
  6. 무의미한 변수 이름은 피한다

 


var, let, const

  • ECMAScript 2015(ES6) 이전까지는 var를 사용해 변수를 선언했음
  • 지금은 자바스크립트 역할이 커지면서 var로는 부족해서 let과 const를 사용하게 됨
키워드 선언하지 않고 사용하면? 재선언 재할당
var 오류 없음 O O
let 오류 발생 X O
const 오류 발생 X X
[선언 단계 - 일시적 사각지대] → [초기화 단계]  → [할당 단계]

* 초기화 단계까지 거쳤으면 access가 가능함

var

- 자바스크립트 엔진이 가동될 때, 선언 단계에서 초기화 단계도 함께 일어남
* var bar;로 선언해 두면, bar = undefined로 초기화 됨

let
- 자바 스크립트 엔진이 가동될 때, let은 선언 단계에서 머무름
- 코드를 만나기 전까지 초기화 단계가 일어나지 않음
* let bar;로 선언해 두면, bar = undefined로 초기화 됨

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let foo = 1;

        {
            console.log(foo); //ReferenceError: Cannot access 'foo' before initialization at 13_07.html:13:25
            let foo = 2; //console.log의 foo는 전역변수 foo(==1)을 찾아가는게 아니라 이 foo에 접근하려고 함. 근데 let은 아직 초기화가 되지 않았기 때문에 에러가 남
        }
        
    </script>
</body>
</html>​

 

* var로 선언된 전역 변수는 window 객체의 프로퍼티가 되며, let / const로 선언된 변수는 그렇지 않음


2. 자료형

  • 프로그램에서 처리하는 자료의 형태   (예) 3을 숫자로 처리할지, 문자로 처리할지
  • 자료형, 자료 유형, 데이터 타입 등으로 부름
  • 자바스크립트 자료형은 크게 ‘원시형’과 ‘복합형’로 나눔
    • 원시형(primitive type) : 하나의 값만 가지고 있는 자료형
    • 복합형 : 원시형 외의 모든 자료형
자료형 설명
기본형 number(숫자) 따옴표 없이 표기한 숫자로 나타냄
string(문자열) 작은따옴표(')나 큰따옴표(")로 묶어 나타냄
boolean(논리형) 참(true)과 거짓(false)이란 두 가지 값만을 가진 유형
undefined - 자료형을 지정하지 않았을 때의 유형
- 변수를 선언하고 값을 정의하지 않은 경우
null - 값이 유효하지 않았을 때의 유형
복합형 array(배열) - 하나의 변수에 여러 값을 저장하는 유형
object(객체) - 함수와 속성이 함께 포함된 유

 

typeof() 함수

  • 자바스크립트 안에 미리 만들어져 있는 함수로, 괄호 안에 값이나 변수를 넣으면 어떤 자료형인지 알려준다. 
typeof(값 또는 변수)

 

 


숫자형 (number)

  • C나 자바 같은 프로그래밍 언어에서는 정수와 실수를 명확히 구별하고 정수도 크기에 따라 다른 자료형을 사용함
  • 하지만 자바스크립트에서는 정수와 실수를 함께 묶어서 숫자형이라고 함
  • 최근에 BigInt라는 자료형이 추가됨 : 기존의 자바스크립트 숫자형의 한계를 넘는 큰 정수를 다루기 위한 자료형

 


문자열(string)

  • 작은따옴표(')나 큰따옴표(")로 묶은 데이터
  • 큰따옴표이든, 작은따옴표이든 문자열의 앞뒤에 붙이는 따옴표는 같아야 함
  • 최근에는 작은 따옴표(‘ ‘)를 많이 사용하는 추세

 

특수 기호 표시하기

  • 특수 기호를 표시하려면 백슬래시(\) 다음에 기호 사용
    (예) 문자열이 아니라 순수하게 따옴표를 표시하고 싶다면 \” 처럼 써야 함
\ddd (여기서 d는 숫자) 8진수 문자
\xddd 16진수 문자
\\ 백슬래시 문자
\' 작은따옴표 문자
\" 큰따옴표 문자
\b 백스페이스 문자
\f 폼 피드 문자
\n 줄 바꿈 문자
\r 캐리지 리턴 문자
\t 탭 문자

 

문자열에 접근하기

원시 유형에서 메서드 사용하기

  • 자료형 중 단순히 값만 가지고 있을 때 → 원시 유형(primitive type)
  • 원시 유형에서도 프로퍼티와 메서드를 사용할 수 있다.
str = “hello”
str.length

 

str은 문자열(string)인데, length 프로퍼티는 어디에서 온 것일까?
- 숫자형과 논리형, 문자열 유형은 별도로 객체가 만들어져 있다.
- Number(원시유형 : number), Boolean(원시유형 : boolean), String(원시유형 : string) 객체 (래퍼 객체)

오토박싱(autoboxing)
- 필요할 때에만 임시로 객체로 바꿔 사용하고 사용이 끝나면 다시 원시 유형으로 되돌아오는 것
- number 등 원시 유형에서 프로퍼티, 메서드를 사용 시 일시적으로 원시 유형을 해당 객체로 변환
- 프로퍼티나 메서드의 사용이 끝나면 해당 객체는 메모리에서 사라짐

 

문자열 관련 메서드

메서드 이름 기능
length - 형태 : 문자열.length
- 문자열 길이 반환
charAt() - 형태 : 문자열.length(위치)
- 위치를 매개변수로 넣어, 해당 위치의 문자 반환
indexOf() - 형태 : 문자열.indexOf(문자열)
- 부분 문자열의 위치 찾을 때 사용
- 괄호 안의 문자열이 나타난 위치 반환
- 찾는 문자열이 없으면 -1 반환
startsWith() - 형태 : 문자열. startsWith(문자 또는 문자열)
- 문자열이 특정 문자나 문자열로 시작하는지 확인
- 문자나 문자열에서 영문자의 대소문자를 구별하므로 주의
endsWith() - 형태 : 문자열. endsWith(문자 또는 문자열) or 문자열.endsWith(문자 또는 문자열, 길이)
- 문자열과 함께 길이를 지정하여 사용할 수 있음
- 문자열이 특정 문자나 문자열로 끝나는지 확인
- 문자나 문자열에서 영문자의 대소문자를 구별하므로 주의
includes() - 형태 : 문자열.includes(문자 또는 문자열)
- 문자열에 특정 문자나 문자열이 있는지 확인
- 대소문자 구별하므로 주의
trim() - 형태 : 문자열.trim()
- 문자열의 앞뒤 공백 제거
trimStart() - 형태 : 문자열.trimStart()
- 문자열의 앞쪽 공백 제거
trimEnd() - 형태 : 문자열.trimEnd()
- 문자열의 뒤쪽 *공백 제거
toUpperCase() - 형태 : 문자열.toUpperCase()
- 영문자 문자열의 경우, 문자열을 모두 대문자로 변환
toLowerCase() - 형태 : 문자열.toLowerCase()
- 영문자 문자열의 경우, 모두 소문자로 변환
substring() - 형태 : 문자열.substring(시작 위치) or 문자열.substring(시작 위치, 끝 위치)
- 시작 위치부터 끝 위치의 직전까지 추출해서 반환
- 끝 위치를 지정하지 않으면 시작 위치부터 문자열 끝까지 추출해서 반환함
slice() - 형태 : 문자열.slice(시작 위치) or 문자열.slice(시작 위치, 끝 위치)
- 시작 위치부터 끝 위치의 직전까지 추출해서 반환
- 끝 위치를 지정하지 않으면 시작 위치부터 문자열 끝까지 추출해서 반환함
- slice() 메서드는 음수를 사용해 위치를 지정할 수 있음
- 음수로 지정시 문자열의 끝에서부터 위치를 찾기에, 문자열을 뒤에서부터 자를 때 편리
split() - 형태 : 문자열.split(구분자)
- 문자열에서 구분자를 기준으로 문자열을 나누고 배열을 반환
- ""으로 나누면 문자 하나하나 분리 가능

 

*공백 : [Spacebar]를 눌러 입력한 공백, [Tab]을 눌러 입력한 탭, 줄을 바꾸기 위해 사용한 이스케이프 문자(\n, \r) 등을 말함

 

 

템플릿 리터럴

  • 문자열과 변수, 식을 섞어서 하나의 문자열을 만드는 표현 형식
  • ES6 이전에는 +를 사용해서 식이나 변수와 연결했음 → 변수나 식이 많아질수록 오타가 나올 확률이 높음
  • 백팃(`  `)기호 사용 (백팃을 눌렀는데 ₩로 표시된다면 영문 상태로 바꾸고 백팃 입력)
  • 변수나 식이 들어간다면 ${ }로 묶고, 태그나 띄어쓰기, 이스케이프 문자를 그대로 표시할 수 있기 때문에 사용이 편리
name = "백두산"
classroom = 205
console.log(`${name}님, ${classroom}호 강의실로 입장하세요.`)

 


논리형

  • 참(true)이나 거짓(false) 값을 표현하기 위한 데이터 유형
  • 불린boolean 유형이라고도 함 
  • 사용할 수 있는 값은 true와 false
  • 논리형 값은 지정한 조건을 체크하는 조건식에서 많이 사용함

 

truthy와 falsy

  • true와 false 라는 명확한 값 외에 참과 거짓을 판별하는 방법
    • truthy: true로 인정할 수 있는 값
    • falsy: false로 인정할 수 있는 값 
    • falsy 값을 제외한 모든 값은 truthy함. 즉 true로 침!
  • NaN
    • 숫자가 아님(Not a Number)을 나타냄
    • 변수를 선언만 하고 값이 할당되지 않은 상태에서 그 변수를 더하거나 빼는 연산에 사용하면 NaN이 됨
/* falsy */
0    // 숫자 0
""   // 빈 문자열   
NaN
undefined
null

 

undefined과 null

undefined null
선언만 하고 할당하지 않음 null 값을 할당함(유효하지 않은 값)
주로 사용자의 실수에 의해 발생 주로 사용자가 의도적으로 null 을 할당
값이면서 동시에 자료형

 


배열

• 하나의 변수에 여러 값을 할당할 수 있는 형태
• 대괄호([ ])로 묶고, 그 안에 값을 나열함. 각 값은 쉼표(,)로 구분
• 대괄호 안에 아무 값도 없으면 ‘빈 배열’이라고 하고, 이것 역시 배열

인덱스를 통해 배열에 저장된 값에 접근할 수 있으며 인덱스는 0부터 시작해서 0,1,2,3... 으로 셈
배열명 = [값1, 값2, ...]

emptyArr = []                      // 빈 배열
colors = ["red", "blue", "green"]  // 문자열 배열
arr = [10, "banana", true]         // 여러 자료형으로 구성된 배열
메서드 이름 기능
length - 형태 : 문자열.length
- 문자열 길이 반환
from() - 형태 : Array.from(문자열)
- 순회 가능 객체(Map, Set과 같은 객체) 또는 유사 배열 객체(length 속성과 인덱싱된 요소가 있는 객체)의 경우 Array.from()을 사용하면 배열(Array)를 만들 수 있음
join() - 형태 : 배열.join(구분자)
- 구분자로 공백없이 “”를 사용하면 배열 요소를 연결해서 문자열을 만듦
forEach() - 형태 : 배열.forEach(값) or 배열.forEach(값, 인덱스) or 배열.forEach(값, 인덱스, 배열)
- 배열을 순회함
- for문은 중간에 break문을 사용해 멈출 수 있지만, forEach는 끝까지 다 순회해야 끝
concat() - 형태 : 배열.concat(배열 또는 값, 배열 또는 값, ...)
- 기존 배열에 또 다른 배열 혹은 값을 합쳐 새로운 배열을 만듦

- 해당 메서드를 쓰는 방법 외에, '전개 연산자(...)'를 쓰는 방법도 있음
let vegitable = ["양상추", "토마토", "피클"]
let cheese = ["모짜렐라", "슈레드"]
let cheeseBurger = ["빵", ...vegitable, ...cheese]
cheeseBurger // ["빵", "양상추", "토마토", "피클", "모짜렐라", "슈레드"]
reverse() - 형태 : 배열.reverse()
- 배열 요소의 순서를 거꾸로 바꾸는 메서드 (값의 크기와는 무관)
sort() - 형태 : 배열.sort(정렬 함수)
- 정렬 함수가 존재하는 경우, 배열 요소는 정렬 함수의 반환 값에 따라 정렬됨
- 정렬함수(a,b)의 반환값이 0보다 작은 경우 : a를 b보다 작은 인덱스로 정렬함
- 정렬함수(a,b)의 반환값이 0인 경우 : 정렬 없음 (변경하지 않음)
- 정렬함수(a,b)의 반환값이 0보다 큰 경우 : a를 b보다 큰 인덱스로 정렬함
push() - 형태 : 배열.push(값)
- 배열의 맨 끝에 값 추가
pop() - 형태 : 배열.pop()
- 배열의 맨 끝에 있는 값 제거
unshift() - 형태 : 배열.unshift(값)
- 배열의 맨 앞에 값 추가

* unshift() 메서드는 배열에서 맨 앞의 요소를 변경하기 때문에 인덱스 변경으로 인하여 배열의 요소가 많거나 요소의 내용이 복잡할수록 메서드의 실행 시간이 좀 더 길어짐
shift() - 형태 : 배열.shift()
- 배열의 맨 앞에 있는 값 제거

* shift() 메서드는 배열에서 맨 앞의 요소를 변경하기 때문에 인덱스 변경으로 인하 배열의 요소가 많거나 요소의 내용이 복잡할수록 메서드의 실행 시간이 좀 더 길어짐
splice() 1. 형태 : 배열.splice(위치)
- '위치'부터 끝까지 요소를 삭제

2. 형태 : 배열.splice(위치, 숫자)
- '위치'에서 '숫자' 개수만큼 요소 삭제

3. 형태 : 배열.splice(위치, 숫자, 값)
- '위치'에서 '숫자' 개수만큼 요소를 삭제한 후 '값' 추가
slice() 1. 형태 : 배열.slice(위치)
- '위치'부터 끝까지 요소를 추출

2. 형태 : 배열.slice(위치 1, 위치 2)
- 위치 1부터 위치 2 직전까지 추출
map() - 형태 : 배열.map(함수(값))
- 각 배열 요소에 똑같은 함수를 실행한 후 그 결과를 새로운 배열로 반환
filter() - 형태 : 배열.filter(함수(값)) or 배열.filter(함수(값, 인덱스)) or 배열.filter(함수(값, 인덱스, 배열))
- 특정 조건에 맞는 요소만 골라내는 메서드
reduce() - 형태 : 배열.reduce(함수(누산기, 현잿값, 인덱스, 원래 배열), 초깃값)
- 배열 요소에 차례로 함수를 실행하면서 결괏값을 하나로 누적함
- 초깃값 생략 가능하며, 생략 시 배열의 첫 번째 값을 초깃값으로 사용

 


심볼

  • ES6에 새롭게 추가된 원시 유형의 자료형
  • 심볼의 가장 큰 특징은 유일성을 보장한다는 것
  • 심볼은 객체 프로퍼티의 키로 사용할 수 있음
  • 심볼을 만들 때는 Symbol() 함수 사용
  • 심볼은 한 번 만들면 변경할 수도 없고, 같은 값을 가진 심볼을 만들 수도 없음
let var1 = Symbol()
let var2 = Symbol()
// var1과 var2는 똑같아 보이지만, 심볼은 유일한 값이기 때문에 두 변수는 같지 않다

var1 === var2       // false

 

  • 심볼을 키로 사용할 때에는 [키]처럼 대괄호로 묶어서 표현
  • 키에 접근할 때도 마침표가 아닌 대괄호 사용
let id = Symbol();

const member ={
    name : "오거폰",
    cute : 550,
    [id] : 1234
};

member;		// {name : "오거폰", cute : 550, Symbol(): 1234}
member[id];	// 1234

member.id = 5678;
member;		// {name : "오거폰", cute : 550, id: 5678, Symbol(): 1234}

id = Symbol();
member[id] = 5678;
member;		// {name : "오거폰", cute : 550, id: 5678, Symbol(): 1234, Symbol(): 5678}

 

심볼 관련 메서드

메서드 기능
Symbol.for(키) - 키를 인수로 받고 전역 심벌 레지스트리를 뒤져 키에 해당하는 심벌을 찾음
- 레지스트리에서 키에 맞는 심벌이 있으면 해당 심벌을 반환
- 레지스트리에서 키에 맞는 심벌이 없으면 새로운 심벌을 만들어 반환함(같은 키 => 같은 심벌!)
Symbol.keyFor(심벌값) - 심벌값을 인수로 받아서 전역 심벌 레지스트리를 뒤져서 심벌값의 키를 찾음

3. 형변환

  • 자바스크립트는 다른 언어와 다르게 프로그램 실행 중에 자료형이 변환되는 언어
  • 자동으로 형이 변환될 때에도 있음
    → 이런 상황을 미리 알아 두지 않으면 오류를 발생시키기도 하고, 처음에 예상했던 것과 다른 결과가 나올 수도 있음
C 언어나 자바 등 일반 프로그래밍 언어 자바스크립트
- 변수를 선언할 때 변수의 자료형을 결정
- 자료형에 맞는 값만 변수에 저장 가능
- 자료형으로 인한 프로그램의 오류 방지 가능
- 변수를 선언할 때 자료형 지정하지 않음
- 변수에 값을 저장할 때 자료형 결정
- 편리하긴 하지만 변수를 일관성 있게 유지하기 힘들다

 


암시적 형 변환

  • 변수에 값을 저장할 때 자료형이 결정되기도 하지만 연산을 할 때 자료형이 자동으로 변환됨 (주의!)
    • 문자열을 사칙 연산에 사용하면 자동으로 숫자형으로 변환됨
    • 숫자와 문자열을 연결하면 숫자가 문자열로 변환됨

 

+ 연산자

  • + 기호 앞이나 뒤에 문자열이 있으면 연결 연산자
  • + 기호 앞뒤에 숫자가 있으면 더하기 연산자
one = "20"   // 문자열 
two = 10     // 숫자형

 

-, *, / 연산자

기호 앞이나 뒤에 문자열이 있으면 숫자로 인식함

one + two   // "2010”
one - two   // 10

 


명시적 형변환

Number(), parseInt(), parseFloat()

  • 숫자형으로 변환
    • partseInt() 함수: 괄호 안의 값을 정수로 변환
    • parseFloat() 함수 : 괄호 안의 값을 실수로 변환
  • 문자열뿐만 아니라 null과 undefind를 포함해서 모든 자료형을 숫자로 변환할 수 있음

Number() 함수의 변환 규칙

기존 유형 변환 결과
true 1
false 0
숫자 숫자
null 0
undefined NaN
정수 문자열 정수(맨 앞에 0이 있으면 제거)
실수 문자열 실수(맨 앞에 0이 있으면 제거
16진수 문자열 10진수
빈 문자열 0
위 상황 외 NaN

 

toString(), String()

toString()

  • null 데이터형과 undefined 데이터형을 제외한 데이터형을 문자열 데이터로 변환
  • 원랫값 뒤에 마침표를 붙이고 함수를 작성
  • 숫자를 문자열로 변환할 때는 basis 옵션을 사용해 숫자가 10진수인지, 2진수인지 같이 지정

String()

  • null 데이터형과 undefined 데이터형을 포함해서 문자열 데이터로 변환
  • String() 함수의 괄호 안에 값을 넣어서 변환
  • null이면 ‘null’로, undefined이면 ‘undefined’로 변환
  • 그 외에는 toString() 함수와 같음

 

Boolean()

  • 다른 유형의 데이터를 논리형 데이터로 변환
  • 함수의 괄호 안에 원랫값을 넣음

논리형으로 변환할 때의 규칙

  true 값이 되는 데이터 false 값이 되는 데이터
숫자형 0이 아닌 값 0
문자열 빈 문자열이 아닌 모든 문자열 빈 문자열
undefined - undefined

 


자료형 비교

==(!=)와 ===(!==)의 차이

  • ==(!=) : 암시적 형 변환이 일어나 값만 비교하게 됨
  • ===(!==) : 암시적 형 변환이 일어나지 않아 자료형까지 비교하게 됨

댓글