'Programming/Web Programming'에 해당되는 글 13건

  1. 2018.01.07 [PHP] 카카오톡 자동 응답 봇 구현
  2. 2017.07.22 JavaScript Basic #7
  3. 2017.07.21 JavaScript Basic #6
  4. 2017.07.18 JavaScript Basic #5
  5. 2017.07.18 JavaScript Basic #4
  6. 2017.07.16 JavaScript Basic #3
  7. 2017.07.15 JavaScript Basic #2
  8. 2017.07.13 JavaScript Basic #1
  9. 2017.07.12 CSS #2
  10. 2017.07.12 CSS #1

카카오톡 플러스친구 API를 활용해 자동응답 봇을 만들어보았다. 또한, 우리 학과 홈페이지의 공지사항 중 14일 이내에 게시된 글의 주소를 가져와 응답할 수 있도록 했다. 데이터 파싱에는 PHP Snoopy Class를 활용했다.


웹 어플리케이션 구현에 PHP를 사용했다.

웹서버 설정에서 .php 없이 실행하도록 etc/apache2/apache2.conf(Ubuntu server 기준)의 설정을 다음과 같이 변경해준다.




 

소스코드: https://github.com/BinZlP/KakaoPlusBot

 


#Keyboard.php


<?php

echo <<< EOD

{

    "type" : "buttons",

    "buttons" : ["공지사항 확인", "도움말", "직접 소통하기"]

}

EOD;

?>

 

keyboard.php는 채팅방에 사용자가 처음 들어왔을 때 보여질 입력 옵션을 json data로 반환해야 한다. 간단하게 echo로 위와 같이 구현할 수 있다. , EOD 전후에 공백을 포함한 어떤 문자도 들어가서는 안된다.

 


#Message.php


<?php

include_once 'Snoopy.class.php';

 

function rtn_message(){

           $snoopy = new snoopy;

           $snoopy->fetch("http://cs.kw.ac.kr/department_office/lecture.php");

           $txt = $snoopy->results;

 

           $cs_link = "http://cs.kw.ac.kr";

 

           $rex = "/^site_type=3\"\>.+\<\/a\>$/i";

 

           $rex_a = "|<a[^>]+>(.*)</a>|U";

           $rex_sbj = "/\<td class=\"subject\"\>(.*)\<\/td\>/i";

           $rex_tr = "/\<tr\>(.*)\<\/tr\>/i";

 

           $rex_date = "/[0-9]{4}\-[0-9]{2}\-[0-9]{2}/";

 

           $exp_tr = explode("<tr>",$txt);

 

           $now_date = date("Y-m-d",strtotime("+9 hours"));

           $n_date = date_create(date("Y-m-d"));

 

           $message = "";

 

           for($i = 5;$i<11;$i++){

                     $date = "";

                     $url_a_tag = explode("\"",$exp_tr[$i]);

                     $whole_url = $cs_link . $url_a_tag[5];

                     $slice_a = $url_a_tag[6];

                     $title_str = substr($url_a_tag[6],3,strlen($url_a_tag[6])-19);

 

                     preg_match_all($rex_date,$exp_tr[$i],$date);

                     $t_date = date_create($date[0][0]);

                     $interval = date_diff($n_date,$t_date);

 

                     if($interval->days<=14){

                                // print($date[0][0]);

                               

                                $message = $message."게시일: ".$date[0][0]."\\n";

                                $message = $message.$whole_url."\\n";

                                $message = $message."\\n";

                     }

           }

           if($message==""){

                     $message="최근 14일간 올라온 공지사항이 없습니다.";

           }

           return $message;

}

 

$data = json_decode(file_get_contents('php://input'));

 

if($data->content == "공지사항 확인"){

           $message = rtn_message();

 

           echo <<< EOD

{

           "message":{

                     "text": "$message"

           },

           "keyboard":{

                     "type": "buttons",

                     "buttons" : ["알림 시작하기", "도움말", "직접 소통하기"]

           }

}

EOD;

 

}

if($data->content == "도움말"){

           echo <<< EOD

{

           "message":{

                     "text": "소프트웨어학부 제2대 학생회 [프리]입니다. \\n프리의 플러스친구는 소프트웨어학부의 최근 14일간 공지사항을 버튼 하나로 자동으로 알려주는 기능을 하고 있습니다. \\n또한, 학생회에 질문하거나 전달하고 싶으신 말씀이 있으면 여기에 남겨주세요.",

                     "photo":{

                                "url": "http://server_url/kakao_auto/pree1.jpg",

                                "width": 600,

                                "height": 600

                     },

                      "message_button":{

                                "label": "소프트 학생회 페이스북",

                                "url": "http://www.facebook.com/softwarekw/"

                     }

           },

           "keyboard":{

                     "type": "buttons",

                     "buttons" : ["알림 시작하기", "도움말", "직접 소통하기"]

           }

}

EOD;

}

 

if($data->content == "직접 소통하기"){

           echo <<< EOD

{

           "message":{

                     "text": "소프트웨어학부 제2대 학생회 [프리]입니다. \\n전달하고자 하시는 말씀이 있으시면 여기에 메세지를 남겨주세요. 최대한 빠르게 확인하여 답변 드리도록 하겠습니다."

           },

           "keyboard":{

                     "type": "text"

           }

}

EOD;

}

?>

 

message.php는 특정 입력이 들어왔을 때 응답할 내용과 응답 후 사용자의 키보드를 어떻게 출력할 것인지에 대한 코드가 들어가야 한다. 파싱해온 내용을 message.php에 담아서 보내는 코드이다. , 메시지의 내용은 1000자 이하가 되어야 하고, 1000자 이상이 되었을 때는 결과가 사용자에게 출력되지 않으니 주의해야 한다.

 

 사용자에게 한 번의 요청이 왔으면 응답은 단 한 번만 할 수 있다. 적어도 플러스친구 기본 제공 API에서는 그런 것 같다.

 사용자에게 요청이 오지 않은 상태에서 사용자에게 메시지를 보내기 위해서는 카카오톡의 프로토콜을 모방해야 할 필요가 있어 보인다. 옛날에 LOCO 프로토콜을 사용해 통신할 때는 ID, PW, Device UUID, X-VC Value만 있으면 로그인 패킷, 메시지 전송 패킷을 흉내내어 개인적으로 메시지를 보내는 봇을 구현할 수 있었는데, 2016년쯤에 한 번 프로토콜을 엎었던 걸로 기억한다


'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #7  (0) 2017.07.22
JavaScript Basic #6  (0) 2017.07.21
JavaScript Basic #5  (0) 2017.07.18
JavaScript Basic #4  (0) 2017.07.18
JavaScript Basic #3  (0) 2017.07.16
Posted by BinZIP
Programming/Web Programming2017. 7. 22. 14:31

JavaScript #7 – Object-Oriented (객체지향)

Prototype

객체의 원형. 객체는 property를 가질 수 있는 것은 그 동안 계속 봐왔던 사실임. 그 중 prototype이라는 property는 용도가 약속되어 있음.

Prototype에 저장된 속성들은 생성자를 통해서 객체가 만들어질 때 그 객체에 연결됨.


function Ultra(){}

Ultra.prototype.ultraProp = true;

 

function Super(){}

Super.prototype = new Ultra();

 

function Sub(){}

Sub.prototype = new Super();

 

var o = new Sub();

console.log(o.ultraProp);



생성자 Sub를 통해 만들어진 객체 o에서 ultraProp을 찾을 때 실제로는 o, Sub.prototype, Super.prototype, Ultra.prototype에서 ultraProp을 차례로 찾게 됨. , prototype은 객체와 객체를 연결하는 연결고리 역할을 함. 그래서 이러한 관계를 ‘Prototype Chain’ 이라고 함.

 

Standard Built-in Object (표준 내장 객체)

JavaScript가 기본적으로 가지고 있는 객체. 프로그래밍을 하는데 기본적으로 필요한 도구들.

내장 객체에는 object, function, array, string, Boolean, number, math, date, RegExp가 있음.


var arr = new Array('seoul','new york','ladarkh','pusan', 'Tsukuba');

function getRandomValueFromArray(haystack){

    var index = Math.floor(haystack.length*Math.random());

    return haystack[index];

}

alert(getRandomValueFromArray(arr));

 

위 코드는 배열에서 랜덤한 요소 하나를 가지고 오는 코드임. 그런데 저 코드를 array라는 표준내장 객체에 포함시키면, 모든 array가 마치 원래 array 객체의 메소드인 것처럼 위의 기능을 사용할 수 있음.


Array.prototype.rand = function(){

    var index = Math.floor(this.length*Math.random());

    return this[index];

}

var arr = new Array('seoul','new york','ladarkh','pusan', 'Tsukuba');

alert(arr.rand());

 

Object

Object 객체는 객체의 가장 기본적인 형태를 가지고 있는 객체. 아무것도 상속받지 않는 객체임.

JavaScript의 모든 객체는 Object 객체를 상속받기 때문에 모든 객체는 Object 객체의 Property를 가지고 있음. 또한 Object 객체를 확장해 모든 객체가 접근할 수 있는 API를 만들 수 있음.

 


Object.prototype.contain = function(neddle) {

    for(var name in this){

        if(this[name] === neddle){

            return true;

        }

    }

    return false;

}

var o = {'name':'BinZIP', 'city':'seoul'}

alert(o.contain('BinZIP'));

var a = ['BinZIP','supernice','bin'];

alert(a.contain('supernice'));

 


두 번의 alert 모두 True라고 출력되는 것을 확인할 수 있음.

하지만 Object 객체는 확장하지 않는 것이 좋음. 모든 객체에 영향을 주기 때문에 객체가 기본적으로 가지고 있을 것으로 예상하고 있는 객체 외에 다른 객체를 가지고 있는 것은 혼란스러울 수 있기 때문.


for(var name in o){

    console.log(name); 

}

 


이런 문제를 회피하기 위해서는 해당 객체의 소속인지 확인할 수 있는 hasOwnProperty를 사용할 수 있음.


for(var name in o){

    if(o.hasOwnProperty(name))

        document.write(name+'<br/>'); 

}



 

Data Type

데이터 타입이란 데이터의 형태를 의미함. 데이터 타입은 크게 객체와 객체가 아닌 것, 이 두 가지로 구분할 수 있음.

객체가 아닌 것에는 숫자, 문자열, Boolean(True/False), null, undefined가 있다. 이런 객체가 아닌 데이터 타입을 Primitive Type(원시 데이터 타입)이라고 함. 그 외 모든 데이터 타입들은 객체임.

그런데 아래 코드를 보자.


var str='hello';

document.write(str.length);

document.write('<br/>');

document.write(str.charAt(0));




문자열에 property와 메소드가 있음. 그렇다면 객체라는 의미인데, 문자열은 객체가 아니라고 했음. 이는 내부적으로는 문자열이 Primitive Type이고 문자열 관련 어떤 작업을 하려고 할 때 JavaScript가 임시로 문자열 객체를 만들어 사용하고, 사용이 끝나면 제거하기 때문임.


문자열이 Primitive Type이지만 이와 관련해 필요한 기능성을 객체지향적으로 제공해야 하는 필요 또한 있기 때문에, Primitive Type을 객체처럼 다룰 수 있도록 제공하는 객체가 있음. 이를 Wrapper Object(레퍼객체)라고 부름. Wrapper Object에는 String, Number, Boolean이 있음.

 

참조

다음 코드를 보자.


var a = {'id':1};

var b = a;

alert(b.id);



1이라는 것을 당연히 예상할 수 있음. 그렇다면 다음 코드의 결과를 예측해보자.


var a = {'id':1};

var b = a;

b.id=2;

alert(a.id);




결과는 2. B id의 값을 2로 변경했는데 aid의 값도 2가 되었음. 이는 변수 b a에 담긴 객체가 서로 같음을 의미함.

이는 b에 새로운 객체가 복제되어 생성되는 것이 아니라, a의 객체를 참조하고 있다는 의미임.

그런데, 아래 코드를 보자.


var a = 1;

var b = a;

b = 2;

alert(a+' '+b);




여기서는 a의 값이 바뀌지 않았음. , Primitive Type은 복제되어 들어가고, 객체는 참조함을 확인할 수 있음.


그렇다면 함수에 참조 데이터 타입을 넘겨주면 어떻게 될까? 다음 코드를 보자.


var a = {'id':1};

function func(b){

    b = {'id':2};

}

func(a);

alert(a.id);




함수 func의 파라미터 b로 전달된 값은 객체 a. B를 새로운 객체로 대체하는 것은 b가 가지고 있는 객체를 변형하는 것이기 때문에 객체 a에 영향을 주지 않음. 하지만 아래는 다름.


var a = {'id':1};

function func(b){

    b.id = 2;

}

func(a);

alert(a.id);



이는 b에 새로운 객체를 만들어 적용하는 것이 아닌 참조된 a에 있는 reference의 속성을 바꾸고 있으므로, 그 속성이 소속된 객체를 대상으로 수정한 것임. 그렇기 때문에, aid의 값이 변경됨.

'Programming > Web Programming' 카테고리의 다른 글

[PHP] 카카오톡 자동 응답 봇 구현  (0) 2018.01.07
JavaScript Basic #6  (0) 2017.07.21
JavaScript Basic #5  (0) 2017.07.18
JavaScript Basic #4  (0) 2017.07.18
JavaScript Basic #3  (0) 2017.07.16
Posted by BinZIP
Programming/Web Programming2017. 7. 21. 16:40

JavaScript #6 – Object-Oriented (객체지향)

 

Object-Oriented Programming

객체지향프로그래밍(OOP): 로직을 상태와 행동(변수와 메소드)로 나누고 연관된 것들끼리 그룹핑한 것을 객체라 하고 이를 조립해 프로그래밍을 하는 것.

객체지향의 여러 가지 특성

1.     부품화: 프로그램의 로직들을 기능별로 나눠 부품화하는 것

2.     은닉화, 캡슐화: 로직을 온전히 부품화하기 위해 내부동작법은 숨기고 사용법만 노출하는 것

3.     인터페이스: 부품들간의 접점에서의 규칙, 약속

4.     객체지향은 코드의 재활용성을 높임.

 

객체

객체: 서로 연관된 변수와 함수를 묶은 것

메소드: 객체를 구성하는 함수

생성자: 객체를 만드는 역할을 하는 함수. JavaScript에서 함수는 재사용 가능한 로직의 묶음이 아니라 객체를 만드는 창조자임.


function Person(name){

    this.name = name;

    this.introduce = function(){

        return 'My name is '+this.name;

    }  

}

var p1 = new Person('BinZIP');

document.write(p1.introduce()+"<br />");

 

var p2 = new Person('supernice');

document.write(p2.introduce());



생성자 내에서 객체의 Properties를 정의하는 작업을 초기화라고 함.

생성자 함수는 일반 함수와 구분하기 위해 첫 글자를 대문자로 표시.

 

전역객체

모든 객체는 전역객체의 Property. 그리고 모든 전역변수와 함수는 window 객체의 Properties. 객체를 명시하지 않으면 임시적으로 window property로 간주됨.


var o = {'func':function(){

    alert('Hello?');

}}

o.func();

window.o.func();



Hello?가 두 번 alert 되는 것을 확인할 수 있음. 이에 따라 모든 객체가 기본적으로 전역객체의 property임을 알 수 있음.

 

This

This는 함수 내에서 Context of Calling Function(함수 호출 맥락)을 의미함. 맥락이라는 의미에 따라서, 함수를 어떻게 호출하느냐에 따라 this가 가리키는 대상이 달라짐.

함수를 호출했을 때 this는 전역객체인 window와 같음.


function func(){

    if(window === this){

        document.write("window === this");

    }

}

func();




참고로, 웹브라우저 JavaScript의 전역객체는 window이지만, node.js의 전역객체는 global. 이들의 구성 메소드는 차이가 있기 때문에 알고 있어야 함.

 

객체 소속의 메소드의 this는 그 객체를 가리킴.

 

var o = {

    func : function(){

        if(o === this){

            document.write("o === this");

        }

    }

}

o.func();



 

아래 코드는 함수를 호출했을 때와 new를 이용해서 생성자를 호출했을 때의 차이임


var funcThis = null;

 

function Func(){

    funcThis = this;

}

var o1 = Func();

if(funcThis === window){

    document.write('window <br />');

}

 

var o2 = new Func();

if(funcThis === o2){

    document.write('o2 <br />');

}



생성자는 빈 객체를 만듬. 그리고 이 객체 안에서 this는 만들어진 객체를 가리킴.

생성자가 실행되기 전까지는 객체는 변수에도 할당될 수 없기 때문에 this가 아니면 객체에 대한 어떠한 작업을 할 수 없음.

Apply, call 함수 메소드를 사용하면 this의 값을 제어할 수 있음


var o = {}

var p = {}

function func(){

    switch(this){

        case o:

            document.write('o<br />');

            break;

        case p:

            document.write('p<br />');

            break;

        case window:

            document.write('window<br />');

            break;         

    }

}

func();

func.apply(o);

func.apply(p);



 

상속

객체의 로직을 그대로 물려 받는 또 다른 객체를 만들 수 있는 기능. 하지만 단순히 물려받는 것이라면 의미가 없음. 기존의 로직을 수정하고 변경해서 파생된 새로운 객체를 만들 수 있게 해줌.


function Person(name){

    this.name = name;

    this.introduce = function(){

        return 'My name is '+this.name;

    }  

}

var p1 = new Person('BinZIP');

document.write(p1.introduce()+"<br />");

 


이 코드는 위에서 다뤘던 코드임. 이 코드를 다음과 같이 수정함.


function Person(name){

    this.name = name;

}

Person.prototype.name=null;

Person.prototype.introduce = function(){

    return 'My name is '+this.name;

}

var p1 = new Person('egoing');

document.write(p1.introduce()+"<br />");

 

수정한 코드에 새로운 Programmer라는 생성자를 만들고 이 생성자의 prototype Person 객체를 연결해봄.


function Person(name){

    this.name = name;

}

Person.prototype.name=null;

Person.prototype.introduce = function(){

    return 'My name is '+this.name;

}

 

function Programmer(name){

    this.name = name;

}

Programmer.prototype = new Person();

 

var p1 = new Programmer('BinZIP');

document.write(p1.introduce()+"<br />");



Person 객체의 메소드 introduce Programmer 객체도 사용할 수 있음을 확인함. Programmer Person의 기능을 상속하고 있는 것. 하지만 단순히 똑같은 기능을 갖게 되는 것이 아니라, 부모의 기승을 계승 발전할 수 있는 것이 상속의 가치임.

 

function Person(name){

    this.name = name;

}

Person.prototype.name=null;

Person.prototype.introduce = function(){

    return 'My name is '+this.name;

}

 

function Programmer(name){

    this.name = name;

}

Programmer.prototype = new Person();

Programmer.prototype.job = function(){

    return "Job : Programmer";

}

 

var p1 = new Programmer('BinZIP');

document.write(p1.introduce()+"<br />");

document.write(p1.job()+"<br />");



ProgrammerPerson의 기능을 가지면서 job이란 메소드를 부가적으로 가지고 있음을 확인할 수 있음.

 

 

'Programming > Web Programming' 카테고리의 다른 글

[PHP] 카카오톡 자동 응답 봇 구현  (0) 2018.01.07
JavaScript Basic #7  (0) 2017.07.22
JavaScript Basic #5  (0) 2017.07.18
JavaScript Basic #4  (0) 2017.07.18
JavaScript Basic #3  (0) 2017.07.16
Posted by BinZIP
Programming/Web Programming2017. 7. 18. 16:12

JavaScript #5 – 함수 지향 (Function-Oriented)

 

클로저 (Closure)

내부 함수가 외부 함수의 Context에 접근할 수 있는 것을 가리킴.

JavaScript는 함수 안에서 또 다시 함수를 선언할 수 있음. 외부함수 안에 선언된 함수를 내부함수라고 할 때, 외부함수의 지역변수에 내부함수는 접근할 수 있음.


이러한 관계에서 외부함수가 실행이 끝나서 소멸된 이후에도 내부함수가 소멸된 외부함수의 변수에 접근할 수 있는 메커니즘을 클로저라고 함.

 

function outter(){

    var title = 'coding everybody'; 

    return function(){       

        alert(title);

    }

}

inner = outter();

inner();



위 코드를 살펴보면 inner에는 outter의 결과가 대입되는데, 그 결과가 이름 없는 함수임. inner(); 명령을 실행할 때는 이미 outter 함수의 실행은 끝났기 때문에 outter 함수의 지역변수인 title은 소멸되어야 하지만, 실행 결과는 title의 문자열인 ‘coding everybody’가 그대로 나온다. 이는 title이 소멸되지 않았음을 의미함.

이를 통해 의부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸되기 전까지 소멸하지 않는 것을 알 수 있음. 이런 특성이 바로 클로저’.

더 복잡한 예시:

 

function factory_movie(title){

    return {

        get_title : function (){

            return title;

        },

        set_title : function(_title){

            title = _title

        }

    }

}

ghost = factory_movie('Ghost in the shell');

matrix = factory_movie('Matrix');

 

alert(ghost.get_title());

alert(matrix.get_title());

 

ghost.set_title('공각기동대');

 

alert(ghost.get_title());

alert(matrix.get_title());

 





Ghost 변수와 matrix 변수는 각각 factory_movie 함수의 리턴값으로 객체를 받고 있음. 둘 다 title이라는 factory_movie의 지역변수를 사용하지만 alert 결과에서 볼 수 있듯이 각각 다른 결과를 보여주고 있음. 이를 통해 외부 함수가 실행될 때마다 새로운 지역변수를 포함시키는 클로저가 생성되어, ghost matrix에 있는 title은 완전히 독립된 개체가 되었음을 알 수 있음.

JavaScript Private 속성을 지원하지 않음. 하지만 위의 factory_movie 함수의 지역변수 title은 함수 안에서 정의된 메소드에 의해서 만들어진 객체만이 값을 읽고 수정하는게 가능하다는 클로저의 특성을 이용해 Private 속성을 구현할 수 있음.

 

다음 예시를 보자.


var arr = []

for(var i = 0; i < 5; i++){

    arr[i] = function(){

        return i;

    }

}

for(var index in arr) {

    document.write(arr[index]()+'<br/>');

}



0, 1, 2, 3, 4가 출력될 것이라고 예상하기 쉬움. 하지만 for문은 함수가 아님. 그렇기 때문에 for문에 있는 i값에 함수 function이 접근할 수 없기 때문에, for문이 모두 돌고 난 뒤 5가 된 i값이 한번에 적용된 것. 원래 의도대로 출력되게 하려면 다음과 같이 바꿔야함.


var arr = []

for(var i = 0; i < 5; i++){

    arr[i] = function(id) {

        return function(){

            return id;

        }

    }(i);

}

for(var index in arr) {

    document.write(arr[index]()+’<br/>’);

}



 

Arguments

함수에는 arguments라는 숨겨진 유사 배열이 있음. 함수를 호출할 때 입력한 인자가 담겨 있음.


function sum(){

    var i, _sum = 0;   

    for(i = 0; i < arguments.length; i++){

        document.write(i+' : '+arguments[i]+'<br />');

        _sum += arguments[i];

    }  

    return _sum;

}

alert('result : ' + sum(1,2,3,4));



Arguments는 함수 안에서 사용할 수 있도록 그 이름이나 특성이 약속되어 있는 arguments 객체의 인스턴스임. 배열과 비슷하지만 배열은 아님. arguments[0]은 함수에 전달된 첫 번째 인자를 알아낼 수 있음.

매개변수와 관련해 두 가지 수가 있음. 하나는 함수.length, 다른 하나는 arguments.length. 함수.length는 함수에 정의된 인자의 수를, arguments.length는 함수에 전달된 실제 인자의 수를 의미함.

 

function zero(){

    document.write(

        'zero.length : ', zero.length+'<br/>',

        'arguments : ', arguments.length+'<br/>'

    );

}

function one(arg1){

    document.write(

        'one.length : ', one.length+'<br/>',

        'arguments : ', arguments.length+'<br/>'

    );

}

function two(arg1, arg2){

    document.write(

        'two.length : ', two.length+'<br/>',

        'arguments : ', arguments.length+'<br/>'

    );

}

zero();

one('val1', 'val2');

two('val1');



 

함수 호출


function func(){

}

func();


JavaScript는 함수를 호출하는 특별한 방법을 제공함. JavaScript에서 함수는 객체임. 위 예시 코드에서 함수 func Function이라는 객체의 인스턴스임. 따라서, func Function이 가지고 있는 메소드들을 상속하고 있음. 그 중 Function.apply Function.call을 활용해봄.

 

function sum(arg1, arg2){

    return arg1+arg2;

}

alert(sum.apply(null, [1,2]))



---


o1 = {val1:1, val2:2, val3:3};

o2 = {v1:10, v2:50, v3:100, v4:25};

function sum(){

    var _sum = 0;

    for(name in this){

        _sum += this[name];

    }

    return _sum;

}

document.write(sum.apply(o1));

document.write('<br/>');

document.write(sum.apply(o2));



Sum 함수는 내부에서 객체의 속성을 열거할 때 사용하는 for in 문을 이용해서 객체 자신의 값을 열거한 후에 각 속성의 값을 지역변수 _sum에 더한 후 리턴하고 있음.

메소드 apply의 첫 번째 인자는 함수가 실행될 맥락임. 객체의 메소드로 sum을 만들고 호출한 뒤에 만들었던 sum 역할을 하는 메소드를 삭제한다고 생각하면 됨. sum이 객체 소속의 메소드가 된다는 것은 ‘sum에서 this의 값이 전역객체가 아니라 객체가 된다는 뜻임. 일반적으로 객체지향 언어에서는 하나의 객체에 소속된 함수는 그 객체의 소유물임. 하지만 JavaScript에서는 함수는 독립된 개체로 존재하고, apply call 메소드를 통해 다른 객체의 소유물인 것처럼 실행할 수 있음.

만약 apply의 첫 인자로 null을 전달하면 apply가 실행된 함수 인스턴스는 전역객체를 context로 실행하게 됨. 브라우저의 경우는 함수가 실행된 window가 될 것임.

 

'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #7  (0) 2017.07.22
JavaScript Basic #6  (0) 2017.07.21
JavaScript Basic #4  (0) 2017.07.18
JavaScript Basic #3  (0) 2017.07.16
JavaScript Basic #2  (0) 2017.07.15
Posted by BinZIP
Programming/Web Programming2017. 7. 18. 02:34

JavaScript #4 – 함수 지향 (Function-Oriented)


유효범위

유효 범위란 변수의 수명을 의미. 함수 밖에서 선언한 변수는 전역 변수(global variable)이 되고,안에서 선언하면 지역변수(local variable)이 됨.


var vscope = 'global';

function fscope(){

    var vscope = 'local';

    alert('함수안 '+vscope);

}

fscope();

alert('함수밖 '+vscope);




함수 안에서 vscope를 새로 정의하면 전역 변수 vscope는 제쳐두고 함수 안에서의 vscope를 새로 생성함. 이러한 사실은 다음 코드를 실행해보면 알 수 있음.


var vscope = 'global';

function fscope(){

    vscope = 'local';

    alert('함수안'+vscope);

}

fscope();

alert('함수밖'+vscope);




함수 안에서 vscope의 값을 ‘local’로 바꾸어 주었기 때문에 밖에서 전역변수 vscope를 호출해도 ‘local’이 출력됨.


변수를 선언할 때는 꼭 var을 붙이는 것을 습관화해야 한다. 전역변수를 사용해야 하는 경우라면 그것을 사용하는 이유를 명확히 알고 있을 때 사용하도록 하자.’


불가피하게 전역 변수를 사용해야 할 때는 하나의 객체를 전역변수로 만들고 객체의 속성을 변수로 관리하는 방법 사용.


MYAPP = {}

MYAPP.calculator = {

    'left' : null,

    'right' : null

}

MYAPP.coordinate = {

    'left' : null,

    'right' : null

}

 

MYAPP.calculator.left = 10;

MYAPP.calculator.right = 20;

function sum(){

    return MYAPP.calculator.left + MYAPP.calculator.right;

}

 

전역변수를 사용하고 싶지 않다면 익명 함수를 호출하는 것으로 대체할 수 있음.


(function(){

    var MYAPP = {}

    MYAPP.calculator = {

        'left' : null,

        'right' : null

    }

    MYAPP.coordinate = {

        'left' : null,

        'right' : null

    }

    MYAPP.calculator.left = 10;

    MYAPP.calculator.right = 20;

    function sum(){

        return MYAPP.calculator.left + MYAPP.calculator.right;

    }

    document.write(sum());

}())

 

JavaScript는 블록범위(중괄호 기준으로)를 기준으로 유효범위를 제공하는데 반해 함수에 대한 유효범위만 제공. , 지역변수는 함수에서만 유효.

JavaScript는 함수가 선언된 시점에서의 유효범위를 가짐.

ð  이러한 유효범위 방식을 정적 유효범위(Static Scoping), 혹은 렉시컬(Lexical Scoping)이라고 함.


var i = 5;

function a(){

    var i = 10;

    b();

}

function b(){

    document.write(i);

}

a();



 

값으로서의 함수

JavaScript에서는 함수도 객체, 즉 일종의 값임. 그러므로 객체의 값으로 포함될수도, 다른 함수의 인자로 전달될수도 있음.


function cal(func, num){

    return func(num)

}

function increase(num){

    return num+1

}

function decrease(num){

    return num-1

}

alert(cal(increase, 1));

alert(cal(decrease, 1));




함수는 함수의 리턴 값으로도 사용 가능하고, 객체로써 포함될 수 있으므로 당연히 배열의 값으로도 사용할 수 있음.


function cal(mode){

    var funcs = {

        'plus' : function(left, right){return left + right},

        'minus' : function(left, right){return left - right}

    }

    return funcs[mode];

}

alert(cal('plus')(2,1));

alert(cal('minus')(2,1));





var process = [

    function(input){ return input + 10;},

    function(input){ return input * input;},

    function(input){ return input / 2;}

];

var input = 1;

for(var i = 0; i < process.length; i++){

    input = process[i](input);

}

alert(input);



 

함수가 값으로 사용될 수 있다는 특성을 사용해 함수의 인자로 전달할 수도 있음. 이는 콜백의 특성.

 

콜백: 다른 코드의 인수로서 넘겨주는 실행 가능한 코드. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있음.

일반적으로 콜백 수신 코드로 콜백 코드(함수)를 전달할 때는 콜백 함수의 포인터 (핸들), 서브루틴 또는 람다함수의 형태로 넘겨준다. 콜백수신 코드는 실행하는 동안에 넘겨받은 콜백 코드를 필요에 따라 호출하고 다른 작업을 실행하는 경우도 있다. 다른 방식으로는 콜백수신 코드는 넘겨받은 콜백 함수를 '핸들러'로서 등록하고, 콜백수신 함수의 동작 중 어떠한 반응의 일부로서 나중에 호출할 때 사용할 수도 있다 (비동기 콜백).

 

값으로 전달된 함수(Callee)는 호출될 수 있다는 점을 이용해 Caller 함수의 동작을 완전히 바꿀 수 있음.



function sortNumber(a,b){

    return b-a;

}

var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];

alert(numbers.sort(sortNumber));




원래 sort는 숫자를 순서대로 정렬하지만 sortNumber 함수를 인자로 넘겨줌으로써 역순으로 정렬하게 되었다.

시간이 오래 걸리는 작업이 있을 때 이 작업이 완료된 후에 처리해야 할 일을 콜백으로 지정하면, 해당 작업이 끝났을 때 미리 등록한 작업이 실행되도록 비동기 처리를 할 수 있다.


생활코딩의 비동기 처리 강의에서는 이런 예시를 들었다. 글을 작성하면 구독자에게 이메일을 보낸 후 작성완료 문구를 띄우는 홈페이지를 사용한다고 가정한다. 여기서 글을 작성하고 구독자에게 이메일을 보내는 작업을 끝낸 후 작성 완료 문구를 띄우는 것은 일을 순차적으로 처리하는 ‘동기 처리’이다. 그런데 여기서 글을 작성하고 구독자들에게 이메일을 보내는 작업을 예약시키기만 하고 바로 작성 완료 문구를 띄운다. 그리고 클라이언트 쪽에서는 보이지 않게 백그라운드에서 이메일 발송 예약이 있는지 지속적으로 확인해 발송하는 작업을 하는 프로그램을 통해 이메일을 전송하는 작업을 계속 한다면, 이것은 비동기 처리이다.

 


 

 

'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #6  (0) 2017.07.21
JavaScript Basic #5  (0) 2017.07.18
JavaScript Basic #3  (0) 2017.07.16
JavaScript Basic #2  (0) 2017.07.15
JavaScript Basic #1  (0) 2017.07.13
Posted by BinZIP
Programming/Web Programming2017. 7. 16. 02:33

JavaScript#3


UI & API


API: Application Programming Interface, 프로그램에서 사용할 수 있도록 OS나 프로그래밍 언어가 제공하는 기능을 제어하기 위해 만든 조작 장치.

UI: User Interface, 유저가 직접 프로그램을 사용할 때 제공되는 인터페이스.

Java Script API는 크게 JavaScript 자체 API JavaScript가 동작하는 호스트 환경의 API로 구분

 

정규표현식


Regular Expression. 문자열에서 특정한 문자를 찾아내는 도구.

정규표현식은 두 가지 단계로 이루어짐. 하나는 컴파일, 다른 하나는 실행.


1.    컴파일 (Compile)


-       검출하고자 하는 패턴을 만드는 일.

-       먼저 정규표현식 객체를 만들어야 함. 객체를 만드는 방법은 두 가지가 있음.

1.      정규표현식 리터럴:


var pattern = /a/


2.      정규표현식 객체 생성자:


var pattern = new RegExp(‘a’);

위 코드는 정규표현식 리터럴에 예시로 적은 코드와 같은 역할을 함.

 

2.    실행 (Execution)


정규표현식 메소드 실행

-       RegExp.exec(‘인자’): 입력한 패턴(RegExp의 괄호 안에 넣은 문자열)이 제공받은 인자 안에 있으면 패턴을 반환


alert(pattern.exec(‘asdf1234’));

alert(pattern.exec(‘qwerzxcv’));




인자에서 a를 찾으면 a라는 문자열을 반환하고, 그렇지 않으면 null을 반환하는 것을 볼 수 있음.

 

-       RegExp.test(‘인자’): 인자 안에 패턴에 해당되는 문자열이 있으면 True, 아니면 False를 반환


alert(pattern.test(‘asdf1234’));

alert(pattern.test(‘qwerzxcv’));




‘a’ 패턴이 있는 문자열에서는 true, 없는 문자열에서는 ‘false’를 반환하는 것을 확인할 수 있음.

 

문자열 메소드 실행

-       String.match(RegExp): RegExp.exec(‘인자’)와 비슷함.


alert(‘asdf1234’.match(pattern));

alert(‘qwerzxcv’.match(pattern));




패턴에 해당하는 문자가 String에 있으면 패턴의 문자열을 리턴, 그렇지 않으면 null을 리턴하는 것을 확인할 수 있음.

-       String.replace(RegExp, ‘변경할 문자열’): String에서 패턴을 검색해 패턴에 해당하는 부분을 변경할 문자열로 바꾸고 변경된 값을 리턴


alert(‘asdf1234’.replace(pattern,’q’));

alert(‘qwerzxcv’.replace(pattern,’q’));




String a q로 바뀌어 출력되는 것을 볼 수 있음.

옵션

-       i: i를 붙이면 대/소문자를 구분하지 않음.


alert('ASDF1234'.match(noCheckC));




-       g: 검색된 모든 결과 리턴


var Check = /a/;

var CheckAll = /a/g;

alert('asdfasdfasdf'.match(Check));

alert('asdfasdfasdf'.match(CheckAll));




-       캡처: 괄호 안의 패턴은 마치 변수처럼 재사용 할 수 있음.


var pattern = /(\w+)\s(\w+)/;

var str = "coding everybody";

var result = str.replace(pattern, "$2, $1");

alert(result);


공백(\s)을 기준으로 문자열이 2개의 그룹으로 나뉘었다고 생각하면 됨. , ‘coding’이라는 문자열이 $1, ‘everybody’라는 문자열이 $2인 것임.


-       치환


var urlPattern = /\b(?:https?):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*/gim;

var content = '빈집 채우는 중 : http://binzip2.tistory.com 입니다.';

var result = content.replace(urlPattern, function(url){

    return '<a href="'+url+'">'+url+'</a>';

});

alert(result);



Html 하이퍼링크 태그로 치환시킨 것을 볼 수 있음.

'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #5  (0) 2017.07.18
JavaScript Basic #4  (0) 2017.07.18
JavaScript Basic #2  (0) 2017.07.15
JavaScript Basic #1  (0) 2017.07.13
CSS #2  (0) 2017.07.12
Posted by BinZIP
Programming/Web Programming2017. 7. 15. 04:58

JavaScript #2


연산자


대입 연산자

- =: 우항의 값을 좌항의 변수에 대입

비교 연산자

1.     ==: 동등 연산자. 좌항과 우항을 비교해 값이 서로 같으면 True, 다르면 False

2.     ===: 일치 연산자. 좌항과 우항이 모든 부분에서 정확하게 같으면’ True, 아니면 False

예를 들어, alert(1==’1’) True라고 출력되지만 alert(1===’1’) False가 출력. 같은 수를 표현하고 있지만 데이터 형이 다르기 때문에 일치 연산자에서는 False를 반환.

일반적으로 동등 연산자(==) 보다 일치 연산자(===)을 사용할 것을 권함. 다음 예시를 보자.


참고로 null은 값이 없음을 명시적으로 표시한 것이고, undefined는 값이 없는 상태이다.

3.     !=: 동등 연산자와 반대 결과를 출력한다.

4.     !==: 일치 연산자와 반대 결과를 출력한다.

5.     >: 좌항이 우항보다 크면 참, 그렇지 않다면 거짓이다. ‘<’ >의 반대이다.

6.     >=: 좌항이 우항보다 크거나 같으면 참, 그렇지 않다면 거짓이다. 마찬가지로 ‘<=’는 반대이다.

7.     &&: 좌항과 우항이 모두 참일 때 참이 된다. (AND)

8.     ||: 좌항과 우항 중 하나가 참일 때 참이 된다. (OR)

9.     !: ‘!’는 부정을 의미한다. , True 혹은 False를 역전시키는 연산자이다. (NOT)

 

조건문

1.     If: if 뒤의 괄호에 조건이 오고, True라면 조건이 담겨진 괄호 다음의 중괄호 구문이 실행됨

2.     Else: if 문 안에 담긴 조건문의 값이 False일 때 중괄호 안의 코드가 실행된다.

3.     Else if: 이전 if문의 판별식의 결과가 False일 때 다시 한 번 조건을 걸어 참과 거짓을 판결해 참일 때 중괄호 안의 코드를 실행한다.

조건문이 참과 거짓을 판별할 때 판별식의 결과가 ‘0’이면 거짓, ‘0’이 아닌 거의 모든 값을 참으로 인식한다. 0 이외에 False로 간주되는 것들에는 ’’(빈 문자열, undefined, 값이 할당되지 않은 변수, null, NaN이 있다.

 

반복문


1.     While: 조건문을 만족시키는 동안 중괄호 안의 코드를 계속 반복한다.

2.     For: 기본 구조는 for(초기문;조건문;증감식){ 코드 } 이다. 초기문은 for문에 최초에 진입할 때 한 번만 실행된다. 이후 조건문을 판별하고 참이면 코드를 모두 실행하고, 증감문 실행 후 다시 판별, 참이면 다시 코드를 실행하며 거짓이면 for문을 탈출한다.

3.     Break: 반복문을 탈출하는 역할을 한다.

4.     Continue: 반복문의 처음으로 이동한다. 반복문 안의 코드를 즉시 중단하고 반복은 지속되게 할 때 사용한다. for문의 경우는 증감식으로, while문의 경우 판별식으로 이동한다.

 

함수


function add( var a, var b ){

           alert(a);

           alert(b);

           return a+b;

}

함수를 정의할 때 function 뒤에 함수 이름(add), 소괄호 안에는 전달하는 인자를 써 넣는다. 각각의 인자는 콤마(,)로 구분짓는다. 함수가 호출되면 중괄호 안의 코드(alert(a); alert(b);)를 실행하고 반환값(a+b) return 한다.

 

배열


여러 개의 데이터를 하나의 변수에 담음. 기본 구조는 다음과 같음.


var 배열명 = [‘첫 번째 요소’, ‘두 번째 요소’, …]

첫 번째 요소는 0 번째 인덱스이다. n번째 인덱스에 있는 요소는 n+1번째 요소인 셈. member라는 배열의 n번째 요소를 alert하는 명령은 alert(member[n-1]); . n-1을 감싸는 것은 대괄호임에 주의.


배열 요소 추가/제거/정렬

1.     Push: 배열의 맨 끝에 원소를 추가

2.     Concat: 배열의 맨 끝에 여러 개의 원소를 추가

3.     Unshift: 배열의 시작점에 원소를 추가

4.     Splice: 배열의 첫 번째 인자에 해당하는 원소부터 두 번째 인자에 해당하는 원소의 숫자만큼 값을 배열로부터 제거한 후 리턴, 세 번째 인자부터 전달된 인자들을 첫 번째 인자의 원소 뒤에 추가.


5.     Shift: 배열의 첫 번째 원소를 제거

6.     Pop: 배열의 마지막 원소를 제거

7.     Sort: 배열을 정렬

8.     Reverse: 배열을 역순으로 정렬

 

객체


var level = {‘BinZIP’:1, ‘Newbie’:1, ‘ZzangHacker’:999};

위와 같이 객체를 선언할 수 있다. BinZIP key가 되고, 1 value에 해당함. 아래와 같이 객체를 만들 수도 있음.


var level = new Object();

level[‘BinZIP’] = 1;

level[‘Newbie’] = 1;

level[‘ZzangHacker’] = 999;

for문은 in 뒤에 따라오는 배열의 key 값을 in 앞의 변수에 담아서 반복문을 실행. 반복문이 실행될 때 변수 값에 key 값이 순차적으로 할당됨.

객체에는 객체를 담을 수도, 함수를 담을 수도 있음. 아래 코드를 참고.


var grade = {

           'list': {'BinZIP':1,'Newbie':1,'ZzangHacker':999},

           'show': function(){

                     for(var name in this.list){

                                alert(name+':'+this.list[name]);

                     }

           }

};

grade.show();

실행 결과는 다음과 같음.





 

모듈


객체지향형 프로그래밍이 등장하게 된 배경은 코드의 재활용성을 높이고 유지보수를 쉽게 하기 위해서라고 할 수 있음. 이런 목적을 위해 다양한 기법들이 사용되는데, 그 중 하나가 코드를 여러 개의 파일로 구분하는 것임. 이를 통해서 얻을 수 있는 효과는 다음과 같음.

ð  자주 사용되는 코드를 별도의 파일로 만들어 필요할 때마다 재활용 가능

ð  코드를 개선하면 이를 사용하는 모든 애플리케이션의 동작에 적용

ð  코드 수정 시에 필요한 로직 빠르게 찾을 수 있음

ð  필요한 것만 로드해 메모리 낭비를 줄임

ð  한 번 다운로드 된 모듈은 웹 브라우저에 의해 저장되기 때문에 동일한 로직을 로드 할 때 시간과 네트워크 트래픽 절약 가능. 이는 웹 브라우저에만 해당되는 장점.

모듈은 라이브러리, C언어 및 다른 여러 언어의 헤더 파일과 비슷한 개념으로 생각할 수 있음. 라이브러리는 잘 정렬된 코드의 집합이라고 생각하면 됨

모듈을 로드하기 위해서는 <head> 범위 안에 다음과 같이 작성해줌.


<script scr=”모듈의 주소”></script>

 

node.js에서 모듈 로드

모듈을 로드하는 방법은 호스트의 환경에 따라서 달라짐. 아래 그림 참고(출처: 생활코딩 JavaScript 기본 객체 – node.js에서의 모듈의 로드)


 

라이브러리 사용

모듈과 라이브러리를 사용해야 하는 이유를 단적으로 보여주는 예시이다.


<!DOCTYPE html>

<html>

<head>

    <script src="https://code.jquery.com/jquery-1.11.0.min.js"></script>

</head>

<body>

    <ul id="list">

        <li>empty</li>

        <li>empty</li>

        <li>empty</li>

        <li>empty</li>

    </ul>

    <input id="execute_btn" type="button" value="execute" />

    <script type="text/javascript">

     $('#execute_btn').click(function(){

        $('#list li').text('coding everybody');

     })

    </script>

</body>

</html>

위 코드는 유명 라이브러리인 jQuery를 사용해 버튼을 클릭했을 때 ‘Coding Everybody’ 화면의 empty가 있는 자리에 출력하는 예시이다. 동일한 코드를 jQuery 라이브러리를 사용하지 않고 구현한 코드는 다음과 같다.


<!DOCTYPE html>

<html>

<body>

    <ul id="list">

        <li>empty</li>

        <li>empty</li>

        <li>empty</li>

        <li>empty</li>

    </ul>

    <input id="execute_btn" type="button" value="execute" />

    <script type="text/javascript">

    function addEvent(target, eventType,eventHandler, useCapture) {

        if (target.addEventListener) { // W3C DOM

            target.addEventListener(eventType,eventHandler,useCapture?useCapture:false);

        } else if (target.attachEvent) {  // IE DOM

            var r = target.attachEvent("on"+eventType, eventHandler);

        }

    }

    function clickHandler(event) {

        var nav = document.getElementById('list');

        for(var i = 0; i < nav.childNodes.length; i++) {

            var child = nav.childNodes[i];

            if(child.nodeType==3)

                continue;

            child.innerText = 'Coding everybody';

        }

    }

    addEvent(document.getElementById('execute_btn'), 'click', clickHandler);

    </script>

</body>

</html>

 




'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #4  (0) 2017.07.18
JavaScript Basic #3  (0) 2017.07.16
JavaScript Basic #1  (0) 2017.07.13
CSS #2  (0) 2017.07.12
CSS #1  (0) 2017.07.12
Posted by BinZIP
Programming/Web Programming2017. 7. 13. 03:53

Javascript(JS)

Javascript는 웹페이지를 동적으로, 프로그래밍적으로 제어하기 위해 고안된 언어

오늘날 가장 중요한 플랫폼이라고 할 수 있는 웹 브라우저에서 유일하게 사용할 수 있는 프로그래밍 언어

HTML이 한 번 화면에 출력된 후에는 그 형태나 동작 방법을 바꿀 수 없는 문제를 해결하기 위해서 네스케이프에서 만들어짐

ECMA라는 표준화 기구가 현재 JavaScript의 관리 주체

 

Hello, World!

다음과 같은 HTML 문서를 작성

 

<!DOCTYPE html>

<html>

           <head>

                     <meta charset="utf-8">

                     <title>Exercise </title>

           </head>

           <body>

                     <script>

                                alert('Hello, World!');

                     </script>

           </body>

</html>



우리가 중요하게 볼 것은 <script>…</script> 안에 있는 내용이다. 이것이 바로 JavaScript의 코드. <script> 태그는 이 부분부터 JavaScript의 문법에 따라서 해석해서 실행하라고 알려주는 셈

이렇게 HTML을 직접 작성하는 방법도 있는가 하면, 크롬의 개발자 도구의 콘솔 창을 이용할수도 있음. 콘솔 창을 띄우는 방법은 [Ctrl+Shift+J]를 키보드로 입력하면 됨 (참고: Mac 사용자의 경우 [Alt+Command+J])


 

숫자 & 문자

JavaScript에서는 큰따옴표(“)나 작은따옴표(‘)가 붙지 않은 숫자는 숫자로 인식함


연산 기호: +, -, *, /

Math.pow(a,b) // ab

Math.round(a); // a를 반올림

Math.ceil(a); // a 올림

Math.floor(a); // a 버림

Math.sqrt(a); // a의 제곱근

Math.random(); // 0부터 1.0 사이의 랜덤한 숫자

 

문자는 큰따옴표나 작은따옴표로 감싸야 함


만약 따옴표가 없으면 다음과 같은 결과가 출력됨



따옴표가 붙으면 string 형식인 것을 알 수 있음

문자열 안에 를 넣고 싶을 때는 C언어에서 처럼 그 앞에 ‘\’를 붙여주면 됨


여러 줄로 표시하고 싶을 때는 C언어와 마찬가지로 ‘\n’을 사용함

문자열을 이어 붙여서 표시하고 싶을 때는 +를 사용함


문자열의 길이를 구하고 싶을 때는 문자 뒤에 .length를 붙임


변수

var로 정의. 다른 변수형도 있지만 나중에 차례로 할 예정


문자열도 변수에 저장 가능함


주석은 C에서와 같이 ‘//’를 사용

'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #3  (0) 2017.07.16
JavaScript Basic #2  (0) 2017.07.15
CSS #2  (0) 2017.07.12
CSS #1  (0) 2017.07.12
HTML Basic #3  (0) 2017.07.10
Posted by BinZIP
Programming/Web Programming2017. 7. 12. 15:54

CSS #2

 

레이아웃 구성 스타일

1.    display

             - 페이지의 태그 간의 배치를 결정

             => display:block;: 태그를 블록 형식으로 구성

             => display:inline;: 태그를 인라인 형식으로 구성

             => display:inline-block;: 태그를 인라인블록 형식으로 구성

             => display:none;: 태그를 화면에 표시하지 않음

 

#cssex10_1.css

@charset "utf-8";

body { display:block; width:950px; margin:0; padding:0; }

#head_area { float:left; width:100%; background-color:yellow; }

#foot_area { clear:both; width:100%; background-color:yellow; }

#wrapper { width:950px; }

#left_area { float:left; width:200px; background-color:aqua; min-height:100px; }

#content_area { float:left; width:300px; background-color:#fff; min-height:100px; }

#right_area { float:left; width:150px; background-color:skyblue; min-height:100px; }

 

#cssex10_2.html

<head>

             <title> 레이아웃 구성하기 </title>

             <meta charset="utf-8" />

             <link href="./cssex10_1.css" rel="stylesheet" />

</head>

<body>

             <div id="head_area"> HEADER </div>

             <div id="wrapper">

                           <div id="left_area"> LEFT </div>

                           <div id="content_area"> CONTENT </div>

                           <div id="right_area"> RIGHT </div>

             </div>

             <div id="foot_area"> FOOTER </div>

</body>

 


 

 

2.    Flexible Box Model

             - 문서 구조를 나타내는 레이아웃이 나타나는 화면의 크기에 따라 유연하게 크기가 다시 조정되어 콘텐츠를 보여주는 구조를 의미

             - 하나의 컨텐츠를 다양한 크기의 기기에서 보여 유용하게 사용됨

             => display:속성값;: 태그를 박스(box) 또는 인라인 박스(inline-box) 설정

             => box-orient:속성값;: 박스의 방향을 수평(horizontal), 수직(vertical)으로 지정

             => box-pack:속성값;: 박스의 배치(:start, :end, 가운데:center, 분배:justify) 지정

             => box-flex:속성값;: 박스를 유연하게 하거나 (1 이상의 ) 유연하지 않게(0) 설정

 

#cssex11_1.css

@charset "utf-8";

body { text-align:center; padding:0; margin:0; }

header { width:100%; background-color:yellow; }

footer { width:100%; background-color:yellow; }

section { width:100%; box-orient:horizontal; display:box; display:-moz-box; display:-webkit-box; }

#box-1 { box-flex:1; -webkit-box-flex:1; min-height:100px; background-color:aqua; }

#box-2 { box-flex:1; -webkit-box-flex:1; min-height:100px; background-color:#ccc; }

#box-3 { box-flex:1; -webkit-box-flex:1; min-height:100px; background-color:aqua; }

 

#cssex11_2.html

<!DOCTYPE html>

<html lang="ko">

             <head>

                           <title> 유연한 박스 모델 구성하기 </title>

                           <meta charset="utf-8" />

                           <link href="./cssex11_1.css" rel="stylesheet" />

             </head>

             <body>

                           <header>

                           <h1> HEADER </h1>

                           <p> 머리글 영역입니다. </p>

                           </header>

                           <section>

                                        <nav id="box-1">

                                                     <h1> LEFT </h1>

                                                     <p> 이곳은 왼쪽 영역입니다. </p>

                                                     <p> 내비게이션을 주로 작성하는 곳으로 사용됩니다. </p>

                                        </nav>

                                        <article id="box-2">

                                                     <h1> CONTENT </h1>

                                                     <p> 이곳은 가운데 영역입니다. </p>

                                                     <p> 주요 본문을 주로 작성하는 곳으로 사용됩니다. </p>

                                        </article>

                                        <aside id="box-3">

                                                     <h1> RIGHT </h1>

                                                     <p> 이곳은 오른쪽 영역입니다. </p>

                                                     <p> 어사이드 내용을 주로 작성하는 곳으로 사용됩니다. </p>

                                        </aside>

                           </section>

                           <footer>

                                        <h1> FOOTER </h1>

                                        <p> 바닥글 영역입니다. </p>

                           </footer>

             </body>

</html>


 

이런 유연한 구조를 가진 웹페이지를  동적 페이지라고 한다.

 

 

 

 

메뉴 레이아웃 구성해보기

 

#cssexadv_1.css

@charset"utf-8";

* { margin:0; }

ul, li { list-style:none; }

a { color:#fff; text-decoration:underline; }

a:hover { color:#000; text-decoration:none; }

.gnb{padding:0}

.gnb a {width:135px; padding:0 5px 0 5px; display:block; text-decoration:none; }

.gnb li { position:relative; float:left; margin-right:11px; }

.gnb li a { height:50px;text-align:center; line-height:50px; font-size:1.05em; color:#000; }

.gnb li a:hover { color:#09f; }

.gnb li ul { display:none; position:absolute; top:50px; left:0; }

.gnb li:hover ul { display:block; }

.gnb li ul a {width:120px; height:35px; background-color:#000; color:#fff; text-align:center; line-height:37px; border-bottom:1px solid #fff; }

.gnb li ul a:hover { background-color:#555; }

#wrap{width:980px; height:auto; float:left;}

#main_menu{width:700px; height:50px; float:left; background:#92c121;}

 

#cssexadv_2.html

<!DOCTYPE html>

<html lang="ko">

             <head>

                           <title>메인 메뉴</title>

                           <meta charset="utf-8" />

                           <link href="./cssexadv_1.css" rel="stylesheet" />

             </head>

             <body>

                           <div id="wrap">

                                        <div id="main_menu">

                                                     <ul class="gnb">

                                                                  <li>

                                                                                <a href="http://binzip2.tistory.com" title="블로그 이동">블로그 이동</a>

                                                                  </li>

                                                                  <li>

                                                                                <a href="/index.php/1" title=" 프로그래밍"> 프로그래밍</a>

                                                                                <ul>

                                                                                             <li>

                                                                                                          <a href="/index.php/1" title="HTML">HTML</a>

                                                                                             </li>

                                                                                             <li>

                                                                                                          <a href="/index.php/2" title="CSS">CSS</a>

                                                                                             </li>

                                                                                             <li>

                                                                                                          <a href="/index.php/3" title="JS">JS</a>

                                                                                             </li>

                                                                                </ul>

                                                                  </li>

                                                                  <li>

                                                                                <a href="/board/sub.php/list" title="방문자 게시판">방문자 게시판</a>

                                                                                <ul>

                                                                                             <li>

                                                                                             <a href="/board/sub.php/list" title="자유게시판">자유게시판</a>

                                                                                             </li>

                                                                                </ul>

                                                                  </li>

                                                                  <li>

                                                                                <a href="/member/sub.php/login" title="로그인">로그인</a>

                                                                                <ul>

                                                                                             <li>

                                                                                                          <a href="/member/sub.php/login" title="로그인">로그인</a>

                                                                                             </li>

                                                                                             <li>

                                                                                                          <a href="/member/sub.php/join" title="회원가입">회원가입</a>

                                                                                             </li>

                                                                                </ul>

                                                                  </li>

                                                     </ul>

                                        </div>

                           </div>

             </body>

</html>

 


'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #2  (0) 2017.07.15
JavaScript Basic #1  (0) 2017.07.13
CSS #1  (0) 2017.07.12
HTML Basic #3  (0) 2017.07.10
HTML Basic #2  (0) 2017.07.08
Posted by BinZIP
Programming/Web Programming2017. 7. 12. 04:28

CSS #1

스타일 시트(style sheet): HTML5 문서에서 디자인의 표현 한계를 극복하고 다양한 레이아웃 효과를 높이기 위해 글꼴과 글자 크기, 여백과 배경색, 정렬 방식 등의 여러가지 스타일을 모아 작성하는 기술

이점: 하나의 스타일을 작성한 여러 개의 HTML5 문서에서 불러들여 사용할 있고, 테이블이나 프레임에 의존하지 않고 문서 구조를 표과적으로 표현할 있어 편리함

 

CSS3

CSS(Cascading Style Sheet)3 W3C에서 표준으로 제작하고 있는 CSS 최신 버전으로, 페이지에 다양한 스타일을 지정하기 위해서 사용하는 기술

스타일 정의는 스타일 대상(selector) 스타일 선언부(declaration) 구성됨

 

HTML 문서에서 <p>태그 내의 텍스트에 대해 이탤릭체, 파란색 효과를 지정하는 CSS 코드는 다음과 같음

 

@charset "utf-8"; p {

font-style:italic; color:blue;

}

 

태그의 스타일을 작성하여 저장한 CSS3 파일은 여러 HTML5 문서에 연결할 있으며, HTML5 문서 본문에 존재하는 모든 <p>태그에 적용됨

 

특징과 기능

1.    브라우저나 플랫폼의 종류에 관계 없이 적용 가능

2.    플래시나 자바 스크립트를 사용하지 않고 동적인 웹페이지 작성 가능

3.    페이지의 스타일 표현 설계 영역을 담당해 HTML 문서 마크업을 간결하게

4.    글자, 간격, 여백, 테두리, 배경, 이미지, 하이퍼텍스트 등의 서식을 다양하게 설정 가능

5.    하나의 CSS3 문서로 여러 HTML 문서의 스타일을 한꺼번에 관리하고 효과 적용 가능

 

선택자

CSS3에서 HTML5 특정 대상에 대해 스타일을 지정할 스타일을 적용할 대상을 선택자(selector)라고

선택자의 종류에는 범용 선택자, 태그 선택자, 아이디 선택자, 클래스 선택자 등이 있음

 

1.    범용 선택자

             - 페이지의 일부분이 아닌 전체를 대상으로 선택자

             - ‘*’ 기호로 표현하며 페이지를 전체적으로 디자인 사용

 

* { margin:0; padding:0; }

 

위와 같이 설정하면 문서의 모든 요소의 외부, 내부 여백을 0으로 선언한 것이다.

 

2.    태그 선택자

             - 특정 태그를 선택자로 지정한

             - 하나의 태그를 대상으로 스타일을 지정할수도, 같은 스타일을 여러 태그에 지정할수도 있음

             - 태그 선택자에 지정된 스타일을 HTML 문서에서 참조됨

 

태그 { 속성:; }

 

3.    아이디 선택자

             - 특정 태그가 가진 아이디를 선택자로 지정한

             - 아이디명은 HTML 문서 내에서 중복 없이 유일하게 하나만 존재함

 

#id { 속성:; }

 

4.    클래스 선택자

             - 특정 태그가 가진 클래스를 선택자로 지정한

             - 클래스 명은 여러 태그에서 중복으로 지정하여 사용할 있으며, 여러 태그에 같은 스타일을 적용할 사용함

 

.클래스명 { 속성:; }

 

 

스타일 작성

특정 일부 태그에만 필요한 경우, 하나의 페이지에만 필요한 경우, 여러 문서에서 공통으로 필요로 하는 경우 등의 상황에서 스타일이 적용됨

 

1.    인라인 스타일

             - 스타일이 필요한 특정 태그에 속성을 기술하는 것처럼 style=속성:;” 형태로 스타일 속성을 태그 안에 작성

 

<body>

             <p style="color:blue;"> 인라인

                           <span style="color:red;"> 스타일입니다.

                           </span>

             </p>

             <p> 일반 스타일입니다.

             </p>

</body>

 


 

2.    임베디드 스타일

             - HTML5 문서의 헤드 부분에 <style> 태그를 사용하여 필요한 스타일들을 한꺼번에 모아 작성하는 방법, 내부 스타일이라고도

             - 선언해둔 스타일은 본문에서 선언 대상이 나타나면 참조하여 적용됨

 

<head>

             <style>

             p { font-size:12pt; color:red; text-align:center; }

             </style>

</head>

<body>

             <p> 내부 스타일입니다.

             </p>

             <span> 일반 스타일입니다.

             </span>

</body>

 


p 태그에 대해 임베디드 스타일을 지정한 코드의 실행 화면

 

3.    외부 스타일

             - HTML 문서 외부에 스타일 시트 파일을 작성해두고 여러 페이지에서 해당 스타일이 필요할 경우 스타일 시트 파일을 불러들여 참조하는 방식

             - HTML 문서의 head 부분에서 link 태그로 스타일 시트 파일을 연결

 

#cssex3_1.css

@charset "utf-8";

p{ display:block; font-size:20pt; color:green;

text-align:right; border:5px double red; }

 

#cssex3_2.html

<head>

             <link rel="stylesheet" href="./cssex3_1.css" />

</head>

<body>

             <pre>

                           <p>

외부 스타일이 적용되어 블록이 설정되고

블록의 테두리 두께는 5px, 빨간 이중선으로, 글자는 녹색의 20pt 블록의 오른쪽에 나타납니다.

                           </p>

             </pre>

             <span>

             일반 스타일입니다.

             </span>

</body>

 

 

 


 

 

서식 관련 스타일

1.    글자 관련 속성

             => font-family:글꼴1,글꼴2,…;: 글꼴의 종류 설정. ‘,’ 구분하여 작성하며 차례로 검색해 해당하는 글꼴이 시스템에 있으면 적용

             => font-size:속성값;: 글자 크기 설정(pt, px, %, small, medium, large )

             => font-style:속성값;: 글자 효과 설정(italic )

             => color:속성값;: 글자 색상 설정(색상 코드, rgb(r,g,b), rgba(r,g,b,a) )

             => overflow:속성값;: 태그 표현 범위를 벗어나는 글자 처리에 대해 설정(scroll, visible, auto, hidden )

             => font-spacing:속성값;: 글자 간격 설정(normal, pt, px )

             => font-weight:속성값;: 글자 굵기 설정(normal, bold, bolder, lighter )

 

#cssex4_1.css

@charset "utf-8";

body { text-align:center; }

#txt1 { font-size:28px; color:rgba(0,0,255, 0.7); }

.over1 { font-family:"궁서", Arial;

width:200px; height:100px; margin:10px auto;

line-height:1.5; overflow:auto; border:1px solid #ccc; }

 

#cssex4_2.html

<head>

             <title> 글자 효과 지정 </title>

             <meta charset="utf-8" />

             <link rel="stylesheet" href="./cssex4_1.css" />

</head>

<body>

             <div id="txt1"> 글자 관련 스타일 </div>

             <br />

             <br />

             <div class="over1"> 글자 관련 스타일 속성을 이용하여 글꼴, 글자크기와모양,색상,표현범위지정등을설정한다.이외에도자간,굵기,줄간격을설정할수있다.

             </div>

</body>

 

 


 

 

2.    문단 관련 속성

             => text-align:속성값;: 문단 정렬 설정(left, center, right, justify(좌우 정렬))

             => text- indent:속성값;: 문단 들여쓰기/내어쓰기 설정(px, %, 음수(내어쓰기))

             => line-height:속성값;: 간격 설정(normal, pt, px, % )

             => text-transform:속성값;: 영문자의 대소문자 변환 설정(none, uppercase, lowercase, capitalize)

             => text-decoration:속성값;: 문장 장식 설정(none, underline, overline, line-through )

             => text-shadow:x,y,blur,color;: 글자의 그림자 설정(글자로부터의 x,y 이동 좌표, 번짐 정도, 그림자의 색상)

 

#cssex5_1.css

@charset "utf-8";

h1 { text-align:center; text-indent:50px; }

#text1 { text-transform:capitalize; }

#text2 { text-decoration:underline; }

#text3 { text-decoration:line-through; }

a:link { text_decoration:none; }

a:hover { text-decoration:underline; color:red; }

 

#cssex5_2.html

<head>

             <title> 문단과 링크 효과 설정 </title>

             <meta charset="utf-8" />

             <link rel="stylesheet" href="./cssex5_1.css" />

</head>

<body>

             <h1> 문단과 링크 효과 </h1>

             <p id="text1"> CSS3 문장과 문단 style </p>

             <p id="text2"> 문장 밑줄 효과(underline) </p>

             <p id="text3"> 문장 취소선 효과(line-through) </p>

             <a href="http://www.naver.com"> 네이버로 이동 </a>

             <br />

             <br />

             링크 위에 마우스를 올리면 밑줄이 나타납니다. <br />

</body>

 


 

3.    여백과 위치 관련 속성

             => margin:속성;: 태그 문단 바깥쪽 여백 설정

             => padding:속성;: 태그 문단 안쪽 여백 설정

             => float:속성;: 태그 문단 수평 방향 배치(left, right)

             => position:속성;: 태그 문단 위치 설정(static, relative, absolute)

 

<!DOCTYPE html>

<html lang="ko">

             <head>

                           <title> 여백과 위치 지정 </title>

                           <meta charset="utf-8" />

                           <style>

                                        body { margin:0; padding:0; }

                                        p, div { display:block; margin:50px 10px; width:300px; text-align:center; background:#ddd; }

                                        .text1 { border:1px solid red; color:green; float:left; }

                                        .text2 { border:3px dotted green; float:left; }

                           </style>

             </head>

             <body>

                           <div class="text1"> 여백과 위치 1 </div>

                           <p class="text2">여백과위치2 </p>

             </body>

</html>

 


 

 

4.    목록 관련 속성

             => list-style:속성값;: 전체 목록 스타일 지정

             => list-style-type:숫자 타입;: 숫자 타입(아라비아 숫자, 로마자) 글머리 기호 설정(none, decimal, upper-alpha(영문 대문자), lower-alpha, upper-roman(로마자 대문자), lower-roman )

             => list-style-image:url(이미지 경로”);: 글머리 기호를 이미지로 대체 지정

             => list-style-position:속성값;: 글머리 기호의 위치 지정(inside(목록 안쪽), outside(목록 바깥쪽))

 

<head>

             <style>

             body { margin:0; padding:0; }

             #main_menu { background:#aaa; }

             #main_menu li { padding:5px; display:inline-block; list-style:none; }

             </style>

</head>

<body>

             <nav id="main_menu">

                           <ul>

                                        <li> 회사 소개 | </li>

                                        <li> 공지사항 | </li>

                                        <li> 자주 묻는 질문 | </li>

                                        <li> 자유게시판 </li>

                           </ul>

             </nav>

</body>

 


 

 

5.    테두리 관련 속성

             => outline:속성값;: 전체 아웃라인 설정(두께, 스타일, 색상 지정)

             => border:속성값;: 전체 테두리 설정(두께, 스타일, 색상 )

             => border-width:속성값;: 테두리 두께 설정(pt, px, in, cm 지정)

             => border-color:속성값;: 테두리 색상 설정(색상명 혹은 색상값)

             => border-style:속성값;: 테두리 스타일 설정(none, solid(단일 ), double(이중 ), dash(대시), dot(), groove( 모양) )

             => border-radius:속성값;: 테두리의 둥근 정도 설정(px )

 

<!DOCTYPE html>

<html lang="ko">

             <head>

                           <title> 테두리와 아웃라인 </title>

                           <meta charset="utf-8" />

                           <style>

                                        body { text-align:center; font:bold 16px Arial; }

                                        .box1 { display:block; width:600px; height:100px; border:2px solid red; outline:3px dotted #00f; outline-offset:10px; }

                           .box2 { display:block; width:600px; height:100px; border:3px dashed #000; border-radius:20px; -webkit-border-radius:20px; -moz-border-radius:20px; }

                           </style>

             </head>

             <body>

                           <h2> 테두리와 아웃라인 효과 </h2>

                           <p class="box1"> 높이100px,너비300px크기의블록에 <br/>

                           빨간색 단선 테두리와 <br />

                           파란색 점 아우트라인 효과를 준 스타일입니다. </p>

                           <br />

                           <p class="box2"> 높이100px,너비300px크기의블록에<br/>

                           대시 테두리, <br />

                           박스의 둥근 모서리 효과를 준 스타일입니다. </p>

             </body>

</html>

 


 

6.    배경 관련 속성

             => background:속성값;: 배경과 관련한 전체적인 스타일 지정

             => background:url(이미지 경로”);: 배경 이미지 삽입

             => background-color:속성값;: 배경색 삽입

             => background-size:속성값;: 배경 이미지 크기 설정(auto, cover, contain)

             => background-repeat:속성값;: 배경 이미지의 반복 설정(repeat, repeat-x, repeat-y, no-repeat)

 

<!DOCTYPE html>

<html lang="ko">

             <head>

                           <title> 배경 이미지 </title>

                           <meta charset="utf-8" />

                           <style>

                                        body { background:url("./LA1.png"); background-repeat:no-repeat; background-size:cover; text-align:center; }

                                        #title { display:block; width:300px; height:30px; text-align:center; margin:50px auto; border:1px solid; border-radius:20px; background:-webkit-linear-gradient(top,#fff,#000); }

                                        #font1 { color:rgb(255,255,255); font-size:16px; }

                           </style>

             </head>

             <body>

                           <p id="title"> 그래디언트 배경 설정 </p>

                           <p id="font1" > 배경 이미지가 가로/세로 크기 비율은 고정되고

                           이미지의 가로 크기만 본문의 가로 크기에 맞추어 집니다. </p>

             </body>

</html>

 



 

 

 

'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #1  (0) 2017.07.13
CSS #2  (0) 2017.07.12
HTML Basic #3  (0) 2017.07.10
HTML Basic #2  (0) 2017.07.08
HTML Basic  (0) 2017.07.05
Posted by BinZIP