ES6는 7개의 데이터 타입을 제공하며, 각 타입은 원시 타입 primitive type과 객체 타입 object/reference type으로 분류
구분
데이터 타입
설명
원시 타입
숫자 number
숫자, 정수와 실수 구분 없이 하나의 숫자 타입만 존재
문자열 string
문자열
불리언 boolean
논리적 참(true)과 거짓(false)
undefined
var 키워드로 선언된 변수에 암묵적으로 할당되는 값
null
값이 없다는 것을 의도적으로 명시할 때 사용되는 값
심벌 symbol
다른 값과 중복되지 않는 유일무이한 값. ES6에서 추가
객체 타입
객체, 함수 배열 등
숫자 number 타입
자바스크립트는 하나의 숫자 타입만 존재 / 자바나 c는 int, long, float, double 등 정수와 실수로 타입을 구분함
ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식
즉, 모든 수를 실수로 처리하며, 정수만 표현하기 위한 데이터 타입 interger type이 별도로 존재 x
숫자 타입은 추가적으로 세 가지 특별한 값도 표현할 수 있음
Infinity: 양의 무한대
-Infinity: 음의 무한대
NaN: 산술 연산 불가 not-a-number
// 숫자 타입은 모두 실수 처리
console.log(1 === 1.0); // true
// 숫자 타입의 세 가지 특별한 값
console.log(10 / 0); // Infinity
console.log(-10 / 0); // -Infinity
console.log(1 * 'String') // NaN
문자열 string 타입
텍스트 데이터를 나타내는데 사용
0개 이상의 16비트 유니코드 문자( UTF-16)의 집함으로 전세계의 대부분 문자 표현 가능
작은따옴표(' '), 큰따옴표(" "), 백틱(` `) 사용, 일반적으로는 작은따옴표 사용
자바스크립트의 문자열은 원시 타입이며, 변경 불가능한 값 immutable value
템플릿 리터럴 template literal
ES6부터 도입
멀티라인 문자열 multi-line string, 표현식 삽입 expression interpolation, 태그드 템플릿 tagged template 등 편리한 문자열 처리 기능 제공
템플릿 리터럴은 일반적인 따옴표가 아닌 백틱(` `)사용
멀티라인 문자열
일반적인 문자열 내에서는 줄바꿈이 허용되지 않음
일반적인 문자열 내에서 줄바꿈을 표현하기 위해서는 백슬레쉬(\)로 시작하는 이스케이프 시퀀스 escape sequence를 사용해야 함
템플릿 리터럴 내에서는 이스케이프 시퀀스 사용하지 않고 줄바꿈이 허용되며, 모든 공백도 그대로 적용됨
// template1과 template2의 출력 결과는 같다
var template1 = '<ul>\n\t<li><a href="##>Home</a></li>\n</ul>';
var template2 = `<ul>
<li><a href="##>Home</a></li>
</ul>
`
표현식 삽입
var first = "Hongyeop";
var last = "Jin";
// ES6 표현식 삽입
console.log(`My name is ${first} ${last}.`)
불리언 타입
논리적 참, 거짓을 나타내는 true와 false만 존재
프로그램의 흐름을 제어하는 조건문에서 많이 사용됨
undefined 타입
var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화
개발자가 의도적으로 할당을 위한 값이 아닌, 자바스크립트 엔진이 변수를 초기화할 때 사용되는 값
의도적으로 갓이 없다는 것을 명시하기 위해서는 null 사용
null 타입
변수에 값이 없다는 것을 의도적으로 명시(의도적 부재 intentional absence)할 때 사용
함수에서 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 함
var elemnet = document.querySelector('.myClass');
console.log(element); // null
심벌 타입
ES6에서 추가된 7번째 타입
변경 불가능한 원시 타입의 값
심벌 값은 다른 값과 중복되지 않은 유일무이한 값
주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해서 사용
// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol
// 객체 생성
var obj = {};
// 이름이 충돌할 위험이 없는 유일무이한 값이 심벌을 프로퍼티 키로 사용
obj[key] = 'value';
console.log(obj[key]); // value
객체 타입
자바스크립트는 객체 기반의 언어
자바스크립트를 이루고 있는 거의 모든 것이 객체
데이터 타입의 필요성
값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
동적 타이핑
정적 타입 언어 static/strong type
C, C++, java, kotlin, go, haskell, rust, scala
변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 함, 이를 명시적 타입 선언 explicit type declaration이라고 함
변수의 타입을 변경할 수 없으며, 변수 선언한 타입에 맞는 값만 할당 가능
컴파일 시점에 타입 체크 수행, 타입 체크를 통과 실패 시 에러 발생
타입의 일관성을 강제하여 안정적인 코드의 구현을 통해, 런타임에서 발생하는 에러를 줄임
동적 타입 언어dynamic/weak type인 javascript
변수를 선언할 때 타입 선언 x, 키워드(var, let, const)를 사용해 변수 선언
어떤 데이터 값이라도 자유롭게 선언 가능
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론 type inference) 됨
재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있음. 이를 동적 타이핑 (dynamic typing)이라고 함
20, 30 ,+ 라는 기호(리터럴 literal과 연산자 operator)의 의미를 알고 있어야 함
10 + 20이라는 식(표현식 expression)의 의미도 해석(파싱 pharsing)할 수 있어야 함
자바스크립트가 해당 식의 의미를 해석하면
+ 연산을 수행하기 위해 + 연산자의 좌변과 우변의 숫자 값(피연산자 operand)를 기억
cpu를 사용해 연산하고 메모리를 사용해 데이터를 기억
메모리
데이터를 저장할 수 있는 메모리 셀의 집합체
메모리 셀 하나의 크기는 1바이트(8비트)
컴퓨터는 메모리 셀의 크기, 즉 1바이트 단위로 데이터를 저장 write하거나 읽어 read 들인다
각 메모리셀은 고유의 메모리 주소 memory address를 갖고, 이는 메모리 공간의 위치를 나타냄
메모리 주소는 0부터 시작해서 메모리의 크기만큼 정수로 표현된다. 아래 그림은 4GB 메모리의 예시
컴퓨터는 모든 데이터를 2진수로 처리. 예제의 숫자 10과 20은 메모리 상의 임의의 위치(메모리주소)에 저장되고 cpu는 이 값을 읽어서 연산을 수행. 그림에는 10과 20으로 표기했지만 실제로는 2진수로 저장
변수 variable
연산 결과는 메모리에 저장되지만 해당 값을 재사용하기 위해서는 cpu에게 해당 메모리 주소를 가르쳐 (식별)시켜줘야 함
변수 variable는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
값의 위치를 가리키는 상징적인 이름
자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않음
메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름을 변수 이름이라 하고, 저장된 값을 변수 값이라고 함
변수 이름을 식별자 identifier라고도 함. 식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말함
식별자는 값이 아니라 메모리 주소를 기억. 식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺으며 이를 저장함
변수에 값을 저장하는 것을 할당 assignment (대입 ,저장)이라고 하고, 읽어들이는 것을 참조 reference라고 함
var result = 10 + 20;
변수 선언 variable delcaration
변수를 생성하는 것을 뜻함
값을 저장하기 위한 메모리 공간을 확보 allocate하고 변수 이름과 확보된 메모리 공간의 주소를 연결 name binding 해서 값을 저장할 수 있게 준비
확보된 메모리 공간은 해제 release 되기 전까지는 누구도 사용할 수 없도록 보호됨
변수를 사용하기 위해서는 반드시 선언이 필요
변수를 선언하기 위한 키워드
var
let, const: ES6 때 var 키워드의 단점을 보안하기 위해 도입
자바스크립트 엔진은 변수 선언을 다음과 같은 2단계에 거쳐 수행
선언 단계: 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알림
초기화 단계: 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화
변수를 사용하려면 반드시 선언이 필요. 선언하지 않은 식별자에 접근할 경우 ReferenceError 발생
var score;
변수 선언의 실행 시점과 변수 호이스팅
변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임runtime이 아니라 그 이전 단계에서 먼저 실행됨
자바스크립트 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서 먼저 소스코드의 평가과정을 거치게 되는데, 해당 과정에서 변수 선언을 포함한 모든 선언문 (변수, 함수 등)을 소스 코드에서 찾아서 먼저 실행
변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅 variable hoisting이라고 함
var, let, const, function, function*, class
console.log(score); // undefined
var score;
값의 할당
값의 할당에는 할당 연산자 = 를 사용
할당 연산자는 우변의 값을 좌변에 할당
변수 선언과 값의 할당을 하나의 문 statement로 단축 표현도 가능
실행 시점이 다름
변수 선언: 런타임 이전에 먼저 실행
값의 할당: 소스코드가 순차적으로 실행되는 런타임 시점에 실행
var score; // 변수 선언
score = 80; // 변수 할당
var score = 80; // 변수 선언과 값의 할당
console.log(score); // undefined
score = 80; // 값의 할당
var score; // 변수 선언
console.log(score); // 80
변수 선언이 런타임 이전에 실행되기 때문에 위와 같은 코드가 정상 실행 가능함
값의 재할당
재할당이란 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것을 뜻함
상수 constant: 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없음 (단 한 번만 할당)
재할당할 경우 기존의 값은 어떤 식별자와도 연결되어 있지 않음. 이런 값들은 가비지 콜렉터에 의해서 메모리에서 자동 해체됨. 언제 될지는 예측할 수 없음.
자바스크립트는 매니지드 언어 managed language 이며, 메모리의 할당 및 해체를 위한 메모리 관리 기능을 언어 차원에서 담당하고 개발자의 직접적인 메모리 제어를 허용하지 않음
var score = 80; // 변수 선언과 값의 할당
score = 90; // 값의 재할당
식별자 네이밍 규칙
식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러기호 ($)를 포함 가능
ES5부터 식별자를 만들 때 유니코드를 허용해서 한글도 사용이 가능하나 권장하지 않음
자바스크립트는 대소문자를 구분함
식별자의 첫 글자는 숫자로 시작할 수 없음
예약어는 식별자로 사용 불가능
변수 이름은 변수의 존재 목적을 쉽게 이해할 수 있도록 의미를 명확히 표현해야 함
네이밍 컨벤션
카멜 케이스 (camelCase): 자바스크립트에서 일반적으로 변수나 함수의 이름에 사용
파스칼 케이스 (PascalCase): 자바스크립트에서 일반적으로 생성자 함수, 클래스의 이름에 사용
헝가리언 케이스 (typeHungarianCase): type + indentifier
스네이크 케이스 (snake_case): 주로 파이썬에서 쓰는 듯
// 카멜 케이스
var firstName;
// 파스칼 케이스
var FirstName;
// 헝가리안 케이스
var strFirstName;
var $elme = document.getElementById('myId'); // Dom 노드
var observable$ = fromEvent(document, 'click'); // RxJS 옵저버블
// 스네이크 케이스
var first_name
# model.py
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(max_length=300)
cost = models.IntegerField()
app 폴더 내에서 serializer.py 생성 serializer는 django model 데이터를 json으로 바꿔준다 (직렬화)
# serializer.py
from rest_framework import serializers
from .models import Item
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ("__all__")
app 폴더 내에서 viewset 생성
# views.py
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import ItemSerializer
from .models import Item
reate your views here.
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
router 등록; app 폴더 내에서 urls.py 생성
# urls.py
from django.urls import include, path
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register('item', views.ItemViewSet)
urlpatterns = [
path('', include(router.urls))
]
router 등록; 프로젝트 폴더 내에서 urls.py 설정
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
]