국비지원학원/HTML,JavaScript,jQ

82일차-JavaScript_closure/class

초코맛 2019. 3. 3. 22:44
반응형
*JSON
  • 데이터를 전달하기 위해 만들어진 객체
  • JSONObject : {이름:값,,,,,}
  • JSONArray : JSONObject이 배열형태로 사용되는 것
    • 단독사용, JSONObject에 값으로 사용될 수 있다.
    • 단독)
      • //1.데이터 생성
      • var data="[{이름:값,,,},{이름:값,,,},{이름:값,,,},,,]";
      • //2.JSONArray생성
      • var ja=eval("("+data+")");//반복문을 돌려 사용
      • //3.사용
      • for(var i=0; i<ja.length; i++){
      •      ja[i].이름
      •     =>JSONObject
      • }
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/html_prj/common/main_v190130.css"/>
<style type="text/css">
     #output{border:1px solid #333; width: 600px; height:  200px; overflow: auto;}
</style>
<!-- JSONArray를 변수에 저장하여 가지고 있는 js를 외부파일  방식으로 연결 -->
<script type="text/javascript" src="json.js"></script>
<script type="text/javascript">
     window.onload=function(){
          document.getElementById("btn").addEventListener("click",useJsonArray);
          document.getElementById("selGroup").addEventListener("change",useJson);
     }//function
     
     function useJsonArray(){
           //1.data생성
           var  data="[{'name':'박','age':7,'role':'예매'},     {'name':'김','age':1,'role':'조원'},{'name':'최','age':6,'role':'조원'},{'name':'노','age':2,'role':'조원'},{'name':'김','age':6,'role':'조원'},{'name':'박영','age':5,'role':'조원'},{'name':'이','age':0,'role':'조원'}]";
           //2.JSONArray생성
           var json_array=eval("("+data+")");//문자열->객체가 됨
           //alert(json_array);//[object Object],,,,으로 출력됨
           //3.json_array 사용
           var output="<table border='1'>";
           output+="<tr><th width='80'>이름</th><th  width='40'>나이</th><th width='300'>역할</th></tr>";
           for(var i=0; i<json_array.length; i++){
                output+="<tr><td>"+json_array[i].name+"</td><td>"+json_array[i].age+"</td><td>"+json_array[i].role+"</td></tr>";
           }//end for
           output+="</table>";
           
           var divNode=document.getElementById("output");
           divNode.innerHTML=output;
     }//useJsonArray
     
     function useJson(){
           //외부파일 방식으로 연결한 js에서 제공하는 JSONObject  사용
           var sel=document.getElementById("selGroup");
           if(sel.selectedIndex !=0){//조선택이 선택되지 않았을때
                if(confirm(sel.value+"조를 조회하시겠습니까?")){
                     //alert(json_arr);
                     var  divNode=document.getElementById("output");
                     var output="<table border='1'>";
                     output+="<tr><th  colspan='2'>"+sel.value+"조 조회 결과</th></tr>";
                     output+="<tr><th width='100'>이름</th><th  width='300'>역할</th></tr>";
                     
                     var group_data=json_obj.data;
                     var cnt=0;
                     //JSONObject에서 JSONArray얻기
                     for(var i=0; i<group_data.length; i++){
                           if(group_data[i].group==sel.value){
                                output+="<tr><td>"+group_data[i].name+"</td><td>"+group_data[i].role+"</td></tr>"
                                cnt++;
                           }//end if
                     }//end for
                     output+="<tr><td colspan='2'>전체  ["+group_data.length+"]건] 중 조회 결과["+cnt+"건] 이  조회되었습니다.</td></tr>";
                     output+="<tr><td colspan='2'>데이터  생성일자:"+json_obj.pubDate+"</td></tr>";
                     output+="</table>";
                     
                     divNode.innerHTML=output;
                }//end if
           }//end if
     }//useJson
</script>
</head>
<body>
<div id="output"></div>
<input type="button" value="클릭" class="inputBox" id="btn"/>
<select id="selGroup">
     <option>---조선택---</option>
     <option value="1">1조</option>
     <option value="2">2조</option>
     <option value="3">3조</option>
     
</select>
</body>
</html>
var data="{'class':4,'pubDate':'2019-02-20','data':[";
     data+="{'name':'박','group':2,'role':'영화예매},";
     data+="{'name':'김','group':2,'role':'UI'},";
     data+="{'name':'이','group':1,'role':'PC방'},";
     data+="{'name':'정','group':1,'role':'메세지'},";
     data+="{'name':'김','group':1,'role':'회원'},";
     data+="{'name':'공','group':3,'role':'구인'},";
     data+="{'name':'이','group':3,'role':'지원'}";
     data+="],'result':true}";
var json_obj=eval("("+data+")");



*closure
  • javascript의 고급 기술
  • 함수 내에 선언된 함수나 변수를 함수외부에서 사용할 수 있도록 접근지정을 해제해 주는 것
  • JSONObject과 동일한 문법을 가진다. (중괄호에 이름에 콜론에 값)
  • 함수의 마지막줄에서 return을 하여 사용한다.
  • 무기명함수를 만들어 업무를 구분지어 사용할 수 있다.
  • <script>
  •     function a(){
  •     }
  •     function b(){
  •     }
  • //원래 a와b는 다른 일을 하는 함수지만 비슷한 업무인 a와 b를 그룹으로 묶어 볼 수 있다 =>클래스의 시초
  • 일반 자바개발자는 잘 사용하지 않고 library(JQuery?)를 제작하는 개발자가 주로 사용한다.
  • 옥션의 로그인->소스보기가 개꿀->다 함수 기반
  • 문법)
    • {외부에서 사용할 이름 : 변수명,,,외부에서 사용할이름 : 함수명,}
    • //무기명 함수로 쓰는 이유는?=>클래스가 아니다보니 new로 생성하여 사용하지 않고, 작업별 업무를 묶어서 개발할 수 있기 때문에 주로 사용
    • var 변수명=function(매개변수,,,){
    •     변수명
    •     function 함수명(){
    •     }//밖에서 호출해서 사용할 수 없다. 기본이 private이기 때문!
    •          ...
    •     //closure가 들어가면 호출해 사용가능
    •     return{이름: 변수명,,,이름 : 함수명,,};
    • }(값,,,);
    •  
    • 외부에서 사용)
    • 변수명.이름        //이름은 변수명이기도 함수명이기도
    • //변수사용
    • 무기명함수를저장한 변수명. 변수명=값;
    • //함수 사용
    • 무기명함수를저장한변수명.함수명(값,,,);
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/html_prj/common/main_v190130.css"/>
<style type="text/css">
     #output{width:500px; height: 300px; border: 1px solid  #dfdfdf;}
</style>
<script type="text/javascript">
     window.onload=function(){
          document.getElementById("btn1").addEventListener("click",useNonParam);
          document.getElementById("btn2").addEventListener("click",useParam);
     }//function
     
     //매개변수 없는 무기명 함수
     function useNonParam(){
           var val=function(){
                //alert("aaaaa");//잘나온다
                var name="김";
                
                function getAddr(){
                     return "서울시";
                }//getAddr
                
                //closuer : 함수내의 변수나, 함수를 외부에서  사용할 수 있도록 접근권한을 변경해 준다.
                //{외부명:내부명}
                //return{na:name}
                return{na:name, addr:getAddr}
           }();//아래의 두줄이 합쳐진것 => 함수가 만들면서  호출된다!
           /* };
           val(); */
           
           //자바의 문법으로 안에있는 name을 부르려면
           //alert(val.name+"/"+val.addr());//Error  private변수인 것으로 밖에서 사용하지 못한다.
           //무기명 함수 안에 있는 변수는 외부에서 사용할 수 없다.  (자바로 치면 private)
           //이때 밖에서 사용하고 싶으면 return{};
           //getAddr()=>안에서 쓰인 함수도 밖에선 부를수 없다.
           //alert(val.na+"/"+val.addr());
           
           var divNode=document.getElementById("output");
           divNode.innerHTML="이름: "+val.na+", 주소:  "+val.addr();
     }//useNonParam
     
     //매개변수 있는 무기명 함수
     function useParam(){
           var name=document.getElementById("name").value;
           var addr=document.getElementById("addr").value;
           var age=document.getElementById("age").value;
           
           var personData=function(i_name,i_addr,i_age){//변수와  같게 주어도 상관없음!
                function getName(){
                     return i_name+"님";
                }//getName
                function getAddr(){
                     return "거주지 : "+i_addr;
                }//getName
                
                function birth(){
                     var date=new Date();
                     return date.getFullYear()-i_age+1;
                }//birth
                //closure
                return{name:getName,addr: getAddr, bir:birth}
           }(name,addr,age);
           
           //alert(personData.name());
           document.getElementById("output").innerHTML="이름 :  "+personData.name()+", 주소 : "+personData.addr()+", 태어난 해 :  "+personData.bir();
     }//useParam
</script>
</head>
<body>
<div id="output"></div>
<div>
     이름 : <input type="text"name="name"id="name"></br>
     주소 : <input type="text"name="addr"id="addr"></br>
     나이 : <input type="text"name="age"id="age"></br>
</div>
     <input type="button" value="매개변수 없는 무기명 함수" id="btn1" class="btn"/>
     <input type="button" value="매개변수 있는 무기명 함수" id="btn2" class="btn"/>
</body>
</html>



*class(클래스는 아니지만 클래스처럼 만들어 사용)
  • 자바스크립트는 클래스를 만들수 없다. 흉내를 낼뿐(클래스와 비슷한 형태)
  • //오버로딩이 됨! 매개변수의 갯수가 다른것으로만!
  • new 로 객체를 생성하여 사용한다.
  • //만드는 이유는 업무를 구분하여(묶어) 만들기 위해서
  • 업무를 처리하는 함수를 묶어서 관리하기 위함
  • 내부에 정의되는 변수나 함수는 closure를 사용하여 외부에서 사용가능하다.
  • prototype을 사용하면 상속의 기능을 사용할 수 있다.
  • 작성법)
    • //1.클래스의 선언
    • function 클래스명(매개변수,,,){    //이때의 클래스명은 클래스명이자 생성자명이다.
    •      var 변수명;
    •  
    •     function 함수명(매개변수,,,){
    •        
    •     }//도 가능!
    •     return closure;
    • }
    • //2.객체화
    • var 객체명=new 생성자(값,,,);
    • //3.사용
    • 객체명.변수명;
    • 객체명.함수명(값,,,);
  • //클래스로 만들어진건 외부에서 객체로 만들어 얼마든지 사용가능하다.
*prototype
  • 상속을 할때 부모클래스의 자원을 등록시키기 위해 사용.
  • 작성법)
    • 1.부모클래스를 선언
    • function Parent(){
    •  
    •  
    • }
    • 2.자식클래스 선언 : 내용을 기술하지는 않는다!
    • function Child(){  }
    • 3.자식클래스의 부모를 등록 : 자식클래스명.prototype=new 부모클래스명();
    • Child.prototype=new parent();
    • 4.자식 클래스의 요소를 등록 :
      • (변수등록)자식클래스명.prototype.변수명[=값];   
      • (함수등록-무기명함수형식만 가능)자식클래스명.prototype.변수명=function(매개변수,,){   .......    }
    • 5.사용
      • 자식클래스 생성
      • var 객체명=new 자식클래스명();
      • 함수) 객체명.함수명();
      • 변수) 객체명.변수명;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/html_prj/common/main_v190130.css"/>
<style type="text/css">
</style>
<script type="text/javascript">
     window.onload=function(){
          document.getElementById("class1").addEventListener("click",useClass1);
          document.getElementById("class2").addEventListener("click",useClass2);
          document.getElementById("class3").addEventListener("click",useInheritance);
     }//function
     
     function useClass1(){
           //기본 생성자를 사용하는 클래스
           //1.선언
           function DataVO(){//클래스 명이자 동시에 생성자 명이  됨.
                var name;
                function setName(i_name){
                     name=i_name;    
                }//setName
                function getName(){
                     return name;
                }//getName
                
                //closure
                return{setName:setName, getName:getName};
           }//class
           
           //불렸다고 만들어지는게 아님
           //함수와다르게 객체를 생성하여 사용
           var vo=new DataVO();
           vo.setName("김희철");
           //alert(vo);//[object Object]//객체라고 나온다
           //alert(vo.getName());//closure를 만들어주기 전에는  사용할 수 없다.Error
           alert(vo.getName());
     }//useClass1
     function useClass2(){
           //매개변수 있는 생성자를 사용하는 클래스
           //1.선언
           function DataVO(i_name){
                var name=i_name;
                
                function setName(i_name){
                     name=i_name;
                }//setName
                
                function getName(){
                     return name;
                }//getName
                
                return{setName:setName, getName:getName};
           }//class
           
           //2.객체 생성
           var data=new DataVO("김정윤");
           var data1=new DataVO("김정운");
           
           //3.사용
           alert(data.getName());
           
           data1.setName("백인재");
           alert(data1.getName());
     }//useClass2
     
     function useInheritance(){
           //1.부모클래스 생성
           function Parent(){
                var name;
                function printName(){
                     //상속관계에서 클래스에 변수를 사용할 때에는  this.을 붙여서 객체에 생성된 변수임을 명시하여 사용한다.
                     alert("부모의 함수 :  "+this.name);//상속관계에 있을때, 인스턴스 변수를 사용할 때에는  this사용
                }//printName
                return {name:name,printName:printName};
           }//class
           
           //2.자식클래스 생성
           function Child(){}//class
           
           //3.상속 처리
           Child.prototype=new Parent();
           
           //4.자식클래스에 변수, 함수 등록
           //변수 등록=>closure가 없어도 사용 가능 해진다.
           Child.prototype.age;//프로토 타입으로 빼서 함수나 변수  정의해 사용하게 된다.
           
           //함수 등록: 함수는 무기명함수의 형태로만 등록된다.
           Child.prototype.printAge=function(){
                alert(this.age+"살");//등록된 변수는 this.변수명  으로 사용가능
                //등록된 변수는 클래스 안으로 등록되므로 this를  사용하여 접근한다.
           }//printAge
           Child.prototype.birthYear=function(age){
                var date=new Date();
                alert((date.getFullYear()-age+1)+"년 생");
           }//birthYear
           
           //5.사용
           var c_obj=new Child();
           c_obj.name="김정윤";
           c_obj.printName();
           
           //등록된 변수의 사용
           c_obj.age=20;
           //alert(c_obj.age);
           c_obj.printAge();
           c_obj.birthYear(32);
           //=>>>재사용성 증가
     }//useInheritance
     
</script>
</head>
<body>
<input type="button" value="클래스1" id="class1" class="btn"/>   
<input type="button" value="클래스2" id="class2" class="btn"/>   
<input type="button" value="상속" id="class3" class="btn"/>    
</body>
</html>



-끗-
반응형