JavaScript Class(클래스)

개미Coder
|2024. 6. 11. 12:17
반응형

 

JSON과 동일하지만 명시적으로 Class로 표현을 하면, 데이터 분석이 쉬워진다.

JSON인 경우에는 name과 value 값을 확인해봐야 하기 때문이다.

 

 

 

클래스 안에서 메소드 만들때

 

출력



 

데이터 표현 방식(JSON과 유사하다)

    <!-- JavaScript External 연결 -->
    <script src="../js/person.js">
    // 주의) 절대 경로 연결되어있는 script 사이에 다른 코드 작성하지 말 것
    </script>

    <script type="text/javascript">
        const p = new Person("홍길동",30,"010-1234-1234");
        document.write("p's name : " + p.name + "<br>");
        document.write("p's age : " + p['age'] + "<br>");
        document.write("p's tel : " + p.tel + "<br>");
        
        document.write("p's JSON : " + p.toJSON() + "<br>");
    </script>

toJSON(){
    // Person 객체가 가지고 있는 Data를 JSON 형태로 출력하는 메소드
    return `{"name":"${this.name}", "age":${this.age}, "tel":"${this.tel}"}`;
}

 

/**
 * 
 */

 class Person{
	constructor(name,age,tel){
		this.name = name;
		this.age = age;
		this.tel = tel;
	}
	
	toJSON(){
		// Person 객체가 가지고 있는 Data를 JSON 형태로 출력하는 메소드
		return `{"name":"${this.name}", "age":${this.age}, "tel":"${this.tel}"}`;
	}
	
	// setter
	set age(nai) {
		if(nai<0) {
			console.log("올바른 나이 값이 아닙니다.")
		}
		// 내부에서만 사용하는 이름에는 _언더바를 붙인다.
		this._age = nai;
	}
	
	// getter(this.age라고 표기하면 age() 메서드를 재귀함수처럼 반복해서 호출한다)
	get age() {
		return this._age;
	}
	
	
	
 }

 

 

 

클래스를 활용해서 주민번호를 통해 정보 얻기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

	<style type="text/css">
		table {
			width: 400px;
		}
		
		span {
			display: inline-block;
			text-indent: 20px;
		}
	</style>
	
	<script src="../js/jumin.js">
	</script>
	
	<script type="text/javascript">
		
		const regular_jumin = /^[0-9]{2}([0]\d|[1][0-2])([0][1-9]|[1-2]\d|[3][0-1])-[0-9]\d{6}$/;
		// 객체 생성
		const jumin = new Jumin("");
		
		function result_show() {
			
			let jumin_no = document.getElementById("jumin_no").value;
			
			if(regular_jumin.test(jumin_no) == false) {
				alert("주민번호 형식이 틀립니다.");
				return;
			}
			// jumin object의 jumon_no
			jumin.jumin_no = jumin_no;
			
			// 각각의 부가정보(출생년도/나이/...) 구한다
			const year = jumin.getYear();
			document.getElementById("birth-year").innerHTML = year;
			
			const age = jumin.getAge();
			document.getElementById("age").innerHTML = age + "(세)";
			
			const tti = jumin.getTti();
			document.getElementById("tti").innerHTML = tti + "(띠)";
			
			const gender = jumin.getGender();
			document.getElementById("gender").innerHTML = gender;
			
			const season = jumin.getSeason();
			document.getElementById("season").innerHTML = season;
			
 			const local = jumin.getLocal();
			document.getElementById("local").innerHTML = local;
			
			const ganji = jumin.getGanji();
			document.getElementById("ganji").innerHTML = ganji;
			
		}
	
	</script>
</head>
<body>

	주민번호:<input id="jumin_no" value="901212-1234568">
	<input type="button" value="결과보기" onclick="result_show();">
	
	<hr>
	
	<table border="1" width="400">
	<tr>
		<th>출생년도</th>
		<td><span id="birth-year">1990</span></td>
	</tr>
	<tr>
		<th>나이</th>
		<td><span id="age">30</span></td>
	</tr>
	<tr>
		<th>띠</th>
		<td><span id="tti">호랑이</span></td>
	</tr>
	<tr>
		<th>성별</th>
		<td><span id="gender">남자</span></td>
	</tr>
	<tr>
		<th>계절</th>
		<td><span id="season">겨울</span></td>
	</tr>
	<tr>
		<th>지역</th>
		<td><span id="local">서울</span></td>
	</tr>
	<tr>
		<th>간지</th>
		<td><span id="ganji">갑인</span></td>
	</tr>
		
	</table>
</body>
</html>
/**
 * 
 */

 
 class Jumin{
	constructor(jumin_no){
		this.jumin_no = jumin_no;
	}
	
	//                  01234567891234 <- index
	// this.jumin_no = "901212-1234567";
	
	/* 
			내국인		외국인
			남  여		남  여
	1900	1   2       5    6
	2000    3   4       7    8
	1800    9   0
	 */
	// 출생년도
	getYear() {
		let year = parseInt(this.jumin_no.substr(0,2));
		let gender = parseInt(this.jumin_no.charAt(7));
		switch(gender) {
			case 1 : case 2: case 5: case 6: year += 1900; break;
			case 3 : case 4: case 7: case 8: year += 2000; break;
			default: year += 1800;
		}
		return year;
	}
	
	// 나이
	getAge() {
		// 자바스크립트에서 현재날짜 구해서 처리
		const now = new Date();
		let result = now.getFullYear();
		let age = result - this.getYear();
		return age;
	}
	
	getTti() {
		let tti = ["신(원숭이)","유(닭)","술(개)","해(돼지)","자(쥐)",
		"축(소)","인(호랑이)","묘(토끼)","진(용)","사(뱀)","오(말)","미(양)"];
		let myTti = tti[this.getYear()%12];
		return myTti;
	}
	
	getGender() {
		let gender = parseInt(this.jumin_no.charAt(7));
		let myGender = "";
		if(gender%2==1) myGender = "남자";
		else myGender = "여자";
		return myGender;	
	}
	
	getSeason() {
		let season = parseInt(this.jumin_no.substr(2,2));
		let result = "";
		switch(Math.floor(season/3)) {
			case 1: result = "봄"; break;
			case 2: result = "여름"; break;
			case 3: result = "가을"; break;
			default: result = "겨울"; break;
		}
		return result;
	}
	
	getLocal() {
		let local_num = parseInt(this.jumin_no.substr(8,2));
		let result = "";
		if(0 <= local_num && local_num <= 8) {
			result = "서울";
		} else if(local_num <= 12) {
			result = "부산";
		}
		else if(local_num <= 15) {
			result = "인천";
		}
		else if(local_num <= 25) {
			result = "경기";
		}
		else if(local_num <= 34) {
			result = "강원";
		}
		else if(local_num <= 39) {
			result = "충북";
		}
		else if(local_num <= 41) {
			result = "대전";
		}
		else if(local_num == 44 || local_num == 96) {
			result = "세종";
		}
		else if(42 <= local_num && local_num <= 47) {
			result = "충남";
		}
		else if(local_num <= 54) {
			result = "전북";
		}
		else if(local_num <= 64) {
			result = "전남";
		}
		else if(local_num <= 66) {
			result = "광주";
		}
		else if(local_num <= 69 || local_num == 76 || local_num == 77) {
			return "대구";
		}
		else if(local_num <= 75 || (78 <= local_num && local_num <= 81)) {
			result = "경북";
		}
		else if(local_num == 85 || local_num == 90) {
			result = "울산";
		}
		else if(local_num <= 84 || (86 <= local_num && local_num <= 93)) {
			result = "경남";
		} else result = "제주";
		
		
		return result ;
	}
	
	getGanji() {
		let ganji = ["갑","을","병","정","무","기","경","신","임","계"];
		let ganji2 = ganji[this.getYear() % 10];
		
		let myGanji = ganji2 + this.getTti() ;
		return myGanji;
	}
	
	//                  01234567891234 <- index
	// this.jumin_no = "901212-123456 7";
	//                  2345670892345
	
	isValid() {
		let sum  = 0;
		sum += parseInt(this.jumin_no.charAt(0))*2;
		sum += parseInt(this.jumin_no.charAt(1))*3;
		sum += parseInt(this.jumin_no.charAt(2))*4;
		sum += parseInt(this.jumin_no.charAt(3))*5;
		sum += parseInt(this.jumin_no.charAt(4))*6;
		sum += parseInt(this.jumin_no.charAt(5))*7;
		
		sum += parseInt(this.jumin_no.charAt(7))*8;
		sum += parseInt(this.jumin_no.charAt(8))*9;
		sum += parseInt(this.jumin_no.charAt(9))*2;
		sum += parseInt(this.jumin_no.charAt(10))*3;
		sum += parseInt(this.jumin_no.charAt(11))*4;
		sum += parseInt(this.jumin_no.charAt(12))*5;
		
		let check_sum = (11-(sum%11))%10;
		console.log("check_sum", check_sum);
		let last_num = parseInt(this.jumin_no.charAt(13));
		return ( last_num == check_sum );
		
	}
		
	isValid2() {
		let sum  = 0;
		let multiply = 2;
		for(let i = 0; i < 13; i++) {
			if(i==6) continue;
			sum += parseInt(this.jumin_no.charAt(i))*parseInt(multiply++);
			if(multiply==10) multiply = 2;
		}
		
		let check_sum = (11-(sum%11))%10;
		console.log("check_sum", check_sum);
		let last_num = parseInt(this.jumin_no.charAt(13));
		return ( last_num == check_sum );
		
	}
	
 }

 

반응형