특징
- 자바스크립트는 객체 기반의 스크립트 언어다.
- 자바스크립트는 동적이며, 타입을 명시할 필요가 없는 인터프리터언어다.
- 자바스크립트는 Node.js와 같은 프레임워크를 사용하면 서버 측 프로그래밍에서도 사용할 수 있다.
인터프리터 언어
- 컴파일 작업을 거치지 않고, 소스 코드를 바로 실행할 수 있는 언어
데이터 타입 | 설명 |
---|---|
숫자타입(Number) | 정수와 실수 구분 없는 숫자 타입 |
문자열타입(String) | 문자열, 텍스트 데이터 |
불리언타입(Boolean) | 참(true), 거짓(false) |
undefined 타입 | 값을 할당하지 않은 변수에 할당되는 값 |
null 타입 | 어떤 값이 의도적으로 비어있음을 표현 |
심볼 타입 | 유일하며 변경할수 없는 값, 객체의 키로 유일한 식별자를 만들고 싶을 때 사용 |
논리적인 값을 나타내는 타입
데이터(data)를 저장할 수 있는 메모리 공간
자바스크립트 엔진이 개발자의 의도와 상관없이 코드 문맥을 파악하여 강제적으로 타입 변환을 실행하는 것
+
연산자는 피연산자 중 하나 이상의 문자가 포함되면 문자열로 타입을 변환한다.var a = 1 + '2'
console.log(a) // '12'
console.log(typeof a) // string
var b = 0 + ''
console.log(b) // '0'
console.log(typeof b) // string
var c = true + ''
console.log(c) // 'true'
console.log(typeof c) // string
var d = null + ''
console.log(d) // 'null'
console.log(typeof d) // string
var e = ({}) + ''
console.log(e) // [object Object]
console.log(typeof e) // string
+
가 아닌 산술 연산자의 경우 숫자타입이 아닌 피연산자를 암묵적으로 숫자로 변환한다.console.log(6 - '3') // 3
console.log(6 * '3') // 18
console.log(6 / '3') // 2
console.log(6 / '삼') // NaN
console.log('5' > 3) // true
console.log('5' < '3') // false
console.log(3 <= '5') // true
+
단항 연산자는 숫자타입이 아닌 피연산자를 암묵적으로 숫자로 변환한다.console.log(+'5') // 5
console.log(+'') // 0
console.log(+'오') // NaN
console.log(+true) // 1
console.log(+false) // 0
console.log(+null) // 0
console.log(+undefined) // NaN
console.log(+(Symbol())) // TypeError: Cannot convert a Symbol value to a number
console.log(+{}) // NaN
console.log(+[]) // 0
자바스크립트 엔진은 제어문의 조건을 불리언 타입으로 암묵적으로 타입변환한다.
False로 평가되는 값 = (false, undefined, null, 0, '', NaN)
var a = false
var b = undefined
var c = null
var d = 0
var e = ''
var f = NaN
if(a) console.log('표시안됨')
if(b) console.log('표시안됨')
if(c) console.log('표시안됨')
if(d) console.log('표시안됨')
if(e) console.log('표시안됨')
if(f) console.log('표시안됨')
자바스크립트 내장 객체를 이용해 명시적으로 타입을 변경하는 것을 말한다.
Object.prototype.toString
메서드를 사용한다.//내장 함수 사용
console.log(String(5)) // "5"
console.log(String(NaN)) // "NaN"
console.log(String(true)) // "true"
console.log(String(false)) // "false"
//Object.prototype.toString 메서드를 사용
console.log((5).toString()); // "5"
console.log((NaN).toString()); // "NaN"
console.log((true).toString()) // "true"
console.log((false).toString()) // "false"
Number
또는 parseInt
, parsFloat
를 사용한다.console.log(Number('0')) // 0
console.log(Number('1.5')) // 1.5
console.log(Number(true)) // 1
console.log(Number(false)) // 0
//parseInt, parsFloat (문자열만 변환가능)
console.log(parseInt('0')) // 0
console.log(parseInt('1.5')) // 1
console.log(parseFloat('1.5')) // 1.5
Boolean
함수로 변환console.log(Boolean('a')) // true
console.log(Boolean('')) // false
console.log(Boolean('false')) // true
console.log(Boolean(0)) // false
console.log(Boolean(1)) // true
console.log(Boolean(NaN)) // false
console.log(Boolean(Infinity)) // true
console.log(Boolean(null)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean({})) // true
console.log(Boolean([])) // true
아직 미완성이다.
- 6번 기능 추가 안됨
- 4중 반복문을 사용중이라 개선이 필요해 보인다.
// 파이썬의 input() 함수 역할을 하는 사용자 입력을 받는 Node.js 기능
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log('행, 열 <- 왼쪽과 같은 양식으로 좌표값을 입력해주세요.')
console.log('ex) 1,1 or 1, 1 or 7, 3 or 7,3 등')
let arr = new Array(30);
for (let i = 0; i < arr.length; i++) {
arr[i] = new Array(30).fill('');
}
let turn = 0;
// 입력 받고 최신화 된 보드 출력해주는 메서드
function printBoard() {
for(let i = 0; i < 30; i++) {
console.log(arr[i].map(cell => cell === '' ? '*' : cell === '흑' ? 1 : 0).join(' '));
}
}
/*
이긴사람 있는지 확인하는 메서드
가로, 세로, 대각석 탐색
cf. 4중 반복문 오반데... 나중에 수정...
*/
function checkWin() {
const directions = [[0, 1], [1, 0], [1, 1], [-1, 1]];
for(let i = 0; i < 30; i++) {
for(let j = 0; j < 30; j++) {
if(arr[i][j] !== '') {
for(let direction of directions) {
if(checkLine(i, j, direction)) {
return true;
}
}
}
}
}
return false;
}
// 한 방향(라인)에 대해 오목이 완성되었는지 확인하는 메서드
function checkLine(x, y, direction) {
let i = x, j = y, count = 0;
while(i >= 0 && i < 30 && j >= 0 && j < 30 && arr[i][j] === arr[x][y]) {
count++;
i += direction[0];
j += direction[1];
}
return count === 5;
}
/*
입력값 받아서 보드에 넣는 실질적인 게임 메서드
+ 예외처리
*/
function play() {
let player = turn % 2 == 0 ? '백' : '흑'; // w for white, b for black
rl.question(`${player === '흑' ? '흑' : '백'}색 돌을 놓을 좌표를 입력하세요 :`, (inputValue) => {
let coords = inputValue.split(',');
let x = parseInt(coords[0]);
let y = parseInt(coords[1]);
// 입력값 범위 초과에 대한 예외처리
if(x < 0 || x >= 30 || y < 0 || y >= 30) {
console.log("0이상 30미만 값을 입력해주세요.");
play();
return;
}
// 이미 둔 자리 or 잘못된 입력양식에 대한 예외처리
if(arr[x][y] !== '') {
if(arr[x][y] === '흑' || arr[x][y] === '백') {
console.log("이미 돌을 놓은 자리입니다.");
}else {
console.log("올바른 좌표값을 입력하세요.");
console.log("예시: 1,3 or 1, 3 or 10, 15 등등");
console.log("잘못된 예시: [1,3] or 1, 2 or 1.2");
}
play();
return;
}
arr[x][y] = player;
printBoard();
if(checkWin()) {
console.log('Game over')
console.log(`${player === '흑' ? '흑' : '백'}색돌이 승리하였습니다!! `);
rl.close();
} else {
turn++;
play();
}
});
}
play();
본 후기는 정보통신산업진흥원(NIPA)에서 주관하는 <AI 서비스 완성! AI+웹개발 취업캠프 - 프론트엔드&백엔드> 과정 학습/프로젝트/과제 기록으로 작성 되었습니다.
#정보통신산업진흥원 #NIPA #AI교육 #프로젝트 #유데미 #IT개발캠프 #개발자부트캠프 #프론트엔드 #백엔드 #AI웹개발취업캠프 #취업캠프 #개발취업캠프
많은 도움이 되었습니다, 감사합니다.