/*-----------------------------------------<create PopUp> ---------------------------------------------*/

 $(".layerPopup").click(function (event){ // 버튼 클릭시 실행 이벤트

  var height=0;

  var width=0;

// var cssUri = $(this).attr("data-css");

 var mappingUri = $(this).attr("name"); //클릭한 객체의 name값에 요청할 URL을 미리 넣어놓고 사용

  

//  alert(mappingUri);

     var s_w =$(document.body).width();

     var w=500;

     var left = s_w/2 - w/2;

     if(s_w/2 < w/2)

     left=0;

     

     

     // create wrapper

     var wrapper=$("<div />");

     wrapper.css({

    width:"0px",

    height:"0px",

    border:"2px solid #000",

    background:"#fff",

    position:"absolute",

    left: left,

    top:"100px",

   

     });

     

     var screenH = $(document).height();

     

     // create screen & run animation

        var screen = $("<div />");

        screen.css({

           width:"100%",

           height:screenH,

           background:"#000",

           position:"absolute",

           left:"0px",

           top:"0px",

           opacity:"0",

            zIndex:22

        }).animate({opacity:"0.5"},500,function(){

        $(document.body).append(wrapper);

        // setting CSS

           var link = document.createElement("link");

            link.setAttribute("rel","stylesheet");

            link.setAttribute("type","text/css");

          //  link.setAttribute("href", cssUri);

            document.getElementsByTagName("head")[0].appendChild(link); 

          //  alert(mappingUri);

            // Load popUp Page

            wrapper.load(mappingUri,function(){

             

            // load popUp Page's size

                var first=wrapper.children("div").eq(0);

                

                console.log(first);

                

                 width= first.outerWidth();

                 height = first.outerHeight();

                 

          

                 console.log(width);

             left = s_w/2 - width/2;

             if(s_w/2 < w/2)

             left=0;

                 

                 screen.attr("id","screen");

                 wrapper.attr("id","newWapper");

                 

                 wrapper.animate({

                 width:width,

                 "z-index":"23",

                 left:left

                 },500)

                 .animate({

                     height:height

                     },500);

                 

                 

                 // remove popUp Page&screen

              $("#screen").click(function(){

             wrapper.animate({

                     width:"0px"

                     },500)

                     .animate({

                         height:"0px"

                         },500,function(){

                         screen.animate({

                             opacity:"0"

                             },500);

                         wrapper.detach();

                         screen.detach();

                         

                         });

            });

                 

                 

             });

        });


        $(document.body).append(screen);


        

        // resizing

        $(window).resize(function() {

        s_w =$(document.body).width();

         var left = s_w/2 - w/2;

         if(s_w/2 < w/2)

         left=0;

           wrapper.css({left: left });

      });

     });

 

/*-----------------------------------------</create PopUp> ---------------------------------------------*/

ajax를 사용해 화면을 전환하거나 페이지를 이동하는 경우


생각치 못했던 문제에 봉착했다


뒤로가기가 안된다는것!!!!!


사이트 내부를 이리저리 왔다갔다 하다 뒤로가기를 눌럿는데 바로 메인으로 점프 해버리는 상황이 발생한 것이다.


그렇다고 전부 갈아 엎어버릴수도 없고 이것저것 찾아보던 와중


해쉬뱅(hashbang) 이라는 것과 Pjax 라는 것을 발견했다


어떻게 사용해야 하는지 이리저리 블로그를 뒤져보고 스택오버플로우를 뒤져봐도


당췌 어떻게 사용해야 하는지 모르다가 클라이언트 쪽의 대리님의 도움으로 어느정도 감이 잡혔다.


그리고 나는 야매개발자 답게 제대로된 해쉬뱅이나 pjax방법을 사용하지 않고 꼼수를 부렸지만


해결은 했다 


먼저 해쉬뱅은 URL에 #! 을 붙여서 (앵커라고 하는것 같다) 사용 하는 방법인데 이해도 못하겠고

URL창이 지저분해 보여 패스하고 


history.pushState를 사용하는 방법을 이용했다.


전자의 경우 어느정도 브라우저에 자유로운 방법이고


후자는 익스플로러 10 이상 버전과 파폭 크롬에서만 동작 하는 방법이다


다행이도 클라이언트가 익스플로러는 최신 버전을 사용한다고 하여 마음 놓고 사용할 수 있었다.



방법은 간단하다!!!


history.pushState(데이터,타이틀,URL);


 

history.pushState를 사용하는 방법인데 


원래대로 라면 저기에 html데이터라든지 URL을 넣는다는지 하는 방법을 사용하지만


제대로된 사용법을 알기엔 경험과 능력이 미천하여 꼼수를 부렸다


저 히스토리에 데이터 라고 써있는 인자를 


var data = event.originalEvent.state;


이것으로 불러 올 수가 있는데 이 방법을 응용했다



일단 


페이지가 이동하는 이벤트에 

history.pushState(데이터,타이틀,URL); <- 데이터 부분에 Ajax로 요청하는 URL을 넣는다


그러면 페이지를 이동하는 이벤트가 발생할때마다 히스토리에 URL이 쌓이게 된다.


아래 펑션은 브라우져에서 뒤로가기나 앞으로 가기 이벤트가 발생했을때 실행되도록 하는 함수이다



$(window).bind("popstate", function(event) {

    var data = event.originalEvent.state;  // 이부분으로 뒤로가기 할때마다 아까 저장한 히스토리 스택에 쌓인 URL을 불러 온다

    

    if(data){ // 데이터가 있으면 해당 데이터를 ajax로 다시 요청해 화면에 뿌려준다!!!!

// 아래 코드는 필자가 켄도UI의 스플리터기능으로 화면을 뿌려주기에  작성한 것이다

// 다른 사람들은 각자 화면을 요청하는 AJAX펑션을 넣으면 되겠다.

    var splitter = $("#layout-vertical").data("kendoSplitter");

splitter.ajaxRequest("#article-pane",data);

    }

    else{

    // 히스토리에 정보가 없을경우 메인화면으로 보내준다.

    var url = "/메인화면";    

    $(location).attr('href',url);

    }



아주 간단하게 해결이 되었다!!!!


주의할점은 

if(data){ // 데이터가 있으면 해당 데이터를 ajax로 다시 요청해 화면에 뿌려준다!!!!

// 아래 코드는 필자가 켄도UI의 스플리터기능으로 화면을 뿌려주기에  작성한 것이다

// 다른 사람들은 각자 화면을 요청하는 AJAX펑션을 넣으면 되겠다.

     var splitter = $("#layout-vertical").data("kendoSplitter");

splitter.ajaxRequest("#article-pane",data);

    }


이부분에서 화면이동 하는 펑션으로 보내주는 경우 그 펑션엔

history.pushState(데이터,타이틀,URL);

이게 없어야 한다


이유는 뒤로가기를 했는데 거기다 또 히스토리에 뒤로가기한 URL을 저장해 버려 꼬이는 경우가 생기기 때문이다.




제 포스팅이 도움이 되었나요? 

그렇다면 공감하기 한번 눌러주세요 블로거에게 큰 힘이 됩니다






이것때문에 돌아버리는줄 알았네요


패딩을 0을주고 마진을 0을주고 별것 다 해봤는데도 간격이 그대로 있길래


미치기 직전까지 가던 와중에 다른 방법을 발견 했습니다.


뭐 저도 구글링하면서 발견 한거지만요


<li>

내용

</li><!-- 


 --><li>내용</li> 


이런식으로 li태그 사이에 주석처리로 공백을 없애 주면 됩니다.


<li>

내용

</li><li>내용</li>


이런식으로 공백을 없애도 되지만 가독성이 너무 떨어지기 때문에 위와 같은 방법을 사용하는것이 좋을것 같습니다. 



안드로이드


android 2d Game 기초



android setting



안드로이드 플랫폼 구성.


flatform - linux


안드로이드에서 사용하는 자바는 구글이 배포하고 제공하는 실행환경임.

구글에서 배포하는 라이브러리들은 자바가 아니라 안드로이드 플랫폼임.


단 그 플랫폼을 이용하기 위한 언어가 자바와 같은 뿐이다.


자바버츄얼 머신이 아니라 달빅 버츄얼 머신을 사용.

OpenGL, SQLite 등 라이브러리를 제공하는데 C로 만들어져 있으나

그것을 자바로 사용 할수 있도록 자바라이브러리로 제공


안드로이드 플랫폼 구조






프로젝트 기본구조 익히기.




시작함수는 잊자.


절차적 프로그램의 기본함수인 Main()이 없다.


단 메인을 대신하는 설정파일이 있다.(MainAtivity, MainFrame)


안드로이드는 도스에서 개발 못함.


그래들 - 개발할땐 필요없음 지워도 됨, 하지만 나중에 어차피 추가 해야함


안드로이드 프로그램을 위한 필수 요소


manifest - 어플리케이션에 대한 전반적인 정보를 담고있는 파일. 프로필.


메인 -> 자바  -> 클래스생성(메인엑티비티) -> 엑티비티 이즈상속


여러개의 액티비티 중 가장 먼저 실행되어야 할 놈을 <intent-filter>로 지정


   <action android:name="android.intent.action.MAIN"/> 메니페스트에서 제일 먼저 떠야할 엑티비티 라고 말해주는 거.






폰 설정

환경설정 -> 애플리케이션 관리자 -> usb디버깅 체크



뷰 그룹.


액티비티엔 하나의 뷰만 가질수 있다


하지만 뷰 그룹을 사용하면 여러개를 사용할수 있다?

ViewGroup - 추상클래스

 - 어떻게 배치할 것인가


Linear - 일렬 옆으로 쭉

Relative - 상대적인 기준 정하고…. 설정

Frame - 여러개가 있지만 일렬(맨 마지막것만 보이게)(카드 덱 처럼)

Grid- 격자형

Absolute- 절대 위치좌표 집어주고  설정




리소스를 활용한 배치.


리소스를 이용한 방식???

XML로 코드를 대신 작성하라고?


dpi :: 1인치당 160개의 픽셀 - 1 기준


픽셀단위로 크기를 정하면 폰마다 다르게 나옴


DP로 해야댐




안드로이드 어플리케이션의 구성 요소는 다음과 같다.

* 액티비티(Activity)

* 서비스(Service)

* 브로드캐스트 리시버(Broadcast Receiver)

* 콘텐트 프로바이더(Content Provider)



app_hier.png

1. 액티비티(Activity)

- 어플리케이션의 한 '화면'을 의미한다.

- 휴대용 단말기의 성능은 PC에 비하면 메모리가 턱없이 부족하다. 때문에 액티비티는 액티비티의 상태(활성/비활성)와 액티비티 생애주기(Activity Lifecycle)에 따라 생성되거나 소멸된다.

- 화면에 표시되어 있는 상태가 아니라면 비활성 상태(Inactive)가 되어 액티비티 내에서 처리되는 작업 또한 중단된다.



2. 서비스(Service)

- 백그라운드에서 실행되는 컴포넌트.

- 예를 들면 음악 재생 어플리케이션.

- 서비스는 UI가 없기때문에 자신의 동작 여부를 알림 메세지 혹은 토스트를 통해 사용자에게 알린다.



3. 브로드캐스트 리시버(Broadcast Receiver)

- 인텐트(Intent) 형태의 방송 메시지(Broadcast Message)를 수신하는 역할을 한다.

- 주로 시스템의 상태(배터리 상태, 통신 상태, SD카드 삽입 등)를 알리기 위해 사용하지만, 어플리케이션에서 특정 작업이 완료되었을 때 처리할 동작을 구현할 때도 사용한다.

- 서비스와 마찬가지로 UI를 가지고 있지 않기 때문에 사용자에게 작업의 진행정도나 상태 등을 알리기 위해 알림 메시지나 토스트를 사용한다.



4. 콘텐트 프로바이더(Content Provider)

- 한 어플리케이션 내의 데이터를 다른 어플리케이션에서도 사용할 수 있게 해준다.(SD카드가 아닌 내부)

- 공유하려는 데이터가 있는 어플리케이션에 데이터를 공유할 수 있는 '통로'의 역할을 한다.

- 콘텐트 프로바이더를 통해 외부에서 접근할 수 있는 데이터의 범위, 방법 등을 지정하여 어플리케이션내의 데이터를 안전하고 공유할 수 있다.

- 콘텐트 프로바이더에 접근하려면 콘텐트 리졸버(Content Resolver)가 필요하다.



5. 인텐트(Intent)

- 액티비티, 서비스 호출 및 브로드캐스트 리시버에 메시지를 전달할 떄 사용.

- 내부에 어떤 형식의 정보가 담겨 있느냐에 따라 명시적 인텐트(Explicit Intent)와 암시적 인텐트(Implicit Intent)로 나뉜다.


- 명시적 인텐트 : 호출하거나 메시지를 보낼 컴포넌트가 명확하게 지정되어 있다. ex) 철수

- 암시적 인텐트 : 대상 컴포넌트가 명확하게 지정되어 있지 않고, 대상의 속성만 지정되어 있다. ex) 학생

이러한 암시적 인텐트를 처리하려면, 인텐트 필터(Intent Filter)를 사용하여 해당 컴포넌트의 속성을 안드로이드 시스템에 등록해야 한다.



6. 알림 메시지(Notification)

- 알림 바(Notification bar)나 알림 패널(Notification Panel), 소리, 진동, LED 점멸 등을 통해 사용자에게 특정 이벤트를 알릴 때 사용.

- 서비스, 브로드캐스트 리시버가 사용.



7. 토스트(Toast)

- 특정 이벤트를 사용자에게 알릴 때 사용하며, 주로 간단한 메시지를 표시한다.



클릭 이벤트 처리하기

- 레이아웃 구성과 Toasts활용하기


제어구조

:흐름을 제어

1.반복문

while(true)

{

break; ->무조건 벗어남.(선택적으로 벗어날 수 있도록 구성)

}

만약에 menu가 2라면 if (menu == 2) -->선택문




import java.util.Scanner;



public class forgugu {

public static void main(String[] args)

{

Scanner s = new Scanner(System.in);

System.out.print("1.숫자를 입력 하세요:");

int a = s.nextInt();

System.out.print("2.숫자를 입력 하세요:");

int b = s.nextInt();

System.out.println("입력한 값은:"+a+","+b);

if (a>b)

{

for (int i = b; i<=a; i++){

for(int j=1; j<10; j++)

{

System.out.println(i+"*"+j+"="+i*j);

}

}

}

else if (a<b)

{

for (int i=a; i<=b; i++){

for(int j=1; j<10; j++)

{

System.out.println(i+"*"+j+"="+i*j);

}

}

}

else

{

System.out.print("두 수는 같다");

}

}

}



선택 흐름(if문)

1.선택

2.검사 한번만

변수에서 유효한 범위->도메인

ex) 점수의 도메인 0~100

if(kor<0 || kor>100) 한번 검사!!!

여러번 검사 (while 문)


입력값을 검사 do while문




파일 입출력

FileOutputStream fos = new FileOutputStream(""


ctrl+shift+o =>자동으로 imprort

fos.write('A'); 문자하나하나만을 출력


FileOutputStream fos = new FileOutputStream("d:\\test.text");

fos.write('A'); //문자하나 쓰는 기능

fos.flush(); //비우는 기능

fos.close();


fos.flush();->데이터가 다 찰때까지 조금 기달리는 기능(끝에 한번만 선언)

while문 밖에다 선언


do{

c= fis.read();

if( c!= -1)


4bit=1byte


8bit


Big Endian   vs  Littile Endian

문자열을 자르기가 있다는걸 알고 있지만


함수 이름은 너무나도 잘 잊어먹게 된다. 


그리고 아주 자주 사용하는 함수이고 매우 유용한 함수이다 


var string = 'hello yamea programer'


var strArr = string.split('-');


문자열에서 - 라는 문자를 기준으로 잘라서 배열로 담는다.


string.substring(시작인덱스,끝인덱스);


첫글자는 0이다



string.substr(시작인덱스,길이)


위와 동일하지만


시작인덱스 부터 길이 만큼 자른다는 것

상속 - 기존에 있는 객체(부품)를 가져다 사용하기 위한 작업

* 재사용 - 컴파일된 바이너리를 다시 사용 // 소스 코드가 없는 상황에서 jar 파일을 import 시켜 사용

is a -


has a - 'a' 실존하는 객체를 부품(멤버)로써 가진다.

   상속되는 시점에 따라

     - composition has a - 내가 생성될 때 부품이 같이 생성된다.

     - association has a - 주입(인젝션)이 이뤄질때 생성된다.

                         - setter, constructor

     - aggregation has a - 1대 다로 has a 관계를 갖는다.



Is a 상속


<재사용을 극대화 하는 방법>

기존 재사용의 문제

-그대로 가져다가 사용

-만약 조금이라도 다르면 사용하지 못함


Is a 상속은 기존의 부품을 수정 또는 확장해서 사용 할 수 있는 방법이다.


- 클래스를 만들때 다음에 다시 사용 하기 좋도록(Is a 상속이 가능하도록) 만드는 것이 중요하다


frame work - 틀을 가져다가 고쳐 쓰는것




추상화 .

- 여러가지 사물이나 개념에서 “공통”되는 특성이나 속성 따위를 추출하여 파악하는 작용.- 네이버 사전

-공통분모를 만드는 과정



추상화한 클래스는 재사용을 위한 클래스.

단. has a 재사용이 불가능하다.(완전한 클래스가 아니기 때문에)

is a 재사용만 가능하다.


동일한 타입의 부품을 만들어야 할 경우에 추상화를 생각해 볼 수 있다.




-------------------------------------------------------┐

[비행기] <-        |

   △       |

       |

[적기] [아군기] [유람기]

동일한 행동을 한다.

--------------------------------------------------------



추상화된 클래스 또는 부모 클래스가 있을 경우 참조 방법에 모호함.



A a = new A();

A a = new B();

B b = new A(); <- 이건 안됨

B b = new B();


*재사용 되는 모든 부모*는 추상호된 클래스 *특징*을 갖는다.

왜냐하면 큰 범주에서 보면 공통분모가 되니깐

그렇다고 추상 클래스로 만들어진 것(집중화를 위해 만들어진 것)을 의미하지는 않는다.

단. 추상 클래스는 미완성 추상 클래스(집중화를 위해 만들어진 클래스)

와 완전 추상 클래스(기존의 재사용되는 클래스)로 나눌 수 있다.


기존의 클래스와 내가 부모자식 관계가 된다면 참조방법이 다양해 진다.


<- 구체화 클래스     추 상 클래스 ->

6강의장 학생 클래스, 학생 클래스, 사람 클래스 , 동물 클래스, 포유류 클래스, 생물 클래스


<필요한 클래스를 지목 =  만족하는 객체를 지목>

       사람 기선 = new 사람()

       6강의장학생 기선 = new 6강의장학생()

   사람 아무나 = new 6강의장핵생()

   사람 아무나 = new 7강의장학생()


문제

?? 기선 = new 6강의장학생()

위에서 6강의장학생 객체를 참조 할 수 있는 클래스의 개수는? (다 가능)


문제


동물 솔이 = new ??();

위의 식에서 솔이라는 이름으로 참조 할수 있는 개체의 종류는 총 몇개? (4개 동물,사람,학생,6강의장)



프로그래밍, 구조적 프로그래밍, 객체지향 프로그래밍.

재사용은 이미 만들어진것을 다시 사용 하는 것(소스 코드 재사용X)


객체지향 - 캡슐화 -> 상속 -> 다형성




다형성->추상화



오버 라이드! 한것 우선으로 호출된다



정적 바인딩, 동적 바인딩


자바는 동적 바인딩을 사용한다.


객체가 전달 되면서 함수목록을 제출???


객체들은 자기 주소를 가지고 간다.





다형성 - 다양한 용도로 써먹을 수 있는 성질

어떤 클래스를 다양하게 써먹을 수 있도록 작성할 수 있는 능력을 갖는데 있다.



인터페이스





행위는 같지만 근본이 다른놈?


참조는 공간만 참조.

String 클래스(모든 클래스는 object이다.)


자바는 완전한 객체지향이다.

(Boxing과 UnBoxing)


Integer x = 3; => Integer x = new Integer(3);

일케 쓰면      컴파일러가   일케 만들어준다.


값을 참조할수 있도록 박싱(뤱(wrap)픵 yoyo )

요즘은 오브젝트에 그냥 값만 넣어도 알아서 만들어줌 ( 오토 빡싱)


Object x= 3;   => Object x = new Integer(3);

int y = x;(초창기엔 에러가 났는데 요즘은 안난다 오토 언빡싱)


Object x= 3;   => Object x = new Integer(3);

add(x,4);  x 에 참조가 아닌 값이 전달됨.

Boxing에 사용되는 Wrapper 클래스


Object ──── ① Number : Byte, Short, Long,Integer등등

                      ② String


int a = 3.intValue(); ---> 앙대요  < 요게 안대거

new Integer(3).intValue();---->되요

객체로 만들어줘서 나오는거        that’s yes yes ㅎㅇ

int b = “hello”.length(); -->되요


String 객체의 ‘+ (덧셈)‘ 은 미리 연산자 오버로딩이 된 메소드이다.


제어 구조

- 흐름(절차)을 제어하는 것

선택문 > 반복문 > 분기문


선택문 : if-else - 배타적인 관계로(검사 할 때 많이 사용함) (유효한 값의 범위 : 도메인)

반복문 : while - 조건이 거짓이 될 때까지 반복 (반복 검사)

for - 원하는 만큼의 반복

분기문 : 많은 선택지(비교)를 갖게 되는 선택문 (else-if)의 단점 때문에 분기문을 사용.


파일 입출력

* 콘솔을 이용한 입출력은 객체가 이미 지정되어있지만 파일 입출력은 stream 객체를 지정해 주어야한다.

FileOutputStream fos = new FileOutputStream(“d:\\test.txt”);  // import + 예외처리

fos.write(‘A’);

fos.flush();

fos.close();

* 버퍼는 약 8kb의 크기를 가지고 있다.


배열

입력 -> 데이터 -> 출력의 과정에서 저장소의 필요성이 생김

장점 : 일괄적으로 데이터를 처리할 수 있다. (반복문 사용)


FileInputStream.read(public int read(byte[] b, int off, int len) --> off부터 시작해서 ‘len’바이트를 읽는다.



역참조 연산?



모듈화



스택


동적 할당 - heap 영역


static

인스턴스메소드 (스태틱X) - 객체명을 통해 호출 된다.



캡슐화 - 데이터구조/함수를 묶어놓는것

왜? 캡슐화 된 데이터/함수에 구조가 바뀌게 되었을때 유지보수를 편하게 하기 위해.

캡슐이 실체화되면 객체.


생성자 - 객체가 생성될 때 가장 먼저 실행됨, 입력 O 출력 X

데이터를 초기화 하기 위함 (클래스이름과 동일한 함수명 사용, 반환타입 X)


오버로딩 - 함수명이 중복되었을때

인자가 없는 쪽이 기본, 인자가 있는 쪽이 중복된다고 본다.

this 키워드 -- 오버로딩이 된 함수가 있을 때 this() 키워드를 통해 인자를 전달하여 다른 오버로딩된 메소드를 호출 할 수 있다.

연산자 정리…



코딩을 하면서 여러가지 복합적인 연산을 해야 하는 경우가 있을때 기본적으로 알고 있어야 할 사항 들이다


외우지 못해도 좋다 연산자의 연산 우선순위라는게 존재한다는 것만 알아두면 필요할때 검색하거나 이렇게 찾아서


사용하면 되니까.



문자열 입력


1.숫자 입력

출력 코드 위에다가 각 숫자를 입력하는 코드가 필요

(입력을 하기 위해선 출력문이 필요)

입력버퍼(System.in 입출력은 너무 자주사용하여 정의 해놓았다.)

System.in = new ConsoleInputStream();

int key = System.in.read();

입력을 하기 위해선 입력 버펴에 하나씩 쌓이게 된다.

엔터를 만날때 까지 자료형을 변환해주는 메소드가 존재

next()

nextLine()->하나의 줄을 받아서 변환

nextInt()->스페이스 전까지의 숫자를 변환  >

ex)”30 40 50”을 입력시 30 하나만을 가져오고 버퍼에는 “40 50”이 남아있게 된다.

nextfloat()

Scanner = 문자를 입력할 수 있게 하는 도구 ex)핸드폰

new = 개체화

Scanner scan = 도구는 이름을 붙여 주어야 한다

System.in = 입력 버퍼에 값 전달/종속 객체 ex)배터리

  (배터리를 핸드폰에 주입한다.->즉 System.in을 Scanner에 주입한다.)


Scanner : 입력 버퍼에서 값을 스캔하는 것 ex) Scanner scan = new Scanner(System.in);

+ Recent posts