728x90
728x90
페이지의 로딩완료 후 작동하거나 보여지기를 원할 때

 

 

브라우저가 HTML 파일을 읽어오는 순서, 그리고 ready와 load 메소드의 실행 지점


사용자에 의해 웹브라우저 시작 -> 브라우저의 웹문서 읽기 -> DOM 생성 -> $(document).ready 메소드 실행 -> 각 요소들이 로드되기 시작 -> 모든 요소의 로드가 완료되면 $(window).load 메소드 실행 됩니다. (참고출처)

 

게시글의 댓글에 괜찮은 내용이 있어 옮겨왔습니다.

쉽게 ready(준비)가 load보다 빠르다라고 생각하면 이해가 빠를 것입니다. window 객체와 document 객체는 서로 의존적이지는 않으나 window의 크기나 URL 주소 등이 문서에 따라 새로이 정의되는 부분이 있어 document 객체에 따라 window 객체도 새로 정의된다는 생각이 있는 것입니다.

window는 document보다 상위 개념이라고 하는 것은 브라우저 객체모델에서 정의한 것일 뿐, 그 상위 개념이 순서에 따라 먼저 존재한다거나 나중에 존재해야 한다는 것은 각 웹브라우저의 기술적 방법의 정의일 뿐입니다. 기술적인 방법에는 차이가 있을지라도 더욱 빠르고 효과적으로 다가서려보니 비슷비슷한 구현(일부 컨텐츠가 파싱되고 화면에 나타나는 동안 계속해서 남은 컨텐츠를 네트워크로부터 받아온다거나...)이 나올 수밖에 없고, 다년간에 축적된 경험을 통해서 형성되고 브라우저끼리 서로 모방하면서 지금과 같이 성립이 된(표준 명세에도 없는..) 것이기에 그러한 순서를 제공한다고 보시면 이해가 되시라 봅니다. (실제 물리적인 구현과 이론적인 순서는 다를 수 있다는 말)

  • 추가 : 브라우저에서 alert(window == document.body) 를 확인해 보세요. 웹브라우저에 따라 기술적으로 구현이 다를 수 있습니다. window객체도 모두 초기화가 될 것이라는 생각도 잘못된 생각입니다. 실제 우리가 확인할 수 없는 부분도 있고, 실제 우리에게 그렇게 작동 되도록 보이는 것도 일부 있습니다.
 alert(window == document.body); //익스플로러의 경우 false




Ready


 

$(document).ready 

= 브라우저에서 DOM이 완성된 시점. DOM트리 생성 직후이므로 window.onload보다 빠름
(HTML의 소스코드만의 로딩이 끝나서 어떻게 표현할 것인지나 내부속성이 완성)

$(document).ready(function(){
	// 태그 등의 셋팅이 완료되었을 시점에 이벤트 발생    
});

 

DOMContentLoad

document.ready와 크게 다를 바 없습니다.
ie8이하에서는 지원하지 않습니다. (>대체 방안)

window.addEventListener('DOMContentLoaded', function()
{
     // 할 것
});
 

 

 

 

load


$(window).load , window.onload

= 외부호출(src) 등의 로딩이 완료된 시점 (외부호출까지 끝난 시점)

동일한 페이지 내에서 onload 함수는 하나만 존재해야 하며, 또한 <body onload=""> 와 같은 설정이 되어 있는 경우에는 attribute의 onload=""만 작동할뿐 window.onload 는 동작하지 않습니다.

 

$(window).load(function(){
	// 실행할 내용
});
window.onload = function(){
	// 할 것
}

 

 

 

> document ready, window load, body onload 순서 테스트

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90
스크롤바 투명으로 만들기 (scrollbar transparent mode). html과 css 함께 사용합니다.

 

 

알아보게 된 배경은 jquery ui의 resizing을 쓰면서 스크롤바 영역 아래 ui-resizable-handle 이 덮여버렸기 때문. ui-resizable-handle 이 덮이는 문제를 해결하기 전까지 스크롤바를 동작만 하고 투명으로 두기로 했습니다. 

 

 

html

 

 <div class="test" style="-ms-overflow-style: none;"></div>

 

CSS

 

::-webkit-scrollbar {
  display: none;
}

 

 

IE 스크롤바 커스터마이징 참고

 

scrollbar-base-color 
스크롤 바 전체 배경

scrollbar-face-color                  
상하좌우로 움직이는 부분(thumb), 
화살표가 포함된 상하좌우 끝 사각형 부분(button)

scrollbar-track-color                 
thumb을 제외한 나머지 부분

scrollbar-arrow-color                 
화살표

scrollbar-highlight-color, crollbar-3dlight-color           
thumb, button의 밝은 부분

scrollbar-darkshadow-color, scrollbar-shadow-color         
thumb, button의 어두운 부분
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90
dom 안의 요소(element)의 개수는 어떻게 구하는지 개수 세는 다양한 방법들을 모아보았습니다. --- jQuery how to count number of elements?

 

 

jQuery

 

.length;


.size() 함수는 3.0 버전부터 사라졌습니다.

 

$("input[name=sampleName]").length);

 

 

 

.each(function(index, Element);


객체만큼 반복해 함수 실행합니다. 마치 for 문처럼 반복하며, 인덱스 초기값은 0이며 콜백함수 실행합니다.

 

$("input[name=sampleName]").length);

 

 

 

 

JS

 

.length


태그의 전체 개수를 세는 방법. getElementsByTagName을 활용합니다.

 

document.getElementsByTagName("*").length;

 

배열 내 element의 개수를 구할 때 arrayName.length;

<form name='my_form'>
  <input type='button' onclick='count_input();' value='개수 세기' />
  <hr>
  <input type='text' name='tag' />
  <input type='text' name='tag' />
  <input type='text' name='tag' />
  <input type='text' name='tag' />
  <input type='text' name='tag' />
</form>

<script>
  function count_input() {
    alert(my_form.tag.length);
  }
  // https://zetawiki.com/wiki/
</script>

 

 

 

Object.keys(obj)


배열 말고 객체의 길이를 구하는 방법입니다. Object의 경우 length를 지정하면 undefined가 나타나기에 Object.keys를 이용해서 구합니다. {key : value}로 이루어진 JSON 형식의 key 개수를 구할 때도 쓰입니다. for 반복문으로도 결과를 도출할 수 있지만 더 효율적으로 key 개수를 구하는 방법입니다.

 

var ex_obj = { 'a' : '1st', 'b' : '2nd', 'c' : '3rd', 'd' : '4th' };
var obj_length = Object.keys(ex_obj).length;

// ex_obj -> 열거형 고유 속성이 반환될 개체
// 리턴값 -> 지정된 개체의 모든 나열형 속성들을 나타내는 문자열 배열

// 참고
// http://egloos.zum.com/beewee/v/947615
// https://ipex.tistory.com/entry

 

 

 

childElementCount


자식 요소의 개수를 세는 방법. childElementCount 프로퍼티를 이용하는 것입니다.
자식의 자식 요소는 포함되지 않습니다. IE 9 이상과 최신 브라우저에서 잘 동작합니다.

 

<div id="Test">
  <span>doby</span>
  <span>is <b>all</b></span>
  <span>free</span>
</div>
var ele = document.getElementById('Test');
var eleCount = ele.childElementCount;

console.log(eleCount); //3

// 출처 : https://webisfree.com/

 

 

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

이번에는 모던 자바스크립트 입문 4장 내용을 요약하였습니다.

 

 

 

 

 

객체 리터럴 


 

객체

 

  • 원시 타입을 제외한 모든 값

  • 가장 중요한 데이터 타입

  • 객체 리터럴과 생성자(함수)로 생성

  • 이름(프로퍼티 이름이나 키라고 부름)과 값을 한 쌍으로 묶은 데이터를 여러 개 모은 것 => 객체의 프로퍼티

  • 데이터 여러개를 하나로 모은 복합 데이터로 연관 배열, 사전이라고도 부름

 

 

 

객체 리터럴로 객체 생성하기

 

  • 객체 리터럴 : {  } 안의 부분

  • 객체 리터럴을 변수 card에 대입하고 있는 예시

  • 프로퍼티 이름과 프로퍼티 값은 콜론(:)을 사용해서 구분

  • 각각의 프로퍼티들은 쉼표로 구분

  • 프로퍼티 이름은 모든 식별자와 문자열 리터럴 (빈 문자열도 가능)을 사용

 

var card = { suit : "하트", rank : "A" };

 

  • 프로퍼티 값에는 모든 데이터 타입의 값과 표현식 대입 가능

  • 변수에 대입된 객체 안의 프로퍼티 값을 읽고 쓸 때 : 마침표연산자(.)나 대괄호연산자( [ ] )를 사용

 

card.suit // 하트
card["rank"] // A
card.color // undefined 

var obj = {};
console.log(obj); //Object{}

 

  • 마침표 연산자 : 문자열이 아님. 프로퍼티 이름(식별자)만 사용 가능

  • 대괄호 연산자 : 문자열로 채워짐. 프로퍼티 이름이나 문자열을 반환하는 표현식 사용 가능

  • 객체에 없는 프로퍼티를 읽으려고 시도 : undefined

  • 선언되지 않은 변수를 읽으려고 시도 : 참조 오류 발생

  • 객체 리터럴 안에 프로퍼티가 없으면 빈 객체 생성

 

 

 

프로퍼티 추가와 삭제

 

  • 프로퍼티 추가 : 없는 프로퍼티 이름에 값을 대입

  • 프로퍼티 삭제 : delete 연산자 사용

  • Java, C++과 다르게 실행 중 객체의 프로퍼티를 자유롭게 추가, 삭제 가능

 

card.value = 14;
console.log(card); // Object {suit: "하트", rank: "A", value: 14 }

 

 

 

in 연산자로 프로퍼티 존재 확인

 

  • in 연산자 : 객체에 특정 프로퍼티 존재 여부 확인

  • 프로퍼티가 객체에 포함 : true, 아니면 false

  • in 연산자의 조사 대상 : 그 객체가 가진 프로퍼티와 객체가 상속받은 모든 프로퍼티라는 것을 주의

  • card는 Object 객체를 상속받아 toString 프로퍼티가 card에 있다고 조회됨

 

var card = { suit: "하트", rank: "A" } ;
console.log("suit" in card); //true
console.log("toString" in card); //true

 

 

 

객체 리터럴 예제

 

  • 객체의 프로퍼티 값으로 객체를 대입할 수 있다.

  • 마침표 뒤에 프로퍼티 이름을 연결해서 표현한다.

 

var circle =  {
	center: { x: 1.0, y: 2.0 }, // 원의 중점
	radius: 2.5  // 반지름
};

circle.center.x   // 1.0

 

 

 

메서드

 

  • 프로퍼티에 저장된 값의 타입이 함수인 프로퍼티

 

 

 

객체는 참조 타입

 

  • 생성된 객체는 메모리의 영역을 한 덩어리로 차지한다.

  • 객체 타입의 값을 변수에 대입하면, 그 변수에 객체의 참조(메모리에서의 위치정보)가 저장.

  • 즉 그 변수는 객체를 참조하고 있다 (객체 개념은 다른 글에서 잘 설명했기에 넘어가겠음)

 

 

 

 

 

함수의 기초


 

함수

 

  • 일련의 처리를 하나로 모아 언제든 호출할 수 있도록 만들어 둔 것

  • 입력 값(인수)을 받으면 출력 값(반환값)으로 함수 값을 반환

  • 입력을 받은 후 함수 안의 프로그램에서 특정 작업 수행

 

 

 

함수 선언문으로 함수 정의

 

  • function 키워드를 사용해서 정의

  • 소괄호 안의 x : 인수

  • 중괄호 안 : 함수 실행 후 작업할 부분

  • return 문 다음에 줄바꿈 문자를 자동으로 인식하므로 넣지 말 것

  • return 문이 실행되면 제어권이 함수를 호출한 코드로 되돌아가고 함수의 반환값은 return문에 지정된 값이 된다.

 

function square(x) { return x * x; }

 

 

 

 

함수 이름

 

  • 변수 이름과 함수이름은 모든 식별자를 함수 이름으로 사용할 수 있다.

  • 일반적으로 동사나 동사로 시작하는 단어로 만든다.

 

 

 

 

함수 호출

 

  • 함수 호출은 함수 이름 뒤에 소괄호를 인수로 묶어 입력

  • return 문이 실행되면 제어권이 함수를 호출한 코드로 되돌아가고 함수의 반환값은 return문에 지정된 값이 된다.

  • 인수 (argument) : 함수를 호출할 때 전달하는 값

  • 인자 (parameter) : 함수 정의문의 인수

 

square(3) // 9

 

 

 

인수

 

  • 함수는 인수를 여러 개 받을 수 있고 인수와 인수를 쉼표로 구분한다.

  • 인수를 받지 않는 함수 정의도 가능 : 인수와 return문이 없다

  • return문이 실행되지 않은 상태에서 제어권이 함수를 호출한 코드로 되돌아가면 함수의 반환값 : undefined

 

var bark = function() { console.log("BB");};
bark();
console.log(bark());

 

 

 

 

함수의 실행 흐름

 

  • 호출한 코드에 있는 인수가 함수 정의문의 인자에 대입

  • 함수 정의문의 중괄호 안에 작성된 프로그램이 순차적으로 실행

  • return 문이 실행되면 호출 코드로 돌아간다. return 문의 값은 함수의 반환값.

  • return 문이 실행되지 않은 상태로 마지막 문장이 실행되면 호출한 코드로 돌아간 후 undefined가 함수의 반환값이 된다 

 

 

 

함수 선언문의 끌어올림

 

  • JS 엔진은 변수 선언문처럼 함수 선언문을 프로그램의 첫머리로 끌어올림

  • 즉, 함수 선언문은 프로그램 어디에서도 작성 가능

 

console.log(square(5)); //25
function square(x) { return x * x ; }

 

 

 

 

값으로서의 함수

 

  • 함수는 객체

  • 함수 선언문으로 함수를 선언하면 함수이름을 변수 이름으로 한 변수와 함수 객체가 만들어지고 그 변수에 함수 객체의 참조가 저장

  • 변수 값을 다른 변수에 할당하면 그 변수 이름으로 함수 실행 가능

  • 함수를 다른 함수의 인수로 넘길 수도 있음 (8장)

 

 

 

참조에 의한 호출과 값에 의한 호출

 

  • 함수는 1) 원시 값을 인수로 넘겼을 때, 2) 객체를 인수로 넘겼을 때 다르게 동작

 

원시 값을 인수로 넘겼을 때

 

function add1(x) { return x = x+1; }
var a = 3;
var b = add1(a);
console.log("a=" + a + ", b=" + b); //a=3, b=4

 

  • 함수 호출 시 변수 a의 복사본이 인자 x에 할당

  • 값의 전달 : 인수에 원시 값을 넘기면 그 값 자체가 인자에 전달

  • 변수 a와 x는 다른 영역의 메모리에 위치한 별개의 변수여서 x값이 변경되도 a값은 그대로 (값의 복사본을 대입)

 

 

객체를 인수로 넘겼을 때 

 

function add1(p) { p.x = p.x + 1; p.y = p.y + 1; return p; }
var a = { x:3, y:4 };
var b = add1(a);
console.log(a, b); // Object {x=4, y=5} Object {x=4, y=5} 

 

  • 함수 호출 시 변수 a의 복사본이 인자 p에 할당 (원시 값을 인수로 넘겼을 때와 동일)

  • 참조 전달 : 변수 a에 객체 { x:3, y:4 } 의 참조가 저장되어 있으며 이 참조 값을 인자 p에 대입

  • 참조 값 : 인수를 객체로 넘겼을 때 전달되는 값 

  • 인자 p와 변수 a는 같은 객체를 참조한다.

  • 함수의 인수로 객체를 넘기면 함수 내에서 원래 객체를 바꿀 수 있다.

 

  • 인수가 여러 개일 때의 문제점 : 인수의 순서 헷갈림, 인수 개수를 바꾸면 함수의 호출 방법이 바뀐다.

 

 

인수 여러 개를 객체의 프로퍼티에 담아서 함수에 넘기기

 

function setBallProperties(x, y, vx, vy, radius) { ... }
setBallProperties(0, 0, 10, 15, 5);
var parameters = {
	x:0,
  y:0, 
	vx:10,
	vy:15,
  radius:5
};

function setBallProperties(params) { ... }
setBallProperties(parameters);

 

  • 함수 내에서 프로퍼티를 읽는 코드는 params.vx 처럼 표현

  • 전달하는 인수 추가 시에도 프로퍼티만 추가

 

 

 

 

변수의 유효 범위 (Scope)

 

  • 변수에 접근할 수 있는 범위

  • 유효 범위를 결정하는 방법 : 1) 프로그램 구문만으로 정하는 어휘적 범위(lexical scope), 2)프로그램 실행 중 정하는 동적 범위(dynamic scope)

  • 대다수 프로그래밍언어와 JS는 어휘적 범위를 사용

  • JS 변수는 변수의 유효범위에 따라 전역변수, 지역 변수로 나뉨

 

  • 전역 변수 : 함수 바깥에서 선언된 변수. 유효 범위 : 전체 프로그램

  • 지역 변수 : 함수 내에서 선언된 변수와 함수 인자. 유효 범위 : 변수가 선언된 함수 내부

  • 함수 바깥에서 지역 변수를 읽으려고 시도하면 참조 오류가 발생

 

  • 변수에 유효 범위가 있는 이유 : 프로그램의 다른 부분에서 동명인 변수의 충돌을 막기 위해서

  • 그러나, 전역변수 이름과 지역변수 이름과 같으면 변수 충돌, 전역변수를 숨기고 지역변수를 사용

  • 함수 중간에서 변수를 선언해도 함수 처음에서 선언된 것처럼 다른 문장보다 먼저 생성

  • 함수 외, 내에서 변수를 선언하지 않은 상태에서 값을 대입하면 전역 변수로 선언

 

 

 

 

블록 유효 범위 : let과 const

 

  • ES6부터 추가된 변수 선언자로 블록 유효범위를 갖는 변수를 선언

  • 블록 유효 범위 : 중괄호 {  }  안에서만 유효

  • let : 변수 선언

  • const : 상수 선언 (한 번만 할당)

 

 

let 선언자

 

  • 사용법은 var 문과 같으며 변수의 유효범위가 가장 큰 차이점

  • 동일 변수명일 경우 중괄호 내에서는 중괄호 내부 변수가 유효

  • 유효범위가 중괄호 안인 변수는 바깥에서 읽으려 시도하면 참조 오류가 발생한다.

  • var 문과 달리 let 선언 변수는 끌어올리지 않는다.

  • let 문으로 동일 이름 변수를 선언하면 문법 오류 발생

 

let x;
let x; // Uncaught SyntaxError

 

 

const 선언자

 

  • 한 번만 할당할 수 있는 블록 유효 범위의 변수(상수) 선언

  • let과 유사하나 반드시 초기화해야한다는 특징이 있다.

  • 선언 변수에 다시 대입을 시도하면 타입 오류 발생. 상수값은 수정하지 못한다.

  • 상수 값이 객체거나 배열일 경우 프로퍼티/프로퍼티 값을 수정할 수 있다.

 

const c = 2;
c = 5; // Uncaught TypeError
const origin = { x:1, y:2 };
origin.x = 3;
console.log(origin); // Object { x:3, y:2 }

 

 

 

 

함수 리터럴로 함수 정의하기

 

  • 함수 리터럴 : 이름이 없는 함수, 익명 함수, 무명 함수. function(x) { ... } 부분이다.

  • 함수 선언문에서는 끝에 세미콜론을 붙일 필요가 없지만 함수 리터럴 사용 시 끝에 세미콜론을 반드시 붙인다.

  • 함수 선언문과 함수 리터럴로 정의한 함수의 사용법은 같다. square(5);

  • 함수 리터럴, 함수 선언문 모두 내부적으로 square 변수에 함수 객체의 참조를 저장

 

var square = function(x) { return x*x; };

 

  • JS 엔진이 함수 선언문으로 정의한 함수는 끌어올리지만 함수리터럴로 정의한 함수는 끌어올리지 않는다

  • 함수 리터럴로 정의한 익명 함수는 변수 할당 후에 square라는 이름을 갖게 되고, 그 이름으로 호출 가능

  • 따라서 함수 미정의 상태에서 함수를 사용하면 타입 오류 발생

 

console.log(square(3));  // Uncaught TypeError: square is not a function    
var square = function(x) { return x*x; };

 

  • 익명 함수 코드는 디버거에 모두 anonymous function이라고 표시되므로 함수를 구별할 수 없는 단점

  • 익명 함수에도 이름을 붙이면 확인 할 수 있으나 코드에서 sq라는 이름은 함수 내에서만 유효

  • 함수 바깥에서 sq 이름으로 호출할 수 없음

 

var square = function sq(x) { return x*x; };

 

 

 

 

객체의 메서드

 

  • 메서드 : 객체의 프로퍼티 중 함수 객체의 참조를 값으로 담고 있는 것

  • 메서드 정의 : 프로퍼티 값으로 함수 리터럴을 대입

  • 함수 객체 안 this는 그 함수를 메서드로 가지고 있는 객체, 아래에서는 circle

  • this.radius 는 circle.radius와 같다

  • 메서드는 일반 함수처럼 소괄호를 붙여서 실행

  • 메서드도 프로퍼티의 일종이어서 나중에 추가 가능

  • 메서드는 일반적으로 메서드가 속한 객체의 내부 데이터 (프로퍼티 값) 상태를 바꾸는 용도로 사용

 

var circle = {
	center: { x:1.0, y:2.0 },  // 원의 중심점 표현 객체
	radius: 2.5,      // 원의 반지름
	area: function(){ // 원의 넓이 메서드
		return Math.PI * this.radius * this.radius;		
    }
};

 console.log(circle.area());  //19.634954084936208

 

  • 객체 지향 언어에서는 데이터와 스 상태를 바꾸는 메서드를 하나로 묶는 용으로 객체를 사용

  • 메서드는 외부 호출에 반응하여 내부 데이터(프로퍼티값)의 상태를 바꾼다.

  • 객체 지향 프로그래밍 : 객체를 기본 부품으로 삼아 프로그램을 만들어 가는 기법

 

 

메서드는 프로퍼티

  • C++, JAVA 등의 객체지향언어에서는 객체 안의 데이터와 메서드를 별개로 다룬다.

  • 그러나 JS의 메서드는 함수를 값으로 가진 프로퍼티

  • 프로퍼티 값의 데이터 타입만 다를 뿐 객체 안의 데이터와 메서드는 모두 프로퍼티이다.

  • JS의 프로퍼티 : 객체 내부의 데이터와 메서드를 모두 뜻한다.

  • 그래서 객체의 프로퍼티 목록을 열거하면 프로퍼티 값의 데이터 타입에 관계없이 모든 프로퍼티를 열거하는 것

  • 프로퍼티와 함수를 구분하는 상태에서의 프로퍼티 : 함수를 값으로 가지지 않은 프로퍼티, 메서드는 함수를 값으로 가진 프로퍼티로 구분해서 사용

 

 

 

함수를 활용하면 얻을 수 있는 장점

 

1. 재사용할 수 있다

2. 만든 프로그램을 이해하기 쉽다

3. 프로그램 수정이 간단해진다.

 

 

 

 

 

생성자


  • 생성자를 사용하면 이름이 같은 메서드와 프로퍼티를 가진 객체 여러 개를 효율적으로 생성할 수 있다.

  • 자바 등은 같은 프로퍼티를 갖는 객체를 여러 개 생성하는 수단으로 클래스를 제공한다.

  • JS는 클래스 대신 생성자 함수로 객체를 생성한다.

  • 생성자로 객체를 생성할 때는 new 연산자를 사용한다.

 

function Card(suit, rank) {  // Card 객체
	this.suit = suit;
	this.rank = rank;
}

// Card 생성자로 생성한 객체 :
var card = new Card("하트", "A");  
//  suit 프로퍼티, rank 프로퍼티에 값이 저장된 객체가 생성되고
//  객체의 참조가 변수 card에 할당된다.

console.log(card);  //   Card {suit: "하트", rank: "A"}

 

객체를 출력하면 앞에 생성자 이름이 표시된다.

 

 

  • 생성자 : new 연산자로 객체를 생성할 것을 기대하고 만든 함수

  • 생성자 이름은 관례적으로 파스칼 표기법 (첫 글자 대문자)을 사용

  • 생성자 내에서 this.프로퍼티 이름에 값을 대입하며 그 이름을 가진 프로퍼티에 값이 할당된 객체가 생성된다. 

  • this는 생성자가 생성하는 객체를 가리킨다.

 

  • 생성자의 인스턴스 : 생성자와 new 연산자로 생성한 객체

  • 인스턴스 : 클래스로 생성한 실체

  • 클래스 : 객체를 실체로 만들기 위한 설계도

  • 생성자 자체가 함수 객체라는 실체이며, 생성자로 생성한 객체는 인스턴스가 아니나 생성자가 클래스처럼 객체를 생성하므로 인스턴스로 부름

  • 역할 : 객체를 생성하고 초기화

 

// 생성자 Card를 이용해서 객체를 생성하고 변수 여러 개에 저장하는 예
var card1 = new Card("하트", "A");  
var card2 = new Card("클럽", "K");  
var card3 = new Card("스페이드", "2");  

 

  • 생성자를 사용하면 이름은 같지만 프로퍼티 값이 다른 객체(인스턴스) 여러개를 간단히 생성

  • 생성자는 함수이므로 프로퍼티에 값을 대입할 수 있고, 함수처럼 다양한 처리를 할 수도 있다.
  • 응용 : 객체를 생성할 때 초기화 작업을 병행

 

 

 

 

메서드를 가진 객체를 생성하는 생성자

 

  • 생성자에서 this.프로퍼티 이름에 함수의 참조를 대입하면 메서드를 정의한다.

  • 메서드 함수 안의 this : 생성될 인스턴스를 가리킨다. 그 값은 인스턴스의 프로퍼티

 

 

 

 

내장객체


  • 내장객체 : JS에 있는, 처음부터 사용할 수 있는 빌트인 오브젝트

  • 내장객체는 프로그래밍 언어의 뼈대를 구성

 

 

ES5에서 사용할 수 있는 내장 생성자

 

생성자 이름 생성되는 객체
Object 일반 객체
String 문자열 객체
Number 숫자 객체
Boolean 논리값 객체
Array 배열
Date 날짜와 시간을 다루는 객체 (var now = new Date(); now.getFullYear();)
Function 함수 객체 (var square = new Function("x", "return x*x");
RegExp 정규 표현식 객체
Error 오류 객체
EvalError eval() 함수와 관련된 오류를 표현하는 객체
InternalError 자바스크립트 내부에서 발생한 오류를 표현하는 객체
RangeError 값이 허용 범위를 넘었을 때 발생한 오류를 표현하는 객체
ReferenceError 없는 변수를 참조할 때 발생한 오류를 표현하는 객체
SyntaxError 잘못된 문법일 때 발생한 오류를 표현하는 객체
TypeError 기대한 타입의 값이 아닐때 발생한 오류를 표현하는 객체
URIError 잘못된 URI를 만났을 때 발생한 오류를 표현하는 객체

 

 

 

ES6에서 사용할 수 있는 내장 생성자

 

생성자 이름 생성되는 객체
Symbol 심벌을 생성
Int8Array8 부호가 있는 8비트 정수 배열을 생성
Uint8Array8 부호가 없는 8비트 정수 배열을 생성
Int16Array16 부호가 있는 16비트 정수 배열을 생성
Uint16Array16 부호가 없는 16비트 정수 배열을 생성
Int32Array32 부호가 있는 32비트 정수 배열을 생성
Uint32Array32 부호가 없는 32비트 정수 배열을 생성
Float32Array32 32비트 부동소수점 배열을 생성
Float64Array64 64비트 부동소수점 배열을 생성
ArrayBuffer 고정 길이 이진 데이터 버퍼를 생성
DataView ArrayBuffer 데이터를 읽고 쓸 수 있는 수단 제공
Promise 처리 지연 및 비동기 처리를 관리 수단 제공
Generator 제너레이터 함수를 다룰 수 있는 수단 제공
GeneratorFunction 제너레이터 함수 생성
Proxy 객체의 기본적인 동작을 재정의하는 기능 제공
Map key/value 맵 생성
Set 중복을 허용하지 않는 데이터 집합 생성
WeakMap 약한 참조를 유지하는 key/value 맵 생성
WeakSet 약한 참조를 유지하는 고유한 데이터 집합 생성

 

 

기타 내장 객체

내장 객체 설명
전역 객체 프로그램 어디에서나 사용 가능한 객체
JSON JSON 처리 기능 제공
Math 수학적 함수와 상수 제공
Reflect 프로그램의 흐름을 가로채는 기능 제공 (ES6)

 

 

 

전역 객체

 

  • 전역 객체의 프로퍼티는 프로그램 어디에서나 사용가능

  • JS 인터프리터가 시작될 때나 웹브라우저가 새페이지를 읽을 때마다 새 전역 객체가 생성되고 아래 표와 같은 프로퍼티를 갖게 된다.

  • 클라이언트 측 JS에서는 Window 객체가 전역 객체

  • Window 객체 : 아래 표의 프로퍼티와 웹브라우저 고유의 다양한 프로퍼티가 있다. 궁금하면 콘솔에 console.dir(window)를 찍어보자.

 

분류 프로퍼티
전역 프로퍼티 undefined, NaN, Infinity
생성자 Object(), String(), Number() ...
전역 함수 parseInt(), parseFloat(), isNan() ...
내장 객체 Math, JSON, Reflect

 

 

 

 

 

자바스크립트 객체 분류

 

JS 객체는 네이티브객체, 호스트객체, 사용자 정의 객체로 나누어진다.

 

네이티브 객체

 

  • ECMAScript 사양에 정의된 객체

  • 내장 생성자로 생성된 객체(Object, String, Number, Boolean, Array, Function) 와 JSON, Math, Reflect 등

 

 

 

 

 

호스트 객체

 

  • ECMAScript에 정의되어 있지 않지만 JS 실행환경에 정의된 객체

  • 브래우저 객체, Dom 객체, Ajax용 XMLHttpRequest 객체, HTML5의 각종 API 등

  • 클라이언트 측 JS에 정의된 호스트 객체

 

 

 

사용자 정의 객체

  • 사용자가 정의한 JS 코드를 실행한 결과 생성된 객체

 

 

 

 

배열의 기초


 

배열 리터럴로 생성하기

 

var evens = [ 2, 4, 6, 8 ];

 

  • 배열 리터럴 : 쉼표로 구분한 값을 대괄호로 묶어서 표현

  • 배열 요소 : 배열 값 하나

  • 인덱스 (요소 번호) : 배열 요소를 왼쪽부터 순서대로 0부터 순서를 매긴 것.

  • JS의 배열은 객체 타입

  • 배열을 변수에 대입하면 배열의 참조가 변수에 저장

  • 변수의 요소에는 모든 타입의 값 가능

 

 

var empty = [ ]; // 빈 배열 만들기
var a = [2,  , 4]; // 리터럴 요소의 값을 생략하면 그 요소는 미생성

 

 

 

length 프로퍼티

 

  • 배열 길이 : 배열의 lenght 프로퍼티는 배열요소의 최대 인덱스값 + 1이랑 같음 

  • C,Java에서는 배열길이가 배열요소의 개수지만 JS는 아닐 수도 있다. 

  • length 프로퍼티에 배열의 길이보다 큰 정수를 대입하면 새로운 요소가 추가되지 않고 length 프로퍼티 값만 바뀐다

 

var a = ["A", "B"];
a.length = 1;
console.log(a); //["A"]

var a = ["A", "B"];
a.length = 1;
console.log(a); //(3) ["A", "B", empty]

 

 

 

 

 

Array 생성자로 생성하기

 

var evens = new Array(2, 4, 6, 8); 
var empty = new Array(); // 빈 배열
var various = new Array(3.14, "pi", true, {x:1, y:2}, [2,4,6,8]);
console.log(evens);
console.log(empty);
console.log(various);

 

 

  • Array 생성자의 인수가 양의 정수 한 개일 때, 인수는 배열 길이를 뜻한다.

  • Array 생성자의 인수가 음수이면 오류 발생

 

var x = new Array(3);
console.log(x);

var y = new Array(-3);
console.log(y);

 

 

  • 특정 인덱스의 요소는 대괄호 연산자를 사용해서 읽고 쓴다. (evens[2])

  • 배열 요소 하나는 변수 하나로 사용 가능

 

 

 

배열은 객체

 

  • C, Java 의 배열 요소는 메모리의 연속된 공간에 차례대로 배치되어, 인덱스를 지정하면 인덱스가 가리키는 요소를 빠르게 읽고 쓸 수 있다.

  • JS의 배열은 Array 객체로 C, Java와 다르다.

  • 객체로 배열의 기능을 가상으로 흉내낸 것으로 배열의 인덱스를 문자열로 변환해서 그것을 프로퍼티로 사용한다.

  • 배열에 대괄호 연산자를 사용하는 것은 객체에 대괄호 연산자를 사용하는 것과 마찬가지

  • 배열의 요소 번호로 숫자값 대신 문자열 사용도 가능

  • 객체에 없는 프로퍼티 (없는 배열 요소)를 읽으려고 시도하면  undefined가 반환

  • ES6부터 TypedArray 객체 추가 : 이 배열 요소는 C, Java처럼 메모리의 연속된 공간에 차례대로 배치되어 배열요소를 빠르게 읽고 쓸 수 있다. 

 

 

 

배열 요소의 추가와 삭제

 

  • 없는 배열 요소에 값을 대입하면 새로운 요소가 추가된다.

  • push 메서드를 사용하면 요소를 배열 끝에 추가한다.

  • delete 메서드는 특정 배열 요소를 삭제한다. (배열 요소를 삭제해도 length 프로퍼티 값은 그대로며 삭제한 요소만 사라져서 undefined가 된다.)

 

var a = ["A", "B", "C"];
delete a[1];
console.log(a);

 

 

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

희소 배열

 

희소 배열 (length=5) 일반 배열 (length=4)
0 "A" 0 "A"
1 "B" 1 "B"
2 "C" 2 "C"
4 "E" 3 "D"

 

 

배열 요소가 있는 지 확인하는 방법 = 객체의 프로퍼티가 있는 지 확인하는 방법

for/in 문이나 hasOwnProperty 메서드를 사용해 확인한다.

 

for(var i in a) console.log(i);  // 0,1,2,4
a.hasOwnProperty("3"); //false

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

숫자, 문자열, 객체 등 JS가 다루는 값(데이터타입)과 값을 저장하기 위한 변수를 배웁니다. 변수는 프로그램을 작성하는데 가장 중요한 요소입니다. 프로그램은 알고리즘을 사용하여 문제를 해결하는데 알고리즘 표현을 위해서는 대부분 변수를 필히 사용해야 합니다. 변수 선언하는 방법과 변수명 짓는 방법을 배웁니다.

 

 

 

 

1. 변수


1. 변수

  • 값을 담기 위해 이름을 붙인 상자
  • 컴퓨터의 메모리에 일정한 크기의 영역으로 생성
  • 일반적인 프로그램은 변수 값을 알고리즘에 따라 변화시켜 프로그램이 의도한 목적을 달성

 

2. 변수 선언

 

var sum;
var a, b; // 쉼표를 사용해 변수 여러개를 하나의 문장으로 선언 가능 

 

  • 문장이 실행 ->  메모리에 sum이라는 이름의 영역이 생성
  • var : 자스의 키워드로 변수를 선언하기 위한 선언자
  • sum 부분은 변수 이름이라고 부르며 이 변수 이름을 이용해 변수값을 읽거나 쓸 수 있음
  • 자스에는 변수 타입이 없어 변수 선언자는 var 하나 (ECMAScript6는 let, const 추가) -> 모든 데이터 타입의 값 저장 가능
  • 쉼표를 사용해 변수 여러개를 하나의 문장으로 선언 가능 
var x;
console.log(x); //undefined
x = 2;

// 변수를 선언하면서 초깃값 설정하기
var x = 5;
var a=1, b=2, c=3; // 한 문장으로 

 

  • 변수 선언만 하면 정의되지 않은 (undefined) 값이 들어감
  • 대입 연산자(=)로 변수에 값을 대입한다
  • 대입 연산자는 오른쪽 값을 왼쪽 변수에 대입...보다는 메모리 공간을 연결한다는 뜻
  • 수학의 연산자 = 는 양 변이 같다는 뜻이지만 프로그램에서는 대입하겠다는 뜻

 

3. 변수 선언 생략

  • 선언하지 않은 변수 값을 읽으면 참조 오류가 발생
  • 선언하지 않은 변수에 값을 대입하면 자동으로 전역변수로 선언하여 오류가 발생하지 않음
    -> 그러나 버그의 원인이 될 수 있어 의도한 게 아니라면 선언해 줄 것.
  • ECMAScript5 의 Strict 모드는 선언하지 않은 변수에 값을 대입하면 오류가 발생해 찾아내기 쉽다
console.log(z); // ReferenceError: z is not defined
c = 2;
console.log(c); // 2 (전역변수)

 

 

4. 변수 끌어올림, 변수 중복 선언

  • 프로그램은 작성 순서에 따라 윗줄부터 차례대로 실행되나 변수 선언은 이 원칙을 따르지 않음
  • 호이스팅(hoisting) : 프로그램 중간에서 변수를 선언해도 프로그래밍 첫머리에 선언된 듯 다른 문장 앞에 생성되는 것, 끌어올림
  • 단 선언과 동시에 대입하는 코드는 호이스팅되지 않음
  • 같은 이름의 변수를 여러 개 선언할 수 있으며 모두 끌어올린 후에 단 하나의 영역에만 할당
  • 호이스팅은 자스의 고유한 특징
// 1
console.log(x);  // undefined. 값만 없고 참조 오류가 발생하지 않는다
var x;

// 2
console.log(x);  // undefined이며 이 경우 호이스팅 안됨
var x = 5; 
console.log(x);  // 5 

 

 

5. 변수의 명명 규칙

  • 식별자 : 변수, 함수, 라벨 이름 등 사용자가 정의하는 이름
  • 사용할 수 있는 문자는 알파벳, 숫자, 밑줄, 달러 기호
  • 첫 글자는 숫자가 불가하며 알파벳, 밑줄, 달러 기호 중 하나여야 함
  • 예약어를 식별자로 사용 불가
  • 변수명은 길이의 단축보다는 의미의 표현이 우선
  • 루프 카운터 변수명은 i, j, k등을 주로 사용
  • 상수는 대문자로 주로 표현(MAX_SIZE)
  • 논리값 표현 변수 이름 앞에는 is를 붙임(isMouseDown)
  • 생성자 이름은 파스칼 표기법 사용 (앞에 대문자)
  • 표기법 : 캐멀/로어캐멀 표기법(createLifeGame), 파스칼/어퍼캐멀 표기법(CreateLifeGame), 스네이크/밑줄표기법(create_life_game)

 

 

6. 예약어

  • 자바스크립트 문법을 규정하기 위해 자스 언어 사양에서 사용하는 특수한 키워드
  • ECMAScript 6  :  break, case, catch, class, const, continue, debugger, default, delete, do, else, export, extends, false, finally, for, function, if, import, in, instanceof, new, null, return, super, switch, this, throw, true, try, typeof, var, void, while, with, yield
  • ECMAScript 6 이후 추가 예정 : await, enum, implements, package, protected, interface, private, public
  • 미리 정의된 전역 변수와 전역 함수 : arguments, Array, Boolean, Date, decodeURI, decodeURIComponent, encodeURI, encodeURIComponent, Error, eval, EvalError, Function, Infinity, isFinite, isNan, JSON, Math, NaN, Number, Object, parseFloat, parseInt, RangeErrror, RefferenceError, RegExp, String, SyntaxError, TypeError, undefined, URIError
  • 위에 나온 키워드와 Window 객체의 이름, DOM에서 사용하는 객체 이름도 식별자 이름으로 피하기를 권장
  • 서버 측 자스 코드 실행시에도 실행 환경이 미리 정의한 객체이름을 피할 것

 

 

 

2. 데이터 타입


1. 데이터타입

  • 프로그래밍 언어의 기본적인 구성 요소로 숫자나 문자열처럼 변수에 저장하는 데이터 종류
  • 정적 타입 언어 : C, Java처럼 정수 타입 변수, 부동소수점 타입 변수 등이 있어 그 변수의 타입과 일치하는 데이터만 저장할 숭 ㅣㅆ어 변수에 타입이 있는 언어
  • 동적 타입 언어 : 실행할 떄 변수에 저장된 데이터 타입을 동적으로 바꿀 수 있는 언어
  • 자스는 변수에 타입이 없어 모든 타입의 데이터 저장 가능
var pi = 3.14;
console.log(pi); //3.14
pi = "원주율";
console.log(pi); //원주율

 

2. 데이터 타입의 분류

  • 자스가 처리할 수 있는 데이터타입읜 원시타입과 객체 타입 두 가지
  • 원시 타입의 값 : 숫자, 문자열, 논리값, 특수한 값(undefined, null), Symbol
  • 원시 타입 데이터 : 데이터를 구성하는 가장 기본적인 요소로 불변 값으로 정의
  • 객체 : 원시 타입에 속하지 않는 자스의 값. 변수 여러개가 모여서 만들어진 복합 데이터 타입으로 
    객체는 참조하는 타입이기 때문에 객체 안의 값은 바꿔 연결해 저장할 수 있다
  • 객체 타입의 값을 변수에 대입 -> 변수에 객체에 대한 참조 (메모리에서의 위치주소 정보)가 할당
  • 객체 타입의 값 : 배열, 함수, 정규 표현식 등

 

3. 숫자

  • 자스는 숫자를 모두 64비트 부동소수점으로 표현 (C, Java의 double 타입에 해당)
  • 배열 인덱스와 비트 연산은 32비트 정수로 처리
  • 리터럴(literal) : 프로그램에 직접 작성할 수 있는 상수 값으로 정수리터럴, 부동소수점 리터럴이 있음

 

숫자 리터럴

분류 표기   예시 설명 비고
정수 리터럴 10진수 123 정수를 그대로 표현  
16진수 0x2a 숫자 앞에 0x를 붙임  
8진수 0o73 숫자 앞에 0o를 붙임 Es6
2진수 0b101 숫자 앞에 0b를 붙임 Es6
부동소수점 리터럴 정수.소수 3.14 소수를 그대로 표현  
소수 0.123 정수부가 0일 때 0 생략 가능  
가수부e지수부 6.02e23 6.02 x 1023  
가수부E지수부 1.1616199E-35 1.1616199 x 10-35  

 

 

특별한 숫자를 표현하기 위한 문자열 (Es5에서는 모두 읽기 전용)

분류 표기법 설명 비고
전역 변수 Infinity 플러스 무한대  
NaN 부정 값 (Not a Number)  
Number의 프로퍼티 Number.POSITIVE_INFINITY 플러스 무한대  
Number.NEGATIVE_INFINITY 마이너스 무한대  
Number.MAX_VALUE 표현할 수 있는 최댓값  
Number.MIN_VALUE 표현할 수 있는 최솟값  
Number.NaN 부정값 (Not a Number)  
Number.EPSILON 2.2204604925031e-16 ES6
Number.MIN_SAFE_INTEGER -9007199254740990 ES6
Number.MAX_SAFE_INTEGER 9007199254740990 ES6

 

NaN은 0을 0으로 나눈 결과값, Infinity를 Infinity로 나눈 값, 음수의 제곱근 등 숫자로 표현할 수 없는 부정값을 말합니다.

 

 

 

4. 문자열

  • 자스의 문자열은 16비트 길이의 유니코드 문자를 나열한 것
  • 전 세계에서 사용하는 문자를 대부분 표현 가능
  • 문자열 리터럴은 ''나 ""를 문자열 앞뒤에 붙여서 표현
  • "" : 빈 문자열
  • HTML요소에 자스를 끼워 넣을 떄 자스 프로그램을 문자열로 작성
  • HTML과 자스에서 사용하는 따옴표 구분을 권장
  • 줄바꿈문자, 탭문자 등은 그대로 추가 불가하며 escape 시퀀스로 표현 ('I\'m going to')

 

이스케이프 시퀀스 목록

이스케이프 시퀀스 의미 비고
\0 null 문자  
\b 백스페이스 문자  
\t 수평 탭 문자  
\n 개행 문자  
\v 수직 탭 문자  
\f 다음 페이지 문자  
\r 캐리지 리턴 문자(CR)  
\' 작은 따옴표 문자  
\" 큰 따옴표 문자  
\\ 역슬래시 문자  
\xXX 두 자릿수 16진수 XX로 지정된 Latin-1 문자  
\uXXXX 네 자릿수 16진수 XXXX로 지정된 유니코드 문자  
\u{XXXXXX} 16진수 코드 포인트 XXXXXX로 지정된 유니코드 문자.
써로게이트 페어의 다섯 자리수 코드 포인트(5.3절)을 지원합니다.
Es6

 

써로게이트 페어의 다섯 자릿수 코드 포인트

유니코드는 문자 집합과 문자 인코딩 방식을 정한 표준 문자 코드입니다. 유니코드 문자 집합에는 전 세계에서 사용하는 문자가 거의 포함됩니다. 하지만 UTF-16 유니코드로 표현할 수 있는 범위를 넘어서는 이모티콘이나 자주 사용하지 않는 한자 등이 있고, 이는 써로게이트 페어를 사용해 문자를 표현합니다.

 

 

5. 논리값

  • 조건식의 참/거짓을 판별해 표현하기 위해 사용하는 값으로 true(참), false(거짓)가 있음
  • 주로 제어 구문에 사용 (if/else, while, do/while, for문)

 

 

6. 특수한 값

  • 값이 없음 : null, undefined
  • undefined : 정의되지 않은 상태<할당되지 않은 결과>
    • 값을 아직 할당하지 않은 변수의 값
    • 없는 객체의 프로퍼티를 읽으려 시도했을 때의 값
    • 없는 배열의 요소를 읽으려 시도했을 때의 값
    • 아무것도 반환하지 않는 함수가 반환하는 값
    • 함수를 호출했을 때 전달받지 못한 인수의 값
  • 즉 변수 값이 undefined라는 것은 값을 할당하지 않은 결과. 코드로 undefined를 대입한 것이 아닌 자스 엔진이 변수를 undefined로 초기화한 것이며 자스 전역 변수에도 같은 이름의 undefined가 있고 초기값은 undefined라는 원시값. ES5에서는 전역 변수 undefined의 값을 수정할 수 없음.
  • null : 아무것도 없음을 값으로 표현한 리터럴. 무언가를 검색했을 때 아무것도 없음을 전달하기 위한 값으로 사용.

 

 

 

3. ECMAScript6부터 추가된 데이터타입


1. 심벌

  • 자기 자신을 제외한 그 어떤 값과도 다른 유일무이한 값
  • ES6부터 새롭게 추가된 원시값

 

심벌의 생성

  • Symbol()은 호출 시마다 새로운 값을 만든다

  • sym1과 sym2의 값은 다름

 

var sym1 = Symbol();
var sym2 = Symbol(); 
console.log(sym1 == sym2); //false

 

  • Symbol()에 인수를 전달하면 생성된 심벌의 설명을 덧붙일 수 있다.

  • 자세한 것 :  toString() 메서드로 검색

  • 일반적으로 toString은 그 객체를 설명해주는 문자열 "true"나 "false"를 리턴한다.

 

var HEART = Symbol("하트"); 
console.log(HEART.toString()); // Symbol(하트)

 

  • 예시 : 오셀로 게임을 만들 때 0, -1, 1보다 Symbol을 사용하면 이해가 쉬워진다.

 

var NONE = 0 ; //칸에 돌이 없는 상태
var BLACK = -1; // 칸에 검은 돌이 놓인 상태
var WHITE = 1; // 칸에 흰 돌이 놓인 상태
var NONE = Symbol("none"); //칸에 돌이 없는 상태
var BLACK = Symbol("black"); // 칸에 검은 돌이 놓인 상태
var WHITE = Symbol("white"); // 칸에 흰 돌이 놓인 상태

 

 

 

심벌과 문자열 연결

  • Symbor.for() 을 활용하면 문자열과 연결된 심벌을 생성할 수 있다.

  • 예시의 결과 : 전역 레지스트리에 심벌이 만들어짐

 

var sym1 = Symbol.for("club");
var sym2 = Symbol.for("club"); //불러온다
console.log(sym1 == sym2); //true
console.log(sym1 === sym2); //true

 

  • 전역 레지스트리에서 심벌을 위에 지정한 문자열로 불러올 수 있음

  • 따라서 코드 어디서도 같은 심벌을 공유할 수 있음
  • Symbol.keyFor() : 심벌과 연관된 문자열 구하기

 

var sym1 = Symbol.for("club");
var sym2 = Symbol("club");
console.log(Symbol.keyFor(sym1)); // club
console.log(Symbol.keyFor(sym2)); // undefined

 

 

 

템플릿 리터럴

 

  • 템플릿 : 일부만 변경해 반복하거나 재사용할 수 있는 틀

  • 템플릿 리터럴 : ES6부터 추가된 문자열 표현 구문.

  • 표현식의 값을 문자열에 추가하거나 여러줄의 문자열 표현 가능

 

 

기본 사용법

  • 역따옴표로 묶은 문자열. 

  • 문자열에서는 이스케이프 시퀀스 (\n)를 사용하나 템플릿에서는 일반 줄 바꿈 문자도 사용 가능.

  • 이스케이프 시퀀스 문자를 그대로 출력하려면 템플릿 리터럴 앞에 String.raw (태그 함수) 를 붙여준다.

 

`I'm going to learn JS.`
var t= String.raw`I'm going to\nlearn JS.`

 

 

 

 

보간 표현식

 

  • 템플릿 시터럴 내에는 플레이스 홀더를 넣을 수 있다. ${ ... }

  • 플레이스 홀더 : 실제 내용물을 나중에 삽입할 수 있도록 일단 확보한 장소라는 뜻. 사용자의 입력 값처럼 실행 시점에 외부에서 주어지는 값을 표현식에 반영하고자 할 때 미리 마련한 장소

  • JS 엔진은 플레이스 홀더 내 ... 부분을 표현식으로 간주, 평가하여 문자열 내 변수나 표현식의 결과값을 삽입 가능

 

var a = 2, b = 3;
console.log(`${a} + ${b} = ${a+b}`); 

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

간단한 예제를 JS 실행 환경에서 실행하며 프로그램의 기본 작성법을 배웁니다. 문법 이전에 프로그램을 작성하는 방법과 프로그래밍과 관련된 용어, 사고방식을 배웁니다.

 

 

 

 

 

 

1. 실습 준비하기


 

1. 크롬 웹 브라우저와 Node.js 설치

 

이미지를 클릭하면 이동합니다.

 

  • 컴퓨터의 OS에 맞게 받아주세요. 라이센스 동의 누르고 설치 진행주시면 됩니다.

  • 책에서 Mac은 설치 경로를 선택할 수 없다는데 현재는 됩니다. 

  • 저는 기본으로 설정했습니다. 교재에서도 그렇습니다.

 

 

2. 텍스트 편집기 준비

 

  • 윈도우의 메모장이나 맥의 텍스트편집기 등의 텍스트편집기만 있으면 가능합니다

  • 프로그램 작성용 편집기나 통합 개발환경 IDE는 코드에 색을 칠해 문법 강조, 문법 오류 자동 확인, 코드 자동 완성 등이 있어 편리

  • 유료 버전 : Sublime Text, 웹 스톰 (윈도, 맥, 리눅스)을 추천

  • 무료 버전 : 비주얼 스튜디오 코드(윈도, 맥, 리눅스), 어도비 브래킷 (윈도, 맥)

  • 비주얼 스튜디오가 아니고 비주얼 스튜디오 코드입니다.

  • 어도비브래킷은 내장된 Node.js로 개발용 웹 서버를 동작시키는 실시간 미리보기가 있어 웹서버에 올리지 않고서도 빠른 결과물 확인이 가능

 

 

3. 파일의 확장자 표시 설정 변경

 

  • 기본적으로 파일 확장자 표시 않도록 설정되어 바꿔야 함

  • 윈도 7/8 : 시작 > 제어판 > 모양 및 개인 설정 > 폴더 옵션 > 보기 탭 > 고급 설정 > 알려진 파일 형식의 파일 확장명 숨기기 체크 해제

  • 윈도 10 : 시작 > 파일 탐색기 > 보기 탭 > 파일 확장명 체크

  • 맥 : Finder > 환경 설정 > 고급 탭 > 모든 파일 확장자 보기 체크

 

 

2. 간단한 예제


  • js_study라는 실습용 폴더를 만든 뒤 편집기 프로그램을 실행시키고 예제 2-1 코드를 입력

  • 파일명은 factorial.js로 저장

 

예제 2-1 : 팩토리얼
function fact(n) {
	if( n<=1 ) return n;
	return n*fact(n-1);
}
for(var i=1; i<10; i++) {
	console.log(i + "! = " + fact(i));
}

 

 

코드 입력 시 주의사항

 

  • 직접 작성해보기

  • 공백 문자 잘 체크해서 space로 입력하기

  • 들여쓰기는 Tab을 사용

  • 문장의 끝에는 세미콜론 잊지말기

 

저장 시 주의사항

 

  • 파일 이름 끝에 확장자 붙이기. js는 .js, html은 .html

  • 파일 문자 인코딩은 UTF-8로 지정해 저장

  • 편집기에 따라 저장할 때 코드로 입력하거나 환경설정에 사전 지정할 수 있음

 

 

 

3. 프로그램 실행법


 

1. 웹 브라우저의 콘솔에서 실행

 

  • 대부분의 웹 브라우저는 개발자 도구를 제공

  • 개발자 도구에서 HTML, CSS로 설정한 내용을 확인, 임시 편집 가능

  • 자스 코드의 디버깅과 네트워크 통신 내용을 분석할 수 있는 등 다양한 웹개발 도구 내장

  • 콘솔은 짧은 프로그램의 실행을 확인할 수 있는 최적의 도구

  • 크롬의 개발자 도구는 Chrome DevTools 

 

개발자 도구 켜기

  • 웹페이지 위에서 우클릭 > 검사 선택

  • 맥 : Command + Option + I

  • 윈도 : Ctrl + Shift + I

  • 우측 중간의 사용자 정의 버튼을 누르면 개발자 도구를 새 창으로 분리하든지 하단, 좌측, 우측으로 옮길 수 있음

 

Dock Side

 

 

콘솔에서 프로그램 실행

  • 개발자 도구에서 Console 탭을 선택

  • 프롬프트 (>) 에 자스 코드를 입력하면 실행

  • 문자열을 표현할 때 ""나 ''로 문자열을 묶음

  • 실행 후 ↑ 나 Ctrl + P를 누르면 과거 입력한 코드를 다시 불러옴

  • 프로그램은 Shift + Enter로 여러 줄에 나누어 입력 가능

  • clear() 입력하면 콘솔 청소

  • Enter를 누르면 프로그램 실행

  • 여러줄 모드에서는 emacs와 유사한 단축키 사용이 가능

  • Node.js의 대화형 모드(REPL, Read Eval Print Loop)에서도 동일 단축키 사용 가능

 

 

여러줄 모드 단축키

  • Ctrl + F : 커서 우측 이동

  • Ctrl + B : 커서 촤즉 이동

  • Ctrl + A : 커서 줄 처음으로

  • Ctrl + F : 커서 줄 끝으로

  • Ctrl + D : 커서 위치 문자 삭제

  • Ctrl +  H : 커서 우측 이동커서 왼쪽 문자 삭제

 

 

 

2. HTML문서에 삽입해 웹 브라우저로 실행

 

  • 클라이언트 측 자스는 주로 HTML과 CSS 스타일을 제어해 대화형Interactive 웹 페이지를 만들 때 사용

  • 이 때 자스 프로그램은 HTML 문서 안에 삽입해 실행

  • 웹 페이지와 상호작용을 하지 않는 순수 자스 프로그램도 같은 방법으로 웹브라우저로 실행 가능

  • html 문서에 script 요소를 자식요소로 배치, 그 안에 자스 프로그램을 작성

  • script 요소는 html 문서의 위치와 개수에 제한은 없으나 위치는 일부 동작에 제한 있을 때도 있음

  • html 요소와 css 스타일 제어가 없는 순수 자스라면 script 요소는 head 요소의 자식 요소로 배치

  • 이유 : 자스 프로그램, HTML 문서의 분리를 위하여

 

예제 2-2 : html을 웹브라우저로 실행 후 콘솔에 실행 결과 확인
// factorial.js
function fact(n) {
	if( n<=1 ) return n;
	return n*fact(n-1);
}
for(var i=1; i<10; i++) {
	console.log(i + "! = " + fact(i));
}
<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<title>팩토리얼 계산</title>
</head>
<body>
	<script src="./factorial.js"></script>
</body>
</html>
// 콘솔 말고 <body> 요소 안에서 출력하기
document.write(i + "!=" + fact(i) + "<br />");

 

 

 

3. Node.js의 대화형 모드 (REPL)로 실행

 

  • 주로 서버 측 자스 실행 환경으로 사용

  • Node.js 위에서 동작하는 서버 애플리케이션을 작성하면 다양한 웹 서버 구축, PC에 설치해 자스 프로그램을 실행

  • 자스 실행 엔진으로 구글 크롬이 사용하는 V8이 탑재되 실행속도가 빠름

  • 맥 : 터미널에 node를 입력해 실행

  • 윈도 : 명령 프롬프트 (윈도 메뉴 우클릭 > 실행 > cmd 입력 후 확인)

  • 엔터를 입력해 실행하며 크롬 콘솔과 사용법이 비슷

  • 개행 문자를 입력하면 여러줄 모드로 변경되며 emacs와 유사 단축키 사용 가능

  • 여러줄 모드는 코드 작성이 끝나거나 Ctrl + C를 눌러 해제 가능

  • 편집기 모드 : .editor 입력

  • 종료   : .exit (윈도우, 리눅스, 맥), Ctrl + D (리눅스, 맥), Ctrl + C 연속 두 번 (윈도우, 리눅스, 맥)

 

터미널에서 실행 (맥)

 

 

Node.js로 파일 읽어들여 실행

 

  • 이 방법은 큰 규모 프로그램도 텍스트 편집기로 작성하거나 편집 후 실행시킬 수 있어 편리

  • Node.js의 대화형 모드에서 나온 후 터미널에 cd js_study 입력 (윈도는 cmd) 

  • 현 디렉터리 표시 : pwd (맥), cd(윈도)

  • 디렉터리 안 파일 목록 표시 : ls(맥), dir(윈도)

  • ls *.js는 js 확장자 파일을 보이라는 뜻

  • node 파일 실행 : node 파일명.js + 엔터

 

중간에 오류는 js파일이 없어서 없다고 나옴.(내가 안넣어놔서)

 

 

 

 

4. 프로그램 작성법


1. 문자 코드

 

  • 자스 프로그램은 유니코드 문자로 작성

  • 유니코드 : 알파벳, 숫자, 기호, 세계 각국의 문자를 포함한 문자 체계

  • ECMAScript5 사양은 자스 엔진이 유니코드버전 3 이상 지원을 명시

  • ECMAScript6 사양은 자스 엔진이 유니코드버전 5.1.0 이상 지원을 명시

 

 

2. 대문자, 소문자

 

  • 자스 프로그램은 알파벳 대소문자를 구별하여 각각 다른 문자열로 처리, 오류가 날 수 있음

 

 

3. 토큰과 공백 문자

 

토큰

 

  • 토큰 (어휘) : 프로그램을 구성하는 최소 단위. 

  • 사람의 언어에서는 각각의 단어, 마침표 등이 토큰이며 더 나누면 단순나열이며 의미부여가 불가해짐.

    -> 의미를 가지는 최소한의 문자 덩어리

  • 어휘 분석 : 자바스크립트 인터프리터가 프로그램을 실행하기에 앞서 프로그램을 토큰으로 분해하는 것

  • 구문 분석 (파싱) : 어휘 분석 후 토큰을 한줄로 나열하고 자스의 구문 규약에 맞는 올바른 프로그램인지 판정

  • 인터프리터에 따라 어휘분석과 구문분석을 같이 실행하기도 함

  • 구문 분석 (파싱) 결과 프로그램에 문제가 없으면 프로그램을 실행

 

공백 문자

 

  • 토큰과 토큰 사이에 공백 문자를 입력해서 구분

  • 공백 문자는 여러개 입력되도 하나로 간주

  • 프로그래밍 언어별 공백문자 정의의 기준은 다름

  • ECMAScript5에서는 스페이스(\u0020), 탭(\u0009), 수직 탭(\u000B), 폼 피드(\u000C), 줄바꿈 없는 공백(\u00A0), 바이트 순서 표시 제어문자(uFEFF), 기타 유니코드 카테고리 Zs에 포함되는 모든 문자를 공백문자로 정의

  • HTML, CSS에서는 일본어 전각 스페이스를 공백 문자로 취급하지 않음

  • 산술 연산자 앞뒤의 공백 문자, 괄호 앞뒤의 공백 문자, 세미콜론, 쉼표, 콜론, 마침표 앞뒤의 공백문자는 생략 가능

  • 적정한 공백 문자는 가독성을 높이며 보통 개발 집단의 의견에 따라 개발하게 됨

  • 대부분의 IDE에서는 개행문자를 입력하면 자동 들여쓰기 처리도 해줌

 

 

4. 문장

 

  • 토큰을 나열해 문장을 만들고 문장을 이용해 컴퓨터에 명령을 내리게 됨

  • 자스 문장은 세미콜론으로 끝남

  • 복합문(블록문) : 문장 여러개를 중괄호로 감싼 코드로 이 끝에는 세미콜론을 붙이지 않음

  • 복합문은 일반적으로 if문이나 while문의 제어구문에 사용

  • 빈문장 : 세미콜론으로 작성(;)하며 인터프리터가 아무 작업을 하지 않으나 필요한 상황이 있음

  • 세미콜론이 붙어 있지 않은 문장에 개행 문자를 삽입하면 세미콜론이 상황에 따라 자동 추가되거나 안되기에 오류의 원인이 될 수 있음

 

var x; //변수 선언
message = "sdfsds" + name; // 표현식 대입
counter++; // 변수 값 증가
prompt("take your note"); // 함수 호출

 

 

 

5. 주석

 

  • 소스코드에 삽입하는 설명문으로 나와 다른 사람이 프로그램을 쉽게 이해하는 것을 도움

  • /* 주석 */은 코드의 토큰을 분할하지 않는 임의의 위치에 작성하며 여러줄 가능. 줄 중간에 삽입 가능

  • // 주석 은 각 줄 끝에 작성하며 토큰분리자로 작동.

  • 코멘트 아웃 : 주석은 코드 일부를 일시적으로 실행하지 않을 때에도 활용한다 >> 개발하면서 많이 쓸 내용

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

자바스크립트의 특징과 학습할 내용의 큰 그림을 그리는 단원으로 정말 기본부터 다루며, 자스는 웹브라우저에서 동작하는 프로그래밍 언어이며, 자스는 어떤 프로그래밍 언어인지 살펴봅니다. 앞으로 포스팅에선 '자바스크립트'를 '자스'나 'JS'로 줄이겠습니다.

 

 

 

 

1. 프로그래밍 언어로서의 자스
2. 자스의 역사

 

 

 

1. 프로그래밍 언어로서의 자스


 

프로그래밍 언어

  • 컴퓨터 프로그램을 작성하기 위한 언어
  • 소프트웨어의 동작(알고리즘)을 설명하기 위한 언어
  • 프로그래밍 언어로 프로그램을 개발하는 것 : 프로그래밍
  • 프로그래밍 언어로 작성한 프로그램 : (소스)코드
  • 사용 이유 : 컴퓨터는 기계어만 이해하는데 사람이 다루기 어려워 고수준 소프트웨어의 개발에 맞지 않아 프로그래밍 언어를 사용
  • 이에 따라 작성된 프로그램은 기계어로 번역되어 컴퓨터가 실행

 

컴파일

  • 소스코드를 실행하기 앞서 기계어로 번역하는 것

 

컴파일러

  • 컴파일을 수행하는 소프트웨어

 

컴파일 언어

  • 소스 코드 여러개를 하나로 묶어 컴파일 후 실행하는 프로그래밍 언어
  • C, C++, Java, Object C 등
  • 컴파일에 시간이 걸리나 실행되는 속도가 빠름

 

인터프리터 언어

  • 프로그램을 한줄마다 기계어로 번역해서 실행하는 프로그래밍 언어
  • Javascript, LISP, Perl, Ruby, Python
  • 장점 : 프로그램을 바로 실행할 수 있고 동작을 확인하며 프로그램 개발을 할 수 있다
  • 단점 : 한 줄 한 줄 기계어로 번역하며 실행해서 컴파일언어보다 처리 속도가 느리다

 

인터프리터

  • 프로그램을 번역해 실행시키는 소프트웨어

 

프로그램을 만들어 가는 방식에 따른 프로그래밍 언어의 분류

  • 절차적 언어 : 절차를 순서대로 작성해 나감
  • 객체 지향 언어 : 처리과 관련된 데이터와 절차를 하나로 묶어 객체 단위로 관리
  • 함수형 언어 : 프로그램을 함수로 조합하여 구현해 나감
  • 논리형 언어 : 데이터 사이의 관계와 논리를 설명해 나감
  • 자바스크립트 : 함수형 언어의 특징을 가진 객체지향 언어

 

 

2. 자바스크립트의 특징


강력하고 유연한 알고리즘 표현 능력을 갖춘 프로그래밍 언어인 자바스크립트 특징은 아래와 같으며 함수가 일급 객체인 점, 클로저를 이용할 수 있다는 점, 동적 프로토타입 기반의 객체지향언어 라는 점이 자스를 다른 언어보다 더 강력한 프로그래밍 언어로 만들었다.

 

1. 인터프리터 언어

  • 대부분의 웹브라우저에 실행시간에 자바스크립트 코드를 컴파일하는 JIT (Just In Time Complier) 컴파일러가 내장되어 실행 속도가 빨라짐
  • 이는 자바스크립트를 활용한 고기능 웹 애플리케이션을 구현할 수 있게 해줌

 

2. 동적 프로토타입 기반 객체 지향 언어

  • 클래스가 아닌 프로토타입을 상속하는, 프로토타입 기반 객체 지향 언어
  • 객체 생성 뒤에도 프로퍼티와 메서드를 동적으로 추가, 삭제 가능

 

3. 동적 타입 언어

  • 프로그램을 실행하는 도중에 변수에 저장되는 데이터 타입이 동적으로 바뀔 수 있다.
  • 그래서 변수 타입이 없다
  • 실행 전에 변수 타입이 결정되는 정적 타입 언어랑 다르다

 

4. 함수가 일급 객체

  • 자스의 함수는 객체이며 함수에 함수를 인수로 넘길 수 있다 = 일급 객체 (First class object)
  • 이 특성을 활용하면 고차 함수를 구현할 수 있어 함수형 프로그래밍이 가능해짐

 

5. 함수가 클로저를 정의

  • 자바스크립트의 함수는 클로저를 정의한다
  • 클로저로 변수를 은닉하거나 영속성 보장 등 다양한 기능을 구현

 

 

3. 자바스크립트의 기술적 요소

 

1.  ECMAScript (코어 언어)


  • 자스의 핵심기술은 ECMAScript로 규정
  • ECMAScript : Ecma International 이라는 조직의 TC-39위원회가 표준화 작업을 하고 있고 ECMA-262 라는 문서로 공개하고 있다
  • 최신 버전은 ECMAScript8 (2017) 
  • 자스를 배울 때 코어 언어의 내용부터 제대로 이해해야 한다.

 

2. 클라이언트 측의 고유한 기술 요소


  • 웹 브라우저에서 동작하는 자바스크립트 : 클라이언트 측 자바스크립트
  • ECMAScript가 규정한 코어 언어와 웹 브라우저의 API (Application Program Interface)로 구성

 

웹 브라우저의 주요 API

  • Window 인터페이스 : 자스로 브라우저나 창을 조작하는 기능 제공
  • DOM : 자스로 HTML 문서 요소를 제어하는 기능 제공
  • XMLHttpRequest : 서버와 비동기로 통신하는 기능 제공

 

HTML5에서 규정한 다양한 API

  • Drag and Drop : HTML 요소나 파일을 드래그해서 다른 요소에 드롭할 때 데이터를 전달
  • Blob  : 이진 데이터를 다루는 기능
  • File : 로컬 파일 시스템을 읽고 쓰는 기능 제공
  • Web Workers : 여러 프로그램을 멀티스레드로 병렬 처리하는 기능 제공
  • Web Storage : 저장 기간에 제한이 없는 대용량데이터를 로컬에 저장하는 기능 제공
  • Indexed Database : 로컬에 key-value 타입의  관계형 데이터베이스 기능 제공
  • WebSockets : 서버와의 양방향 통신 기능 제공
  • Geolocation : GPS 등의 위치 정보 핸들 기능 제공
  • Canvas : 2, 3차원 그래픽스 기능 제공

 

 

3. 서버 측 자바스크립트의 고유한 기술 요소


  • 웹 서버에서 동작하는 자바스크립트 : 서버 측 자바스크립트
  • 웹 서버 구현에는 펄, PHP, 파이썬, 루비, 자스 등의 프로그래밍 언어가 사용

 

서버 측 자바스크립트 실행 환경의 구현체

  • Node.js : 구글이 개발한 자스 실행 환경. 웹 애플리케이션 제작에 자주 사용
  • Rhino : 오픈 소스로 개발되어 Mozilla가 관리하고 있는 자스 실행 환경
  • Aptana Jaxer : Aptana 사가 개발, 현재 오픈 소스로 개발되고 있음

 

 

4. ECMAScript 6


  • 2015.06에 권고된 새로운 ECMAScript 버전
  • ECMAScript 2015 라고도 부름
  • 이전 자스 버전과의 호환성을 보장하면서 다른 프로그래밍 언어가 제공하는 다양한 기능을 추가
  • 이전 버전은 ECMAScript5 (2009)
  • 이터레이터와 제너레이터는 새로운 프로그래밍 패러다임을 제시해줌

 


새롭게 제공되는 주요 기능

http://kangax.github.io/compat-table/es6/

  • ECMAScript 2016도 발표되었으며 거듭제곱연산자, Array.prototype.includes() 가 추가됨
  • ECMAScript 2017도 사양 지정 작업 진행중
  • SIMD(Single Instruction /Multiple Data) 로 데이터 수준의 병렬 연산 지원, Async Function으로 비동기처리작성지원, Decorators로 클래스에 기능 더하기, 객체의 잔여 프로퍼티를 새 객체에 할당하는 Rest Properties 등을 도입할까 한다함

 

 

 

2. 자바스크립트의 역사


탄생

  • 1995 넷스케이프 커뮤니케이션스의 Brendan Eich가 개발
  • Netscape Navigator 2.0에 구현
  • 1996 마이크로소프트사의 인터넷익스플로러 3.0에 탑재되었고 Java 애플릿으로 구현된 웹 브라우저의 보급과 맞물려 보급
  • 초창기 익스플로러와 넷스케이프 네비게이터가 자스에 독자적 기능을 추가해 브라우저 간 호환성이 낮았음
  • 1997 ECMAScript 표준화 진행, 각 브라우저는 본 사양을 따르도록 권고
  • 구형 브라우저 제외 호환성 문제가 많이 잡힘 

 

자스의 오명

  • 오해 : 웹브라우저용 하급 스크립트 언어이며 본격적인 프로그래밍 언어라는 것은 오해
  • 이유 : 본래의 언어 사양을 해설한 문서가 없었고 당시 웹브라우저의 기능과 처리 속도가 느렸기 때문
  • 결과 : 웹페이지를 꾸미기 위해 간단하게 사용
  • 변화 : 자스로 만든 구글 지도 등의 애플리케이션이 등장하면서 인식의 전환이 시작
  • 구글 지도는 비동기 통신 기술 Ajax을 이용해 데스크톱 애플리케이션과 비교해도 손색없는 기능, 조작성을 실현
  • 즉 자바스크립트는 스크립트 언어가 아닌 고성능의 웹 애플리케이션을 만들 수 있는 객체 지향 언어
  • 2008년부터 HTML5 사양이 정해졌고 자스로 웹 애플리케이션을 만들 수 있는 다양한 API 가 등장
  • 웹 브라우저 성능이 향상되며 대중적인 언어로 자리함

 

현재 / 미래

  • 구글의 자바스크립트 엔진 V8 등은 강력하며 웹 브라우저 자체 기능이 좋아짐
  • 웹 브라우저는 개발자에게 일종의 OS 같은 환경을 제공
  • 웹 브라우저 위에서 동작하는 자스로 본격적인 웹 애플리케이션을 제작 가능
  • 서버 측에도 Node.js가 보급되어 널리 퍼지는 중
  • 곧 ECMAScript6의 기능을 이용한 강력한 모던 웹 애플리케이션이 많이 나올 것으로 기대 (과거 기준의 책이라 많이 나오는 중)

 

 

 

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

기본 문법부터 ES6, 정규표현식, 객체지향 및 함수형 프로그래밍, HTTP, MVC, API활용까지 다양한 예제로 배운다! 
이 책의 포지션은 프로그래밍 언어를 처음 배운다 가정하고 기초부터 설명하며 ES5 ES6 모두를 다룹니다. 

 

 

모던 자바스크립트 입문 (이소 히로시) / 길벗
: 프런트엔드부터 벡엔드까지, 핵심은 자바스크립트다!

 

 

 

 

 

 

 

자바스크립트로 할 수 있는 것


  • 대화형 웹 페이지를 동적으로 구성 가능
  • 각 OS에서 구동 가능한 웹 애플리케이션 구현 가능
  • iOS와 AndroidOS에서 단독 실행 가능한 하이브리드 애플리케이션 제작 가능
  • 서버 측 자바스크립트 실행 환경으로 Node.js를 사용하여 개발 가능.
    Node.js는 처리 시간이 짧으나 접속량이 많은 실시간 네트워크 프로그래밍에 적합 
  • IoT(Internet Of Things), 사물인터넷의 제어 프로그램을 만들 수 있다.
    • Node.js 서버로 사물을 제어하는 micom 에 신호를 보내 간접제어 
    • 라즈베리파이 등의 소형 원보드 PC 위에 Node.js 를 가동하여 직접제어
  • 윈도우용 네이티브 애플리케이션 개발 가능
  • 크롬, 파이퍼폭스의 확장 기능 제작 가능
  • 자스는 ECMA에서 표준 사양을 만들고 있으므로 웹 표준 기술로 입지가 탄탄 
  • 소프트웨어용 매크로 프로그램 제작 가능
  • 맥OS에서는 OS를 자바스크립트로 조작 가능(JXA, Javascript for Automation)

 

 

기타 내용


  • 주석은 // 다음에 적으면 됩니다.
  • 파일 이름 뒤에 붙는 파일 형식인 확장자 중...
    • js 확장자 파일은 웹 브라우저의 콘솔 창과 Node.js에서 동작합니다.
    • html 확장자 파일은 웹 브라우저에서 실행할 수 있습니다.
  • 일부 로컬에서 동작하지 않는 html파일은 서버에 올리거나, IDE에 내장된  실시간 미리보기를 활용합니다.
  • 크롬 웹브라우저에서는 마우스우클릭> 검사> 콘솔을 클릭하면 대화형 콘솔이 나옵니다. 여기에 js파일의 내용을 붙여 실행해 보세요.

 

 

예제 소스


  • 깃헙이나 파일 둘 중에 하나만 받으시면 됩니다.

 

 

006960-master.zip
1.01MB

https://github.com/gilbutITbook/006960

 

gilbutITbook/006960

Contribute to gilbutITbook/006960 development by creating an account on GitHub.

github.com

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90
액티브X 위에 모달, div 등 html 요소 보이기

 

 

문제


  • 액티브X를 이용해야하는 object 태그 위에 div 요소들이 올라가면 (드롭다운 메뉴, 모달 팝업 등)

  • object를 hide하지 않는 이상 html element들이 가려진다.

  • $("object").hide(); 등의 방법 말고 이미지는 보이면서 레이어링 할 수 없을까?
    --> 그때그때마다 보이려면 동적 화면 캡쳐가 필요하다.

 

 

 

시도한 방법


  • jquery.blockUI.js 를 사용해서 block, unblock으로 액티브X(object)를 가린다

  • object의 wmode를 wrap('div'), unwrap()으로 감싸 transparent나 opaque로 변경한다.

    --> 두 방법 다 요소 자체를 hide 하는거랑 똑같은 효과


  • 액티브X는 z-index가 최상위라서 그 위에 레이어드 하려면 iframe을 써야 한다

    --> 어쩔 수 없을 때만 쓰려고 보류했으나 가장 확실한 방법이라고는 한다.


  • 어차피 요소를 hide 하고 이벤트도 필요없다 -> 숨긴 뒤 현재 화면의 스크린샷으로 대체하면 어떨까

  • 미니 프로젝트를 만들어서 html2canvas 를 사용해본 뒤 본 플젝에 대입

 

 

 

 

 

html2canvas - Screenshots with JavaScript

Try out html2canvas Test out html2canvas by rendering the viewport from the current page. Capture

html2canvas.hertzen.com

 

 

<!DOCTYPE html>
<html lang="ko">
	<head>
		<script src="html2canvas.js"></script>
	</head>
	<body>
		<button onclick="bodyShot()">bodyShot</button> 
		<button onclick="partShot()">partShot</button> 
		
		<div class="container" id='container'> 
			<!-- 로컬에서 불러온 파일    --> 
			 <img src="test.jpg">
	<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
			<!-- 웹에서 불러온 파일 --> 
			<!-- <img src="https://www.w3schools.com/html/img_girl.jpg"> --> 
			<!--   이미지 캡쳐문제 base 64로 변환 ? --> 
		</div> 

		<!-- 결과화면 --> 
		<canvas id="canvas" width="900" height="600" style="border:1px solid #d3d3d3;"></canvas>

	<script>
	    if (typeof Promise !== "function") {
			document.write('<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.5/bluebird.min.js"><\/script>');
		}
	function bodyShot() { 
	//전체 스크린 샷  
		html2canvas(document.body).then( function (canvas) { 
	
	//canvas 결과값을 drawImg 함수를 통해서 png의 결과 값 
	// 캡쳐
		drawImg(canvas.toDataURL('image/png')); 

	//appendchild 부분을 주석을 풀게 되면 body 
		//document.body.appendChild(canvas); 

	//특별부록 파일 저장하기 위한 부분. 
		saveAs(canvas.toDataURL(), 'file-name.png'); 
	
	}).catch(function (err) { console.log(err); }); 
	} 

	function partShot() { 
	//특정부분 스크린샷 	
		html2canvas(document.getElementById("container")).then(function (canvas) { 
		//jpg 결과값 
		drawImg(canvas.toDataURL('image/jpg')); 
		
		//이미지 저장 
		saveAs(canvas.toDataURL(), 'file-name.jpg'); 
		}).catch(function (err) { console.log(err); }); 
	} 

	function drawImg(imgData) { 
		//console.log(imgData); 
	
		return new Promise(
		
			function reslove() { 
			//내가 결과 값을 그릴 canvas 부분 설정 
	
			var canvas = document.getElementById('canvas'); 
			var ctx = canvas.getContext('2d'); //canvas의 뿌려진 부분 초기화 
			ctx.clearRect(0, 0, canvas.width, canvas.height); 

			var imageObj = new Image(); 
			imageObj.onload = function () { 
			ctx.drawImage(imageObj, 10, 10); //canvas img를 그리겠다. 
			}; 
		imageObj.src = imgData; //그릴 image데이터를 넣어준다. 
		}, 
	
	function reject() { }); 
	} 
	
	function saveAs(uri, filename) { 
		var link = document.createElement('a'); 
	
		if (typeof link.download === 'string') { 
			link.href = uri; link.download = filename; 
			document.body.appendChild(link); link.click(); 
			document.body.removeChild(link); } 
		else { 
		window.open(uri); 
		} 
	}
 
	</script>

</body> 
</html>

 

 

 

 

 

 

중도의 문제 


  • promise는 es5에서 안돌아간다 -> 라이브러리 사용

if (typeof Promise !== "function") {
	document.write('<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.5/bluebird.min.js"><\/script>');
}

 

  • 로컬이미지는 캡쳐되나 웹에서 불러온 이미지는 캡쳐되지 않는다 -- 이미지가 렌더링되지 않는 이유

    • html2canvas는 브라우저에서 설정 한 콘텐츠 정책 제한을 피할 수 없습니다. 현재 페이지의 원점 밖에있는 이미지를 그리면 이미지 가 그려지는 캔버스 손상됩니다. 캔버스가 더러워지면 더 이상 읽을 수 없습니다. 따라서 html2canvas는 이미지를 적용하기 전에 이미지가 캔버스를 더럽힐 지 여부를 확인하는 메소드를 구현합니다. allowTaint 옵션 false로 설정하면 이미지가 그려지지 않습니다.

    • 원본 페이지 외부에있는 이미지를 로드하려는 경우 프록시 를 사용하여 이미지를 로드 할 수 있습니다 .

  • 프록시를 사용할 경우 node.js 사용이 필요하다 

 

 

 

참고하면 좋을 링크


 

베스트 캡쳐 자바스크립트 플로그인 12개
 

12 Best Screen Capture Javascript Plugins and Tutorials - Digital Design Journal

Over the years, there has been a tremendous increase in the use of screen capture tools. For most mo

www.digitaldesignjournal.com

 

페이지 외부에 있는 이미지를 로드하려는 경우 프록시 사용
 

niklasvh/html2canvas-proxy-nodejs

Express middleware proxy for html2canvas. Contribute to niklasvh/html2canvas-proxy-nodejs development by creating an account on GitHub.

github.com

 

html2canvas Download
 

html2canvas - Screenshots with JavaScript

Try out html2canvas Test out html2canvas by rendering the viewport from the current page. Capture

html2canvas.hertzen.com

 

jQuery BlockUI Plugin Download
 

jQuery BlockUI Plugin

Overview The jQuery BlockUI Plugin lets you simulate synchronous behavior when using AJAX, without locking the browser[1]. When activated, it will prevent user activity with the page (or part of the page) until it is deactivated. BlockUI adds elements to t

jquery.malsup.com

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90
html 특수기호 정리

 

 

자주 찾는 특수기호


&nbsp;
공백(스페이스 한 칸)
 
&lt;
부등호(<)
 
&gt;
부등호(>)
 
&amp;
앰퍼샌드(&) 
 
&quot;
쌍따옴표(“)
 
&#035;
sharp(#)
 
&#039;
따옴표(‘)

&quest;
&#x0003F;
&#63;
물음표(?)

&excl;
&#x00021;
&#33;
느낌표(!)

 

 

 

 

웹페이지에서 찾기


 

https://dev.w3.org/html5/html-author/charref

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90
XSLT에 대해 잘 정리해두신 블로그글을 보고 공부겸 정리해보았습니다. 출처는 글 하단에 있습니다.

 

 

XSLT : eXtensible Stylesheet Language Transformations  // 하나 이상의 template으로 구성된 집합체

뜻 :  XML에 기반한 Stylesheet 언어,  XML을 위한 스타일 언어<->CSS는 HTML을 위한 스타일 언어

XSL : Style Sheets for XML. XSL은 이 데이터를 사용자에게 어떻게 보이게(Display) 할지 결정
XML : 데이터를 저장하기 위한 구조를 정의하는 문서 

만든 곳 : W3C

 

XSL의 종류 : XSLT, Xpath, XSL-FO, Xquery

  • XSLT - a language for transforming XML documents
    (XML을 XML, HTML, XHTML, Result-tree 등 다른 구조의 문서로 변환시키기 위한 언어, XSL의 핵심)

  • XPath - a language for navigating in XML documents
    (XML의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어)

  • XSL-FO - a language for formatting XML documents (discontinued in 2013)
    (XML데이터를 출력하기 위한 목적으로 설계된 언어(현재는 CSS3로 대체하여 사용))

  • XQuery - a language for querying XML documents(XML문서의 쿼리를 위한 언어)

 

작용 :  XML 문서를 다른 XML 문서나 브라우저가 인식하는 다른 타입의 문서(HTML, XHTML 등)로 변환,
요소 및 특성을 결과에 추가, 제거, 재정렬, 플랫폼테스트, 그리고 요소 숨김 등

브라우저 :  최근 브라우저들은 XSLT와 XPath를 지원

주의점 : xml과 xsl 둘다 맨 윗줄에 선언부 필요 (주석이 들어가면 실행안됨)

변환 규칙 :  <template>요소를 이용해 표현. 문서를 변환하기 위한 명령어와 내용이 포함
template 사용 시 변환 규칙을 적용할 XML 요소를 찾기 위해 XPath 속성에 해당하는 match 속성을 사용

변환 과정 : XSL 문서와 XML 문서(Source tree)가 XSLT 프로세서에 의해 합쳐지고, XSLT 프로세서는 다른 구조의 XML 문서(Result tree)로 변환

장점 : 독립적인 프로그래밍, 수정이 빠름

이유 : XML을 변경할 필요가 없이 xsl 파일만을 변경해 Output을 변경 가능

 

사용 방법 :

  • xml 선언
 <?xml version="1.0"?>
  • 문서를 XSL 스타일 시트로 선언하는 ROOT 요소 
<xsl:stylesheet> 또는 <xsl:transform>
  • XSLT 네임스페이스를 선언 : XSLT 요소, 속성에 접근
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  • XML문서를 XHTML로 변환 : XSL에 아래 XML 링크를 추가
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl" ?>

 

 

<xsl:template> 요소

순서 : XSLT 프로세서가 XSLT 문서에서 가장 먼저 찾는 요소

역할 : XML 문서의 어느 부분(특정 node)을 어떻게 변환할 것인지 결정 (입력문서의 전체/일부인지, 출력 문서의 어디에 삽입되어야 하는 지)

속성 : match, name, priority, mode

  • match 속성 - XML 문서의 위치를 지정하기 위해 XPath 표현식을 사용
    템플릿 규칙을 입력하기 위해 반드시 문서의 root(/)를 지정

    • <xsl:template match="/”> //XML문서 루트( = XML 문서 전체)와 매치

    • <xsl:template match=”/student”> //XML문서 루트의 자식 요소인 요소와 매치합니다.

<xsl:template match="/*">
//문서의 가장 바깥쪽 요소만 일치하고 컨텍스트를 해당 요소로 설정
<xsl:template match="*">
//어디서나 모든 요소와 일치하고 컨텍스트노드를 해당 요소로 설정
<xsl:template match="/">
//문서 루트 자체와만 일치하고 컨텍스트로 설정
<A />
// 첫 번째 규칙 (일치하는 /*)이 일치하고 컨텍스트 노드는 A입니다.
// 세 번째 규칙 (일치하는 /)도 일치하지만 컨텍스트 노드 A의 하위 항목이 됩니다.

 

  • name 속성 - 템플릿에 이름을 지정하는 속성. 이 속성을 사용한 템플릿은 요소로 호출 가능

  • priority 속성 - 적용 가능한 템플릿이 여러 개 정의됐을 때 우선순위를 지정하는 속성. 값이 클수록 우선순위가 높음

  • mode 속성 - XML 에서 동일한 부분에 적용할 템플릿이 여러 개일 때 원하는 템플릿만 호출
    소스 트리의 동일한 부분을 여러 번 처리해야 할 경우에도 사용

 

 

<xsl:apply-template> 요소

XSLT에서 template 자식요소는 자동으로 처리되지 않아 자식 요소를 처리하려면 요소를 정의해야 함

  • 기본 템플릿인 <xsl:apply-templates/> 만 정의하는 경우 :
    XML 문서에서 현재 요소의 모든 자식요소에 대해 매치되는 template을 찾아서 적용
    노드탐색방법은 DFS(Depth Fisrt Search)을 사용 

  • <xsl:apply-templates select="???"/>처럼 select 속성을 이용하는 경우 :
    특정 자식 요소만 선택되거나 자식 요소가 아닌 다른 요소가 선택 

 

 

<xsl:value-of> 요소

역할: 선택된 노드의 값 추출

 

 

<xsl:for-each> 요소

역할 : 지정된 노드 집합의 선택된 모든 XML 요소를 반복

select 속성 :  XML 파일의 출력을 filtering 가능 (필터링 연산자 : =, !=, &lt, &gt)

<xsl:for-each select = “catalog/cd[artist = ‘Bob Dylan’]”>

 

 

 

<xsl:sort> 요소

역할 : 출력 정렬

사용 : xsl:for-each요소 내에 xsl:sort요소를 추가

문법 : 

select = string-expression 
// 노드를 정렬하기 위해 기준이 되는 키(key) : 어떤 XML 요소를 정렬할 것인지를 선택

lang = { nmtoken } 
// 정렬 순서를 결정하는데 사용되는 영문자

data-type = { “text” | “number” | qname-but-not-ncname } 
// 텍스트의 타입

order = { “ascending” | “descending” } 
// 정렬 순서 기본 설정은 오름차순(ascending)

case-order = { “upper-first” | “lower-first” } /> 
// 대소문자에 의한 문자열의 정렬 순서. 기본 설정은 upper-first ( A, a, B, b, C, c 의 순 )

 

 

<xsl:if> 요소

역할 : XML파일 내용에 대해 test라는 조건을 수행

<xsl:if test="price &gt; 10">  

 

 

<xsl:choose>요소

<xsl:when>  <xsl:otherwise>와 함께 사용되어 여러 조건을 나타내며 if문과 else처럼 사용

 

 

클라이언트에서 XSLT

XSLT는 브라우저 안에서 문서를 XHTML로 바꿀수도 있고, 이제까지 XSL style sheet를 XML 파일에 추가하고 브라우저가 변환을 수행하도록 했는데 XML 파일에 XSL 링크를 포함시키는 건 크롬 등 XSLT가 먹히지 않는 브라우저도 있기 때문에 추천하지 않음.

따로 XAMPP라는 걸 이용해야 되며 보안때문에 그렇다고 하는데 아마도 대부분은 서버에서 변환하고 주기 때문

좀 더 좋은 해결책은 JavaScript를 사용하여 변환을 수행하는 것이며 JavaScript를 사용하면 브라우저 별 테스트 수행, 브라우저와 사용자 요구에 따라 다른 스타일 시트 사용이 가능

목표 : XSLT의 목표 중 하나는 데이터를 한 형식에서 다른 형식으로 변환하여 다양한 브라우저와 사용자 요구 사항들을 지원하는 것

 

더보기

자바스크립트와 XSLT를 이용하여 XHTML로 변환

<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc(filename)
{
if (window.ActiveXObject)
{
xhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
else
{
xhttp = new XMLHttpRequest();
}
xhttp.open("GET", filename, false);
try {xhttp.responseType = "msxml-document"} catch(err) {} // Helping IE11
xhttp.send("");
return xhttp.responseXML;
}
function displayResult()
{
//XML과 XSL을 로드한다.
xml = loadXMLDoc("cdcatalog.xml");
xsl = loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
{
//XSL을 XML에 적용시킨다.
ex = xml.transformNode(xsl);
//스타일이 적용된 XML을 ID가 example인 최근 문서에 적용한다.
document.getElementById("example").innerHTML = ex;
}
// code for Chrome, Firefox, Opera, etc.
else  if (document.implementation && document.implementation.createDocument)
{
//객체를 생성해서 XSLT를 import한다.
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml, document);
document.getElementById("example").appendChild(resultDocument);
}
}
</script>
</head>
<body onload="displayResult()">
<div id="example" />
</body>
</html>

 

 

서버에서 XSLT

모든 종류의 브라우저에서 XML 데이터를 사용할 수 있도록
server에서 XML 문서를 변환하여 XHTML로 브라우저로 재전송

  • 전의 설명에서는 변환을 위해 JavaScript와 XML Parser를 사용했지만 XML parser가 없는 브라우저에서는 작동하지 않음. 모든 종류의 브라우저에서 XML 데이터를 사용할 수 있도록 하기 위해 서버에서 XML 문서를 XHTML로 변환하고 작업이 끝난 그 파일을 브라우저로 보내면 가능

  • 브라우저에서 했던 작업과 마찬가지로 데이터를 서버에서 어떠한 형식을 다른 형식으로 변환하여 다양한 브라우저와 사용자 요구 사항들을 지원하는 것이 목표 

  • XML 파일에는 XSL 파일에 대한 참조가 없으므로 XML 파일은 다양한 XSL style sheet를 사용하여 변환될 수 있음 

 

XML 데이터를 이용한 JSP 연동

JSTL(자바 표준태그 라이브러리) 중 xml태그를 이용하여 XML을 JSP 와 연동

<%-- JSTL을 사용하기 위한 태그 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

 

 

 

 출처
 

XSLT란 무엇일까?

XSL.md XSLT(eXtensible Stylesheet Language Transformations) W3C는 XML에 기반한 Stylesheet 언어가 필요해서 XSL이라는 것을 만들었습니다. CSS가 HTML을 위한 스타일 언어라면, XSL은 XML을 위한 스타일 언어..

qssdev.tistory.com

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

classList 메소드

Javascript 2020. 3. 25. 15:25
728x90
728x90
jQuery의 addClass, removeClass, hasClass, toggleClass와 동일하게 적용되는 함수 add, remove, contains, toggle

 

Element.classList는 엘리먼트의 클래스 속성의 컬렉션인 활성 DOMTokenList를 반환하는 읽기 전용 프로퍼티입니다. classList 사용은 공백으로 구분된 문자열인 element.className을 통해 엘리먼트의 클래스 목록에 접근하는 방식을 대체하는 간편한 방법입니다.

 

$( '#element' ).addClass( 'someclass' );
$( '#element' ).addClass( 'someclass1 someclass2' );
$( '#element' ).removeClass( 'someclass' );
$( '#element' ).removeClass( 'someclass1 someclass2' );
$( '#element' ).hasClass( 'someclass' );
$( '#element' ).hasClass( 'someclass1 someclass2' );
$( '#element' ).toggleClass( 'someclass' );
var element = document.getElementById( 'element' );

element.classList.add( 'someclass' );
element.classList.add( 'someclass1', 'someclass2' );
element.classList.remove( 'someclass' );
element.classList.remove( 'someclass1', 'someclass2' );
element.classList.contains( 'someclass' );
element.classList.contains( 'someclass1', 'someclass2' );
element.classList.toggle( 'someclass' );

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v