JS에선 객체 또한 하나의 변수처럼 취급할 수 있다고 이해했다.


그런 이유로 배열을 생성하고 값을 집어넣을 때


객체를 넣을 수 있다는 말이다.


그리고 여지껏 값을 직접 입력했는데 생성자를 통해서 값을 설정 할 수 있다.


new 키워드를 사용한다.


예제를 통해 배열에 어떻게 집어넣는지 생성자를 어떻게 쓰는지 확인해보자


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	.area{
		height: 250px; 
		border: 1px solid black;
		background: lightgray;
	}
</style>
</head>
<body>
	<h1>객체 배열</h1>
	<h3>객체와 배열을 사용한 데이터 관리</h3>
	<button onclick="test1();">실행확인</button>
	<div id="area1" class="area"></div>
	
	<script type="text/javascript">
		function test1() {
			var student0 = {
					name:'이르음',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student1 = {
					name:'이르음1',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student2 = {
					name:'이르음2',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student3 = {
					name:'이르음3',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student4 = {
					name:'이르음4',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student5 = {
					name:'이르음5',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student6 = {
					name:'이르음6',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student7 = {
					name:'이르음7',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student8 = {
					name:'이르음8',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			var student9 = {
					name:'이르음9',
					java:Math.floor(Math.random() * 100) + 1,
					oracle:Math.floor(Math.random() * 100) + 1,
					HTML5:Math.floor(Math.random() * 100) + 1,
					CSS3:Math.floor(Math.random() * 100) + 1,
					javaScript:Math.floor(Math.random() * 100) + 1
			}
			
			
			// 배열 선언
			var students = [];

			students.push(student0);
			students.push(student1);
			students.push(student2);
			students.push(student3);
			students.push(student4);
			students.push(student5);
			students.push(student6);
			students.push(student7);
			students.push(student8);
			students.push(student9);
			
			console.log(students);
			
			// 각 객체별 메소드 추가
			for(var i = 0; i < students.length; i++){
				students[i].getSum = function() {
					return this.java + this.oracle + this.HTML5 + this.CSS3 + this.javaScript;
				}
				
				students[i].getAvg = function() {
					return students[i].getSum() / 5;
				}
			}
			
			// 모든 학생의 정보가 담긴 배열의 메소드를 통해 총점과 평균 출력
			for(var i in students){
				with(students[i]){
					document.getElementById("area1").innerHTML += "이름 : " + name + ", 총점 : " + getSum() + ", 평균 : " + getAvg() + "<br>";
				}
			}
		}
	</script>
	
	<hr>
	
	<h3>생성자 함수</h3>
	<p>new 키워드를 사용해서 객체를 생성할 수 있는 함수를 의미한다.</p>
	<button onclick="test2();">실행 확인</button>
	<div id="area2" class="area"></div>
	
	<script type="text/javascript">
		function Student(name, java, oracle, html5, css3, javascript) {
			// 속성 정의
			this.name = name;
			this.java = java;
			this.oracle = oracle;
			this.html5 = html5;
			this.css3 = css3;
			this.javascript = javascript;
			
			// 메소드 정의
			this.getSum = function(){
				return this.java + this.oracle + this.html5 + this.css3 + this.javascript;
			}
			this.getAvg = function(){
				return this.getSum() / 5;
			}
			this.toString = function() {
				return "이름 : " + this.name + ", 총점 : " + this.getSum() + ", 평균 : " + this.getAvg() + "<br>";
			}
			
		}
	
		function test2(){
			var student = new Student(prompt('이름을 입력하세요.'),
					parseInt(prompt('자바 점수를 입력하세요.')),
					parseInt(prompt('오라클 점수를 입력하세요.')),
					parseInt(prompt('html5 점수를 입력하세요.')),
					parseInt(prompt('css3 점수를 입력하세요.')),
					parseInt(prompt('javascript 점수를 입력하세요.')))
			var area2 = document.getElementById("area2")
			
			area2.innerHTML += student;
			
		}
	</script>

	
</body>
</html>


JS도 역시 객체지향 언어이기 때문에 객체 기능을 지원한다.


선언 방법에는 다양한 방법이 존재하므로 예를 통해서 확인해보자.



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	.area-big{
		height: 400px;
		background: lightgray;
		border: 1px solid black;
	}
	.area{
		background: lightgray;
		height: 200px;
		border:1px solid black;
	}
</style>
</head>
<body>
	<h1>객체</h1>
	<h3>객체의 선언 및 호출</h3>
	<p>객체는 키 값을 사용하여 속성을 식별한다.<br>
	중괄호{}를 사용해서 객체를 생성하고, 속성에는 모든 자료형이 올 수 있다.</p>
	
	<button onclick="test1();">실행확인</button>
	<div id="area1" class="area-big"></div>
	
	<script type="text/javascript">
		function test1() {
			var product = {
				pName: 'Dry Mango',
				type: 'Pickle',
				ingredient:['mango', 'sugar'],
				origin: 'Pilippines'
			};
			
			console.log(product);
			
			var area1 = document.getElementById("area1");
			
			area1.innerHTML += "product : " + product + "<br>";
			
			area1.innerHTML += "<b>객체명.속성명으로 접근하기</b><br>";
			area1.innerHTML += "product.pName : " + product.pName + "<br>";
			area1.innerHTML += "product.type : " + product.type + "<br>";
			area1.innerHTML += "product.ingredient : " + product.ingredient + "<br>";
			area1.innerHTML += "product.ingredient[0] : " + product.ingredient[0] + "<br>";
			area1.innerHTML += "product.ingredient[1] : " + product.ingredient[1] + "<br>";
			area1.innerHTML += "product.origin : " + product.origin + "<br>";
			
			
			area1.innerHTML += "<b>객체명['속성명']으로 접근하기</b><br>";
			area1.innerHTML += "product['pName'] : " + product['pName'] + "<br>";
			area1.innerHTML += "product['type'] : " + product['type'] + "<br>";
			area1.innerHTML += "product['ingredient'] : " + product['ingredient'] + "<br>";
			area1.innerHTML += "product['ingredient'][0] : " + product['ingredient'][0] + "<br>";
			area1.innerHTML += "product['ingredient'][1] : " + product['ingredient'][1] + "<br>";
			area1.innerHTML += "product['origin'] : " + product['origin'] + "<br>";
			
			
		}
	</script>
	
	<hr>
	
	<h3>객체의 키 식별자 테스트</h3>
	<button onclick="test2();">실행확인</button>
	<div id="area2" class="area"></div>
	
	<script type="text/javascript">
		function test2() {
			var objTest = {
					'I love':'poo',
					'I hate !@#$%^%()':'asd'
			}
			
			var area2 = document.getElementById("area2");
			
			console.log(objTest);
			
			// 공백이나 특수문자가 key 값인 경우에는 이 방식으로 value를 가져올 수 없다.
/* 			area2.innerHTML += "I love : " + objTest.'I love' + "<br>";
			area2.innerHTML += "I hate !@#$%^%() : " + objTest.'I hate !@#$%^%()' + "<br>"; */
			
			area2.innerHTML += "I love : " + objTest['I love'] + "<br>";
			area2.innerHTML += "I hate !@#$%^%() : " + objTest['I hate !@#$%^%()'] + "<br>";
		}
	</script>
	
	<hr>
	
	<h3>객체의 메소드 속성</h3>
	<p>객체의 속성 중 함수 자료형인 속성을 메소드라고 부른다.</p>
	<button onclick="test3();">실행확인</button>
	<div id="area3" class="area"></div>
	
	<script type="text/javascript">
		function test3() {
			var area3 = document.getElementById("area3");
			
			var dog = {
					name: '까미',
					eat:function(food){
						// 객체 내에서 자신의 속성을 호출할 때는 반드시 this.을 사용해야 한다.
						area3.innerHTML += this.name + '가' + food + "을 먹고있네요~ 멍멍";
					}
			}
			
			dog.eat('밥');
		}
	</script>
	
	<hr>
	
	<h3>객체와 반복문</h3>
	<button onclick="test4();">실행확인</button>
	<p>객체의 속성을 살펴볼 때에는 단순 for문으로 사용이 불가능하고<br>
	for in 문을 사용해야 한다.</p>
	<div id="area4" class="area"></div>
	
	<script type="text/javascript">
		function test4() {
			var game = {
					title:'DIABLO 3',
					price:'35,000원',
					language:'한국어지원',
					supportOS:'window 32/64',
					service:true
			};
			
			var area4 = document.getElementById("area4");
			
			for(var key in game){
				area4.innerHTML += key + " : " + game[key] + "<br>";
			}
		}
	</script>
	
	<hr>
	
	<h3>in과 with 키워드</h3>
	<p>in : 객체 내부에 해당 속성이 있는지 확인하는 키워드<br>
	with : 코드를 줄여주는 키워드, 호출시 객체명 생략이 가능하다.</p>
	<label>이름 : </label>
	<input type="text" id="name"><br>
	<label>국어 : </label>
	<input type="text" id="kor"><br>
	<label>영어 : </label>
	<input type="text" id="eng"><br>
	<label>수학 : </label>
	<input type="text" id="math"><br>
	
	<button onclick="test5();">실행확인</button>
	<div id="area5" class="area-big"></div>
	<script type="text/javascript">
		function test5() {
			var name = document.getElementById("name").value;
			var kor = parseInt(document.getElementById("kor").value);
			var eng = parseInt(document.getElementById("eng").value);
			var math = parseInt(document.getElementById("math").value);
			
			var student = {
					name:name,
					kor:kor,
					eng:eng,
					math:math
			}
			
			var student2 = {
					name,
					kor,
					eng,
					math
					// 이와같이 key value 이름이 같으면 자동으로 넣어준다(최신버젼에서만 지원)
			}
			
			console.log(student);
			console.log(student2);
			
			var area5 = document.getElementById("area5");
			
			area5.innerHTML += "<b>in 키워드 테스트</b>";
			
			area5.innerHTML += "student 객체에 name이라는 속성이 있는지 확인 : " + ('name' in student) + "<br>";
			
			area5.innerHTML += "student 객체에 sum이라는 속성이 있는지 확인 : " + ('sum' in student) + "<br>";
			
			area5.innerHTML += "<b>그냥 출력</b><br>";
			
			area5.innerHTML += "학생이름 : " + student.name + "<br>";
			area5.innerHTML += "국어점수 : " + student.kor + "<br>";
			area5.innerHTML += "영어점수 : " + student.eng + "<br>";
			area5.innerHTML += "수학점수 : " + student.math + "<br>";
			area5.innerHTML += "총점 : " + (student.kor + student.eng + student.math) + "<br>";
			area5.innerHTML += "평균 : " + (student.kor + student.eng + student.math) / 3 + "<br>";
			
			area5.innerHTML += "<b>with 키워드 테스트</b><br>";
			
			with(student){
				area5.innerHTML += "학생이름 : " + name + "<br>";
				area5.innerHTML += "국어점수 : " + kor + "<br>";
				area5.innerHTML += "영어점수 : " + eng + "<br>";
				area5.innerHTML += "수학점수 : " + math + "<br>";
				area5.innerHTML += "총점 : " + (kor + eng + math) + "<br>";
				area5.innerHTML += "평균 : " + (kor + eng + math) / 3 + "<br>";
			}
			
		}
	</script>
	
	<hr>
	
	<h3>객체의 속성 추가와 제거</h3>
	<p>처음 객체 생성 이후 속성을 추가하거나 제거하는 것을 동적으로 속성을 추가한다 혹은
	제거한다라고 한다.</p>
	<button onclick="test6();">실행확인</button>
	<div id="area6" class="area"></div>
	<script type="text/javascript">
		function test6() {
			var student = {};
			
			// 객체에 속성을 추가
			student.name = "머키";
			student.hobby = "철거";
			student.strength = "아옳?";
			student.dream = "아옳옳!";
			
			console.log(student);
			
			student.toString = function() {
				var str = "";
				
				for(var key in this){
					if(key != 'toString'){
						str += key + " : " + this[key] + "<br>";
					}
				}
				return str;
			}
			
			var area6 = document.getElementById("area6");
			
			area6.innerHTML = student.toString();
			
			// 속성을 지울 때 delete
			delete(student.dream);
			
			area6.innerHTML = student;
		}
	</script>
	
	
</body>
</html>


아래의 함수는 인코딩과 디코딩에 관련된 함수이다.


가끔 인터넷 주소창을 복사하여 붙여넣기 했을 때 분명 한글로 된 문자가


%$4764$%&$% 와 같이 이상하게 표시되는 걸 본적이 있을 것이다.


이와 관련된 인코딩에 대해서 확인해보자



escape : 영문 알파벳, 숫자, 일부 특수문자(@, *, -, _, ., /)를 제외한 모든 문자를 인코딩한다.


encodeURI : escape에서 인터넷 주소에 사용되는 일부 특수문자 (:, ;, /, =, ?, &)는 변환하지 않는다.


encodeURIComponent : 알파벳과 숫자를 제외한 모든 문자를 인코딩한다.(UTF-8 방식)


unescape : escape()로 인코딩 된 문자를 디코딩한다.


decodeURI : encodeURI()로 인코딩된 문자를 디코딩한다.


decodeURIComponent : encodeURIComponent()로 인코딩된 문자를 디코딩한다.









eval은 입력받은 문자열을 스크립트 코드로 적용하는 것이다.


innerHTML의 스크립트 버젼이라고 이해하면 쉽다.


또한 계산 식 같은 경우도 쉽게 연산해주기 때문에


eval("(3 * 4) + 1 / 3 + 5"); 와 같이 사용하면 연산 값을 반환한다.








Infinity는 무한이란 의미로 숫자 값을 0으로 나누면 Infinity를 반환한다.


isFinite() 함수를 이용해서 유한한지 무한한지 알 수 있고 음의 무한과 양의 무한이 구분되어 있다.




NaN, Not a Number은 연산의 결과나 자바스크립트로 표현 할 수 없는 숫자일 때 표시되는 문구이다.








형변환


Number는 숫자형으로 형 변환하는 함수로 변환하지 못하면 NaN을 반환한다.


parse


parseInt는 정수형으로 변환하고


parseInt( 'XXX', XX)와 같이 인자를 두 개 넣어서 사용하면 16진수 10진수 8진수 2진수를 10진수로 변환이 가능하고


지정된 형식을 입력하면 자동으로 10진수로 변환해준다.


parseFloat는 java와 비슷한데 중간에 e라는 문자를 만나면 지수로 인식하여 연산 결과를 반환한다.







다음 예를 확인해보자



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	.area{
		background: lightgray;
		border: 1px solid black;
		height: 150px;
	}
	.area-big{
		background: lightgray;
		border: 1px solid black;
		height: 350px;
	}
</style>
</head>
<body>
	<h1>JavaScript 내장함수</h1>
	<h3>인코딩과 디코딩에 관련된 내장함수</h3>
	
	<p>
	escape() : 영문 알파벳, 숫자, 일부 특수문자(@, *, -, _, ., /)를 제외한 모든 문자를 인코딩한다.<br>
	encodeURI() : escape에서 인터넷 주소에 사용되는 일부 특수문자
	(:, ;, /, =, ?, &)는 변환하지 않는다.<br>
	encodeURIComponent() : 알파벳과 숫자를 제외한 모든 문자를 인코딩한다.(UTF-8 방식)<br>
	<br>
	unescape() : escape()로 인코딩 된 문자를 디코딩한다.<br>
	decodeURI() : encodeURI()로 인코딩된 문자를 디코딩한다.<br>
	decodeURIComponent() : encodeURIComponent()로 인코딩된 문자를 디코딩한다.
	</p>
	
	<button onclick="test1();">실행확인</button>
	<div id="area1" class="area"></div>
	<script type="text/javascript">
		function test1() {
			var uri = "http://www.naver.com?test=한글입니다.";
			
			
			var esURI = escape(uri);
			var enURI = encodeURI(uri);
			var enURIC = encodeURIComponent(uri);
			
			var area1 = document.getElementById("area1");
			
			area1.innerHTML += "escape() : " + esURI + "<br>";
			area1.innerHTML += "encodeURI() : " + enURI + "<br>";
			area1.innerHTML += "encodeURIComponent() : " + enURIC + "<br>";
			
			area1.innerHTML += "unescape() : " + unescape(esURI) + "<br>";
			area1.innerHTML += "decodeURI() : " + decodeURI(enURI) + "<br>";
			area1.innerHTML += "decodeURIComponent() : " + decodeURIComponent(enURIC) + "<br>";
		}
		// ? test = 한글입니다. 라는 변수를 전달
	</script>
	
	<hr>
	
	<h3>eval() 함수</h3>
	<p>문자열을 자바스크립트 코드로 변환해 실행하는 함수이다.</p>
	<br>
	<label>숫자 1 입력</label>
	<input type="text" id="number1">
	<br>
	<label>숫자 2 입력</label>
	<input type="text" id="number2">
	<br>
	
	<button onclick="test2();">실행확인</button>
	<div id="area2" class="area"></div>
	
	<script type="text/javascript">
		function test2() {
			var testEval = "";
			testEval = "var number1 = parseInt(document.getElementById('number1').value);";
			testEval += "var number2 = parseInt(document.getElementById('number2').value);";
			testEval += "var sum = 0;";
			testEval += "sum = number1 + number2;";
			testEval += "document.getElementById('area2').innerHTML += number1 +'과 ' + number2 + '의 합은 ' + sum + '입니다.';";
			
			eval(testEval);
		}
	</script>
		
	<hr>
		
	<h3>infinity 와 NaN</h3>
	<p>대부분의 프로그래밍 언어는 0으로 숫자를 나누면 자동으로 오류가 발생하고
	프로그램이 종료된다<br>
	하지만 자바스크립트는 0으로 숫자를 나누면 infinity라는 값이 들어가게 되고<br>
	자바스크립트가 표현할 수 없는 숫자는 NaN(Not a Number)으로 표시된다.</p>
	<button onclick="test3();">실행확인</button>
	<div id="area3" class="area"></div>
	<script>
		function test3(){
			var num1 = 10 / 0;
			var num2 = 10 / 'a';
			
			var area3 = document.getElementById("area3");
			
			area3.innerHTML += "10 / 0 : " + num1 + "<br>";
			area3.innerHTML += "10 / 'a' : " + num2 + "<br>";
			area3.innerHTML += "isFinite() : " + isFinite(num1) + "<br>";
			area3.innerHTML += "num1 == Infinity : " + (num1 == Infinity) + "<br>";
			// Finite = 유한수
			
			var num3 = -10 / 0;
			
			area3.innerHTML += "num3 == -Infinity : " + (num3 == -Infinity) + "<br>";
			// 무한 대수는 양의 무한대수와 음의 무한대수가 있다.
			
			
			// NaN은 Infinity와 달리 비교연산자로 확인할 수 없다.
			if (num2 == NaN) {
				area3.innerHTML += "num2는 숫자가 아닙니다.<br>";
			}else {
				area3.innerHTML += "num2는 숫자입니다.<br>";
			}
			
			if (isNaN(num2)) {
				area3.innerHTML += "num2는 숫자가 아닙니다.<br>";
			}else {
				area3.innerHTML += "num2는 숫자입니다.<br>";
			}
			
			
		}
	</script>
	
	<hr>
	
	<h3>Number(), parse(), parseFloat()</h3>
	<p>Number() : 숫자로 바꿀 수 없으면 무조건 NaN을 리턴한다.<br>
	parseInt(), parseFloat() 숫자로 변환할 수 있는 부분까지는 모두 숫자로 변환한다.
	</p>
	
	<button onclick="test4();">실행확인</button>
	<div id="area4" class="area-big"></div>
	<script type="text/javascript">
		function test4() {
			var money = '1000원';
			var dollar = '1.5$';
			
			var area4 = document.getElementById("area4");
			
			area4.innerHTML += "Number(money) : " + Number(money) + "<br>";
			area4.innerHTML += "Number(dollar) : " + Number(dollar) + "<br>";
			
			// 앞에서부터 정수로 인식할 수 있는 부분까지 변환
			area4.innerHTML += "parseInt(money) : " + parseInt(money) + "<br>";
			area4.innerHTML += "parseInt(dollar) : " + parseInt(dollar) + "<br>";
			
			area4.innerHTML += "parseFloat(money) : " + parseFloat(money) + "<br>";
			area4.innerHTML += "parseFloat(dollar) : " + parseFloat(dollar) + "<br>";
			
			// 16진수도 10진수로 계산 가능
			area4.innerHTML += "parseInt(0X1234) : " + parseInt(0X1234) + "<br>";
			// 8진수(앞에 0이 붙음)도 10진수로 계산 가능
			// 그러므로 문자열로 입력받을 때 앞에 0을 입력하지 않게 주의
			area4.innerHTML += "parseInt(01234) : " + parseInt(01234) + "<br>";
			
			// 10진수 문자열을 10진수로 변환
			area4.innerHTML += "parseInt('1234') : " + parseInt('1234') + "<br>";
			
			// n진수 숫자를 10진수로 변환한다.
			area4.innerHTML += "parseInt('FF', 16) : " + parseInt('FF', 16) + "<br>";
			area4.innerHTML += "parseInt('52', 10) : " + parseInt('52', 10) + "<br>";
			area4.innerHTML += "parseInt('11', 8) : " + parseInt('11', 8) + "<br>";
			area4.innerHTML += "parseInt('10', 2) : " + parseInt('10', 2) + "<br>";
			
			// float에서 e는 지수로 인식
			// 중간데 e 전까지만 parsing 하는것이 아니고 제곱 처리를 한다.
			area4.innerHTML += "parseFloat('52.273e5') : " + parseFloat('52.273e5') + "<br>";
			
			
		}
	</script>
	
	
</body>
</html>


+ Recent posts