JqGrid를 이용해서 회원정보를 CRUD를 했다

날짜컬럼을 update하면 sqlException오류가 발생했다 

날짜컬럼에 YYYY-mm-dd로 입력하면 db까지 같은 형식으로 저장이 되는데

client side에서 보면 mm/dd/YYYY로 변환이 된다

날짜 형식이 달라서 update가 되지 않는 것이다

 

formatter속성으로 데이터를 조작해도 날짜 형식이 변하지 않았다

구글링을 했더니 server side에서 데이터를 조작하던지 custom formatter로 설정하라는 의견이 많았다

date custom formatter를 사용했지만 변수가 많았고 어려웠다

그래서 server side에서 데이터를 변환해보았다

 

crud가 잘된다

2019/07/12 - [웹/Javascript] - 비동기식 JavaScript라이브러리 AJAX

 

비동기식 JavaScript라이브러리 AJAX

AJAX는 JavaScript의 라이브러리로 Asynchronous Javascript And Xml(비동기식 자바스크립트와 xml)의 약자이다. JavaScript로 서버에 데이터를 요청한다. 화면(html)은 그대로 두고 데이터만 바꾸고 싶을 때 많이..

golddigger.tistory.com

 

 

 

jsonObject를 올리면 전처리가 쿼리스트링으로 바꿔준다. 

애초에 데이터를 올릴 때 jsonObject가 아닌 jsonObjectString으로 올려본다.

 

var form = {"param" : thisParam} ; 
이렇게 변수에 담고 ajax data에 문자열을 올려본다.  


JSON.stringify( )메서드가 jsonObject를 jsonObjectString로 바꾸는데 완벽한 문자열로 바꿔준다.

 

 


 

 

크롬  - network 에서 All로 열어서 확인해본다. 
error가 나오는데 인코딩이 잘못 되었기 때문이다. jsonObjectString이 더블코테이션(")을 읽지 못했기 때문이다.
왜냐하면 ajax는 아무것도 안써주면 자동으로 get방식이다. get방식은 특수문자를 읽지 못한다.

post방식으로 적어주면 error부분이 사라졌다.

 

post방식으로 바뀌면 개발자도구에 있는 Form Data(body)부분에 더블코테이션과 문자열이 적혀있다. 
Form Data는 body부분이다. 

Form data는 키를 보고 벨류가 안 넘어가고 있다. 
벨류를 받게 하려면 어떻게 할까? controller에 getParameterNames를 사용해준다.
Emumeration name = request.getParameterNames; 라고 적어주면 name으로 키를 사용해 벨류 값을 뽑을 수 있다.
그리고 while문을 통해서 키를 뽑아낸다. 마치 키를 벨류처럼 사용해준다. 

찍어보면 jsonObjetString(문자열)이 잘 나온것을 볼 수 있다. 

 


jsonObjectString을 쿼리스트링 형식인 map으로 바꿀때 gson을 사용한다.

String을 db로 가져가려면 map으로 바꿔줘야하는데 gson으로 jsonObjectString을 jsonObject(쿼리스트링)로 바꿔준다.

map의 키와 벨류를 String , Object로 설정했다. 그런데 map에서 get( )으로 꺼낸 키의 벨류타입은 Object이다. 
이 Object를 List의 String타입인 param에 넣으려고 하니까 오류가 난다.

그래서 강제로 String으로 형변환해준다. 

 

 


 

 


@ReqeustBody
여태 한 이 과정을 @Requestbody로 사용하면 된다.
@Requestbody는 body에 있는 문자열(데이터)을 그대로 가져온다. 

body기 때문에 post 방식일때만 쓸 수 있다. get방식은 헤더에 써서 문자열로 받아드릴수 없다.
이렇게 쓰게 되면 getParameterNames와 while문은 필요가 없다. 

@RequestBody를 사용했는데도 값이 이상하게 나왔다.

인코딩이 안 됐기 때문이다. 그래서 디코딩을 해준다.

인코딩이 암호화라면 디코딩은 복호화이다. 


 : 가 = 으로 바껴서 나오는데 subString메서드를 사용해서 잘라준다. 

 

 


 

 

subString을 사용하지 않으려면 ajax에서 contentType을 적어준다. 

애초에 contentType  :  "application/json", 이라고 적어준다. 
json으로 인코딩해주는 ajax메서드는 contentType이다. 

contentType하면 디코딩도 필요가 없다. 왜냐하면 애초에 jsonObject로 받기 때문이다.

contentType적어주기전
contentType 적고난 후

contentType을 적어주지 않으면 jsonObjectString이지만 적어주면 jsonObject로 받는다.

 

왜 굳이 jsonObject보다 jsonObjectString으로 보낼까? 왜냐하면 ajax는 post를 많이 쓰기 때문이다.
get방식은 데이터를 보내는데 한계가 있지만 post방식은 한계가 없다. 

그래서 jsonObject보다 jsonObjectString으로 보내는 일이 많다.

 

 

 


정리  :  post는 body로 받기 때문에 손쉽게 받으려면 @Requestbody를 쓴다. 

          jsonObjectString으로 나오기 때문에 content-Type을 쓴다. 

 

 

 

 

 

 

 

출처  :  한큐에 자바 수강내용

' > Javascript' 카테고리의 다른 글

JqGrid 서버사이드 format  (0) 2019.08.29
비동기식 JavaScript라이브러리 AJAX  (0) 2019.07.12
리터럴 방식의 배열  (0) 2019.07.08
자바스크립트 구성요소  (0) 2019.07.05
도큐먼트 레디가 동작하는 방법  (0) 2019.07.02

 AJAX는 JavaScript의 라이브러리로 Asynchronous Javascript And Xml(비동기식 자바스크립트와 xml)의 약자이다.

JavaScript로 서버에 데이터를 요청한다.

 

화면(html)은 그대로 두고 데이터만 바꾸고 싶을 때 많이 이용한다. 대표적인 예시가 mult selectBox다. 

화면을 부분적으로만 그리고 싶을 때 사용한다. 

JSTL이 AJAX보다 빠르다. 왜냐면 화면을 그리면서 보여주기 때문이다.
JSTL는 화면을 다 그릴때 사용하고 AJAX는 부분적으로 그릴 때와 데이터를 바꾸고 싶을 때 사용한다.

 

AJAX는 대표적인 비동기 방식이다.

*동기와 비동기
동기    :  예를 들어, 사수가 부사수한테 팝업하라고 명령할 때 사수가 다 할 때까지 계속 쳐다보고 있는 것이다. 

            부사수가 일을 다해야 사수가 받아서 수행한다.
비동기 :  부사수가 일을 하고 있으면 사수는 지 할 일 하는 것이다.  비동기의 대표적언어는 node.js이다.

 

 


 

 

selectBox로 DB테이블에 where조건문을 걸어서 원하는 값을 가져와보겠다.

DB데이터이다. 

brandCd db
prdCd db
SQL
화면

첫 번째 selectBox에는 brandCd가 나오고 두 번째 selectBox에는 brandCd로 분류한 prdCd가 나온다.

JSTL과 AJAX를 적절히 사용해야한다. brandCd는 화면에 그대로 둬도 되기때문에 JSTL로 화면에 내린다.

selectBox Controller에 MVC패턴으로 데이터를 보냄
selectBox.jsp에 JSTL로 화면에 내렸다.
화면에 brandCd가 잘 나옴
개발자도구로 보면 반복문이 잘 적용됨

 

 


 

 

이제 같은 brandCd를 가지고 있는 prdCd를 두 번째 selectBox에 내린다. 

즉, brandCd를 선택한 것에 따라 prdCd가 나온다.

 

그전에, 추가로 AJAX의 기본 형태를 보면

type      -  type을 안 적어주면 기본적으로 get방식이다. 쿼리스트링형식이 화면 주소창에 나온다.

data      -  data에 적혀있는 { }중괄호는 객체다. 이 객체를 들고 가는데, 객체 안에는 문자열("a")과 value(b)가 있다. 

               이 모양을 jsonObject라고 한다.
               { }가 있고 안에 모양이 json모양이기 때문에 jsonObject라고 한다.

success  -  controller, service, serviceImpl, mapper, DB까지 MVC로 뒤져서 나온 데이터를 갖고 와서 

              모델로 화면에 떨궈지는데 success에 떨궈진다. 최종 도착지인 셈이다.

 

prdCd구하는 로직

 여기서 change( )는 내가 클릭한 selectBox로 클릭할때마다 brandCd가 바뀐다.

*AJAX 전처리
jsonObject형태로 controller에 보내면 AJAX전처리가 jsonObject만 쿼리스트링형식으로 변형시킨다. 

jsonObject는 데이터 포맷 중에 하나다. (예를 들어 html포맷, json포맷처럼)
childSelectBox가 void타입인 이유는 리턴타입이 필요없기 때문이다. 

AJAX는 호출한 곳에서 호출한 곳으로 데이터를 전달하기 때문에 특정 주소가 있는 리턴을 보낼 필요가 없다.

 

1번.  hashMap인스턴스를 생성해서 원하는 값을 뺄 수 있게 했다.    

 

2번.  submit( )방식이 get방식이면 한글처리가 안되서 server.xml에서 한글처리를 해줬다. 
       json은 톰켓 쪽이 아니여서 한글처리를 따로 해주어야 한다. utf-8세팅은 항상 위쪽에 있어야 한다. 

 

3번.  resquest는 화면에서 보내는 것이고 response는 화면에 파라미터를 내린다(받는다).

       submit통신은 뷰가 모델과 논리적 주소를 받아서 처리하지만 ajax는 모델이 아닌 response가 내려준다.
       예를들어, 모델로 받을때 model.addAttribute를 사용한 것처럼 response 메서드를 사용한 것이다.

       PrintWriter out = response.getWriter( );  PrintWriter는 리턴타입이다.

       콘솔에 resultMap에서 put( )로 뽑은 값은 AJAX전처리때문에 쿼리스트링 형식으로 나온다.

 

      *response로 내려주면 View가 아니라 mappingJacksonHttpMessageConverter가 받는다.
       mappingJacksonHttpMessageConverter는 종류가 많다. 
       우리가 response를 이용해서 내리면 수많은 if문이 있다.   
       예를 들어, http만 받는 애도 있고

       if문에 모델이면 뷰가 받고 
       또 if else해서 response는 mappingJacksonHttpMessageConverter이 받는다. 

       이런식으로 내부적으로 if문이 들어있다.
       mappingJacksonHttpMessageConverter는 스프링 3.0,

       스프링 4.0에서는 gsonHttpMessageConverter가 받는다.

     

4번.  쿼리스트링은 String타입인 writer( )메서드를 사용할 수 없다. 

       화면에 내리기 위해서 write( )을 사용하는데 String만 내릴수 있기 때문에 jsonObjectString으로 타입을 바꾼다.

       {key=value}  jsonObject타입이고  {"key" : "value"}  jsonObjectString타입이다. 
       이때 gson을 사용하면 된다. gson은 pom.xml가서 gson관련 dependency를 주입한다.

 

5번.  이제 String타입인 write( )를 사용할 수 있다. 

       콘솔을 보면 jsonObjectString으로 잘 나오는 것을 볼 수 있다.

 

 

 

jsonObjectString은 String이라서 값을 뽑을 수 없기 때문에 쿼리스트링 형식인 jsonObject형태로 또 바꿔야 한다.

 JavaScript메서드인 parse( )를 이용해서  jsonObject형식으로 바꿔줘야한다.

개발자도구에 jsonObject형식으로 나온 것을 볼 수 있다.

 

 

 


 

 

jQuery의 each문은 반복문으로 반복할때마다 익명함수를 실행한다.

 

$.each(childList, function(i, item) {
})

i는 배열 수이고 item은 프로퍼티다. 첫 번째 줄의 중괄호, 두 번째 줄의 중괄호..다.

 

prdCd를 selectBox에 나오게 하는 로직이다.

<script>

	var select = {
			
		displayChildSelectBox	:	function(childList){
			
			if (childList.length > 0) {
				
				$.each(childList, function(i, item){
					var optionStr = "<option value=" + item.prdCd + ">" + 
										 item.prdNm + 
									"</option>";
					
					$("#childSelectBox").append(optionStr);
				})
			} else {
				$("#childSelectBox").append("<option value''>없음</option>");
			}
		}
	}

	$(function() {
		//change()는  클릭한 selectBox로 클릭할때마다 값이 바뀐다.
		$("#parentSelectBox").change(function(){
			var thisParam = $(this).val();
			
            $("#childSelectBox").children().remove();
            
			$.ajax({
				url		:	"childSelectBox.do",
				data    :	{ "param" : thisParam},
				success	:	function(data){
					var jObj = JSON.parse(data);
					
					if (jObj.result === "SUCCESS") {
						select.displayChildSelectBox(jObj.childList);
					}
				}
			})
		});
	})
</script>

이렇게 brandCd에 따라 prdCd가 잘 나온다.

 

 

 

 

참고  :  한큐에 자바 수강내용

' > Javascript' 카테고리의 다른 글

JqGrid 서버사이드 format  (0) 2019.08.29
비동기식 JavaScript라이브러리 AJAX 2  (0) 2019.07.16
리터럴 방식의 배열  (0) 2019.07.08
자바스크립트 구성요소  (0) 2019.07.05
도큐먼트 레디가 동작하는 방법  (0) 2019.07.02

배열은 하나의 변수에 여러 값을 가질 수 있다. 

체크박스나 라디오버튼에 많이 사용한다.
이거를 스프링이랑 연결하는 것이 중요하다.

 

배열은 두 가지로 선언할 수 있다. 바로 생성자 방식과 리터럴 방식이다.  
실무에서 생성자로 사용하지는 않는다. 왜냐하면 메모리를 차지하기 때문이다.  
생성자는 오브젝트를 가리키고 리터럴 방식은 원시를 가리킨다.

 

생성자 방식 선언

var array = new array("a", "b", "c");

리터럴 방식 선언

var array = ["a", "b", "c"];

 

배열은 인덱스가 0부터 시작한다.

<script>

	var arrayLiteral = ["a", "b", "c"];
	
	$(function() {
		alert("arrayLiteral :" + arrayLiteral[0]);
		alert("arrayLiteral :" + arrayLiteral[1]);
		alert("arrayLiteral :" + arrayLiteral[2]);
		
	})
		
</script>

이렇게 선언하면

012
배열이 0번째 값부터 출력된다.

 

메서드의 타입을 확인할 때 자주 쓰이는 JavaScript프로퍼티는 typeof다.

alert(typeof $("#arr").val());

배열의 타입이 String인 이유는 

input태그에 있는 hidden 속성에 값을 넣었기 때문이다. 값을 넣어주는 순간 다 string으로 변한다.

<script>

	var arrayLiteral = ["a", "b", "c"];
	
	$("#arr").val(arrayLiteral);
				
	alert(typeof $("#arr").val());
				
	$("#frm").submit();
</script>

<form id="frm">
	<input type="hidden" id="arr" name="arr"/>
</form>

자바스크립트는 7가지 내장 데이터 타입이 있다.
Number,  String,  Object,  null,  boolean,  undefined, Symbol이다.
여기서 symbol은 제한다. 

ex6에서만 사용하는데 우리나라는 ex11를 많이 사용하기 때문이다. 

activex가 난무하기 때문이다.
총 자바스크립트는 6개 타입이 있다고 생각한다.

자바스크립트 데이터유형으로 5가지 원시타입(Primitive Types)이 있다.

문자열,  부동소숫점,  boolean,  null,  undefined 이다.

얘들을 리터럴이라고 말한다. 내가 변수에 넣을 값을 구체화해서 적은 것이 리터럴이다. 

메모리에 값자체가 들어간다.

리터럴=원시, 원시데이터는 리터럴 그 값 자체이다. 

 

참조타입(Reference Types)으로는 object가 있다.
만약 값을 바꾸려고 하면 변수의 값이 바뀌는 것이 아닌 메모리 속의 값만 바뀐다.

 

읽어보기  : https://velog.io/@jakeseo_me/2019-04-01-1904-%EC%9E%91%EC%84%B1%EB%90%A8-2bjty7tuuf

$표시는 제이쿼리를 뜻한다. 

제이쿼리는 화면 마다 쓸 수 있다.

 

연결연산자(.)을기준으로 왼쪽은 클래스 오른쪽은 메서드이다.
제이쿼리는 연결연산자(.)왼쪽에 있기 때문에 클래스이다.

.click(function ( ) { } -> 클릭이벤트 리스너이다.

click이벤트리스너는 오른쪽에 있기 때문에 메서드이다.

 

id는 하나의 돔에 하나씩 있다.

돔(문서)은 <html>과</html>로 끝난다.

 

아무것도 없는 함수를 익명함수라고 하는데 이름을 적을 필요없기 때문이다.

#btn는 btn이란 id(#)를 타겟으로 잡았다는 것이다. 

타겟을 잡고 이 타겟을 클릭하면 익명함수가 실행된다.

id가 btn인 타겟을 click하면 익명함수를 실행하는 로직이다.

jsp파일은 위에서 내려가면서 실행한다.

타겟이 스크립트 아래에 있기때문에 button이벤트가 제대로 실행되지 않는다.

 

 


 

 

타겟의 위치를 스크립트 위에 두면 실행이 된다.

 

 


 

 

타겟이 스크립트 아래에 위치해도 실행이 되게 하려면 도큐먼트 레디를 사용한다.

이벤트리스너가 도큐먼트 레디 안에 있어야 읽힌다. 

jsp는 위에서 아래로 실행되는데 도큐먼트레디는 위에서 아래로 갔다가 다시 한번 돌아서 실행한다.

(도큐먼트 레디는 돔이 다그려지고 호출된다)
돔이 그려진 다음에 도큐먼트 레디가 호출되기 때문에 타겟이 아래에 있어도 이벤트리스너가 작동된다.

 

 

 

 

출처  :  한큐에 자바 수강내용

Javascript에서 배열의 최대값을 구하려면 함수를 사용하거나 루프문이 있다. 

Math.max 함수를 사용해본다.

이렇게 Math.max함수를 이용해 매개변수들의 최대값을 구할 수 있다.

 

전역변수에 배열을 넣어 Math.max함수를 적용하면 오류가 난다.

apply함수를 사용하면 오류가 나지 않고 최대값을 구할 수 있다.

전역변수만고 배열을 직접 파라미터로 넣어서 사용할 수도 있다.

 

Math.max(1,2,3,4,5,6,7);

괄호 안을 아규먼트(매개변수)라고 한다.

Math.max.apply(null, [1,2,3,4,5,6,7]);

여기서 괄호 안을 파라미터(인자값)이라고 한다.

아규먼트는 함수에 전달하는 값이고 파라미터는 함수에 전달 받는 값이다.

 

Q. apply는? 

A. apply라는 함수는 함수 혹은 메서드를 실행시키는 보조수단이라고 생각하면 된다.  

    apply는 굳이 써도 되고 안써도 된다. 

    apply는 this와 배열로 제공되는 arguments로 함수를 호출한다.

  

배열에 여러 개 값을 담고 제일 큰 값을 구하려면 for문을 돌려야한다. 

그런데 개발할 때는 파라미터를 많이 보내면 안된다. 파라미터는 1개정도 보내는 것이 제일 좋다.
apply함수를 안 쓰면 파라미터를 여러 개 써야하지만 쓰면 최소의 파라미터를 쓸 수 있다.

 

apply함수의 몇 가지 특징이 있다.
1. Math.max.apply(null, arr);  첫번째 파라미터가 null인 이유는 null을 써도 되고 안써도 되는 것이다. 
2. Math.max.apply(null, arr); 두번째 파라미터(arr)에는 배열만 들어간다는 것이다. 자동으로 큰값을 뽑아올 수 있다. 
   파라미터를 여러 개 보내는 상황에서도 간단히 사용할 수 있다.

 

3. Math.max.apply(null, arr); 첫번째 파라미터가(null) null이 나오게 된 이유?
   참고로, 메서드 안에서 this는 해당 스코프의 부모스코프의 오브젝트를 바라본다. 

   최종적으로 젤 최상위 스코프인 window객체를 바라본다. 
   함수를 실행하는 순간, apply의 첫번째 파라미터로 보낸 this의 대상이 바뀐다. 

   첫번째 파라미터로 보낸 부모메서드로 this를 바꾼다. 
   이것이 실행되는 순간은 함수를 실행하는 순간이다. 

      그래서 this를 받고싶지 않으면 null로 적어준다.

      예를 들어 설명하면

 

여기서 this는 해당스코프의 부모스코프인 obj를 바라본다. { }중괄호를 스코프라고 한다.

obj.three( )의 결과값이 java로 나오는 것이다.

 

this를 받고싶지 않으면 첫 번째 파라미터에 null로 적어주거나 안 적어도 된다.

여기서 첫번째 파라미터에 아무것도 안적어줬기 때문에 obj2를 바로 실행한다.

그래서 결과값이 zzang이 나왔다.


**array Class 찾아보기/ 이크마

 

 

 

출처 : 한큐에 자바 수강내용

jquery를 이용해 <body>영역에 있는 태그를 선택하는 선택자에 대해 알아보겠다.

선택자는 직접 선택자와 인접 관계 선택자로 나눌 수 있다.

도둑잡기를 하는 것처럼 선택자를 도둑으로 보고, "선택한다"를 "잡는다"라고 표현하겠다

 

먼저, 직접 선택자는 아이디선택자, 클래스선택자, 요소선택자 등이 있다.  

<script>
	$("#id명");
   	$(".class명");
</script>

id를 잡을 때는 #을 사용하고

class를 잡을 때는 .을 사용한다.

직접 선택자는 주로 태그속성을 직접 잡을 때 사용한다.

 

 

그 다음, 인접 관계 선택자는 부모선택자, 자식선택자, 형제선택자 등이 있다.

<script>
	$("요소").parent( );
    	$("요소").closest( ); 
   	$("요소").prev( ); 
</script>

parents( )메서드는 모든 부모태그를 잡는다. 
closest( )메서드는 해당 요소의 부모던 할아버지던 가장 가까운 요소를 잡는다.

prev( )메서드는 형제 태그 중에 하나를 잡는 메서드다. 

 

하나의 요소를 잡을 때 사용하는 메서드는 parent( ), prev( ) , next( )다.  
다중 요소를 잡을 때 사용하는 메서드는 closest("요소"), children("요소"), parents("요소")이다.

 


 

Q. 라디오 버튼처럼 input속성이 많을 경우 선택자를 어떻게 잡을까?
A. 태그로(div) 감싸서 임의의 타겟을 잡는 것이 편하다. 

   그래서 자식태그에서 라디오버튼이 있으면 잡도록 each문을 돌려서 작성한다.

<div class="radio">
	<input type="radio" id="rdo1" name="rdo-group">
	<label for="rdo1">받음</label>
</div>
<div class="radio">
	<input type="radio" id="rdo2" name="rdo-group" checked>
	<label for="rdo2">받지않음</label>
</div>
   
   
   ****태그로(div) 감싸서 임의의 타겟을 잡는 것이 편하다.***
   
   
   
<div class="radioHead">
    <div class="radio">
        <input type="radio" id="rdo1" name="rdo-group">
        <label for="rdo1">받음</label>
    </div>
    <div class="radio">
        <input type="radio" id="rdo2" name="rdo-group" checked>
        <label for="rdo2">받지않음</label>
    </div>
</div>

 


 

 

Q. 태그의 속성을 잡고 싶으면 어떻게 할까?

A. 타입을 잡으려면 그냥 쓰고, 속성을 잡으려면 대괄호[ ]로 태그를 잡는다. 

   체크된거를 잡으려면 checked라고 적어준다.

$("input[id=txt]");
$("input[type='radio'] : checked");

 

 

출처 :  한큐의 자바 수강내용

전역변수란 함수안에서 var를 붙이지 않은 변수다.

이 변수에 저장된 데이터는 Javascript가 선언된 곳이라면 어디든 사용할 수 있다.

예)   var A;

      function AA( ) {

          A = 1;

       }

 

지역변수는 함수안에서 var를 붙인 변수다.

지역변수에 저장된 데이터는 함수 내에서만 불러올 수 있다.

예)    fuction AA( ) {

            var A = 1;

        }

 

즉, 함수안에서 선언한 변수를 지역변수, 함수 밖에서 선언한 변수를 전역변수라 한다.

 

함수의 영역은 함수 스코프인 중괄호 { } 안이다. (블록이라고도 한다)

 

전역변수와 지역변수는 변수의 중복사용을 피하기 위해 나누었다. 

함수안에서 var를 붙여 지역변수를 이용하면 여러 함수에 같은 변수가 있어도 중복될 일이 없다.

하지만, 한 개의 변수를 여러 함수에 사용하고 싶으면 전역변수를 선언해야 한다.

 

 

 

참고 : 자바스크립트 + 제이쿼리 입문

전역(윈도우)변수는 메모리를 계속 까먹는다.
그래서 즉시실행 함수로 만든다. 즉시실행함수는 누군가 호출을 안 해도 바로 실행하는 함수다.
실행된 결과값을 함수한테 준다. 함수의 결과값은 return으로 표현될 수 있다. 

함수 안에 함수를 만들면 내부함수이다. 중첩함수라고도 한다.

Q.외부함수에서 내부함수에 접근할 수 있는 방법은?

A.없다.


즉시실행함수방식과 객체리터럴방식의 호출방식은 같다.
다만, 객체리터럴방식은 자기 클래스나 메서드를 호출하려면 this를 사용해 해당 프로퍼티에 직접 접근한다. 

마치, 자바에서 public으로 접근하는 것과 같다.

Q. 지역변수는 언제 생성될까?   
A.  호출함수가 즉시실행함수를 호출할 때마다 지역변수가 생성된다. 

  호출함수가 호출하면 메모리에 올라가고 함수가 끝날때 가비지 컬렉션이 지운다.
  함수 안에 있는 지역변수도 마찬가지이다.
  반면에, 객체 리터럴함수는 한번 만들어줘서 인스턴스를 생성하지 않는다.
 
메모리에 함수가 올라가는 것을 유효범위체인이라고 한다.
메모리는 원래 함수가 끝나면 지워지는데 나를 "원하는 곳"이 있으면 안 없어진다. 

원하는 곳이란 return이 선언되어있는 것을 말한다.
이 현상을 "클로저" 라고 한다.
 
하나의 함수에 내부함수 두 개가 있고 내부함수가 프로퍼티에 있어서 메서드가 되었다. 

return에서 지역함수를(호출한 놈을) 가리키고 있기 때문이다. 이것을 "클로저" 라고한다.
내부함수에서 외부함수의 변수를 사용할 수 있는 현상이다.
지역변수는 비공개 맴버다. 내부함수는 특권메서드라고 한다.

내부함수가 외부함수, 지역함수를 바라보면 return이 있건 없건 "클로져"현상이 일어난다. 

자신을 참조하고 있기 때문에 생존하고 있다.

즉시실행함수가 객체리터럴보다 좋은 이유는 
즉시실행함수는 private이고 static을 사용한다.
객체리터럴함수는 public이고 static을 사용하지 않는다.

 

 

출처 :  한큐의 자바 수강내용

+ Recent posts