/* 정규식을 이용하여 html 소스에 있는 URL 주소들을 리스트(a) 로 반환하고 출력합니다 */

opener = urllib2.build_opener(

                urllib2.HTTPHandler(),

                urllib2.HTTPSHandler(),

                urllib2.ProxyHandler({'https': 'http://user:pass@proxy:3128'}))

urllib2.install_opener(opener)

html = urllib2.urlopen(SeedURL).read()

fw = open("URL_List.txt", 'w')

crawl = "(http|https):\/\/(([\xA1-\xFEa-z0-9_\-]+\.[\xA1-\xFEa-z0-9:;&#@=_~%\?\/\.\,\+\-]+))" 

a = re.findall(crawl, html)

for i in a :

    fw.write(i[1]+ "\n")

    recur(i[1])

fw.close()




신고

'Language > Python' 카테고리의 다른 글

[Python] URL Regular Expression  (0) 2012.11.10
[Python] urllib 모듈  (1) 2012.08.16

ㅎㅎ시험기간이라 그런지 요즘 학교 후배들이 생성자쪽에 대해서 많이 물어보더라구요...

그래서 한번 복습할겸 포스팅해보겠습니다,


#include <iostream>

using namespace std;

 

int main(){

        int a = 10; // C style

        int b(5); // C++ style

        cout << a << endl;

        cout << b << endl;

        return 0;

}

출력결과 :

10

5 


위 소스를 보게되면 변수 초기화 방법이 두가지가 있다는 것을 볼 수 있는데요 그렇다면 변수가 아닌 객체도 저 두가지 방식으로 초기화를 할 수 있을텐데요. 과연 가능한지 확인해보도록 하겠습니다.


#include <iostream>

using namespace std;


class A{

public:

        A(int _data) { data = _data; } // Constructor

        void getData() { cout << data << endl; }

private:

        int data;

};

int main(){

        A a(5);

        A aa = 5;

 

        a.getData();

        aa.getData();

        return 0;

}

출력결과:

5

5


결과는 모두 5를 출력하겠죠. 그렇기에 객체 또한 초기화 방법이 2가지가 있다는 것을 볼 수 있네요.. 하지만 위에서 A aa = 5; 는 컴파일을 하는 동시에 A aa(5); 로 변환이 이루어지는 과정이기 때문에 동 일하다고 볼수 없네요. 아래 소스를 한번 보도록 하겠습니다.


 #include <iostream>

#include <string>

using namespace std;

 

class A{

public:

        A(char* _data){ strcpy(data, _data); }

        void getData() { cout << data << endl; }

private:

        char data[100];

};

 

int main(){

        A a("Inha Univ.");

        A aa(a); // ?? char * 값이 아닌 객체를 넘겨받았는데 초기화가 되네요

 

        a.getData();

        aa.getData();

 

        return 0;

}

 

출력결과:

Inha Univ.

Inha Univ.


위 소스에서 보면 A 자료형을 받는 생성자 함수를 만들지 않았지만 자동으로 만들어졌다고 생각할 수 밖에 없는데 우리는 이런 자기 자신과 같은 형태의 객체를 인자로 받을 수 있는 생성자가 자동으로 만들어진것을 디폴트 복사 생성자라 합니다. 

자 여기서 복사생성자에 대해서 한번 정의를 해보도록 하겠습니다. 복사 생성자란 자기 자신과 같은 형태의 객체를 받는 것입니다. 

그렇다면 디폴트 복사 생성자라는것이 멤버 변수들을 복사하는 것일텐데 클래스마다 가지고있는 데이터들이 다르기 때문에 디폴트 생성자는 각 클래스마다 다른 형태로 바뀌어서 복사가 된다고 볼 수 있다. 

따라서 매우 편리해보이는 이 디폴트 생성자는 큰 문제점이 존재합니다


 

#include<iostream>

#include<string>

using namespace std;

 

class A{

private:

    char *name; // 값을 참조하는 방식으로..

    char *phone;

    int age;

public:

    A(char *_name, char* _phone, int _age){

        name = new char[strlen(_name)+1];

        strcpy(name,_name);

        phone = new char[strlen(_phone)+1];

        strcpy(phone,_phone);

        age = _age;

    }

    void output(){

        cout<<name<<endl;

        cout<<phone<<endl;

        cout<<age<<endl;

    }

    void modify(char *val){

        strcpy(name,val);

    }

    ~A(){

        delete []name;

        delete []phone;

    }  // 동적할당을 해제

};

 

int main(){

    A *a = new A("Hahahia","010",21);

    A b(*a);

 

 

    a->output();

    a->modify("qwerty");

    b.output();

    delete a;

    b.output();

    return 0;

}

 

 



저렇게 에러메시지가 딱 나타나버렸네요.. 말그대로, 디폴트 복사 생성자는 직접 값을 복사하는것이 아니라 "참조"를 하고 있던거였네요 이를 얕은 복사라 하며, 객체가 실제로 데이터를 가지고 있는것이 아님을 알 수 있겠네요.. 그럼 얕은 복사를 알았으면, 깊은 복사를 해봐야겠죠?? ㅎㅎ아닌가.. 아무튼 위와같이 참조하는 방식이 아닌 복사를 구현하기위해서는 직접 복사생성자를 구현해야 하겠습니다. 

#include<iostream>

#include<string>

using namespace std;

 

class A{

private:

    char *name;

    char *phone;

    int age;

public:

    A(char *_name, char* _phone, int _age){

        name = new char[strlen(_name)+1];

        strcpy(name,_name);

        phone = new char[strlen(_phone)+1];

        strcpy(phone,_phone);

        age = _age;

    }

    A(const A& Obj){

        name = new char[strlen(Obj.name)+1];

        strcpy(name,Obj.name);

        // private 접근가능하니 const 해둡시다

        phone = new char[strlen(Obj.phone)+1];

        strcpy(phone,Obj.phone);

       

        age = Obj.age;

    }

    void output(){

        cout<<name<<endl;

        cout<<phone<<endl;

        cout<<age<<endl;

    }

    void modify(char *val){

        strcpy(name,val);

    }

    ~A(){

        delete []name;

        delete []phone;

    }

};

 

int main(){

    A *a = new A("Hahahia","010-7549-2870",21);

    A b(*a);

    a->output();

    delete a;

    b.output();

}





 ㅎㅎ 참 쉽네영.. 이크 내번호 ㅋ



신고

'Language > C++' 카테고리의 다른 글

C++ 복사생성자(생성자에 관한 이해 및 얕은,깊은 복사)  (0) 2012.10.20
Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27

자바에서 가장 핵심적이고 중요하다고 하는 상속은

C++에서는 콜론(:)을 상속의 키워드로 사용하며, 자바에서는 extends라는 키워드를 사용합니다.

간단히 예제를 보면 이해하실 수 있어요 ㅎㅎ


/**
 * Created with IntelliJ IDEA.
 * User: hahahia
 * Date: 12. 10. 13
 * Time: 오후 7:18
 */

import java.awt.*;
class HelloFrame extends Frame{ // 프레임을 상속받은 HelloFrame 클래스
    // 단순히 상속만 받음
}
public class FrameMain {
    public static void main(String[] args){
        HelloFrame h = new HelloFrame();  // HelloFrame 객체 생성
        h.setSize(200,200);
        h.setVisible(true);   // 화면에 나타냄
    }
}

상속의 원리가 상위 클래스의 모든 것을 다 받는다면 생성자도 상속받을까? 여기서 답은 No. 생성자는 상속되지 않습니다. 단지 자식에 의해서 자동으로 호출될 뿐... 예제를 살펴보면 이해가 빠르겠네요.




// GrandOfFather.java

public class GrandOfFather {
    public GrandOfFather(){
        System.out.println("상속 1세대 ");
    }
    public void getGrandOfFather(){
        System.out.println("getGrandOfFather 호출");
        for(int i=0; i<10; i++){
            System.out.print(i + " ");
        }
        System.out.println();
    }
}


// Father.java

public class Father extends GrandOfFather{
    public Father(){
        System.out.println("상속 2세대 ");
    }
    public void getFather(){
        System.out.println("Father 호출");
        for(int i=10; i<20; i++){
            System.out.print(i + " ");
        }
        System.out.println();
    }
}


// GrandFather.java

public class GrandFather{
        public static void main(String[] args){
            Father f = new Father();
            f.getGrandOfFather();
            f.getFather();
        }
}

/*
출력결과
상속 1세대
상속 2세대
getGrandOfFather 호출
0 1 2 3 4 5 6 7 8 9
Father 호출
10 11 12 13 14 15 16 17 18 19
* */


신고

'Language > Java' 카테고리의 다른 글

[Java] 상속을 이용한 프레임 창 띄우기 예제  (0) 2012.10.13
[Java] 생성자 예제  (0) 2012.10.13

Java 생성자 예제



/**
 * Created with IntelliJ IDEA.
 * User: hahahia
 * Date: 12. 10. 13
 * Time: 오후 5:25
 * To change this template use File | Settings | File Templates.
 */
public class TopConstructor {
    private String name = null;
    private String address = null;
    private int age = 0;

    public TopConstructor(){
        name = "이름 없음" ;
        address = "주소 없음" ;
        age = 0;
    }
    public void setData(String n, String a, int g){
        name = n;
        address = a;
        age = g;
    }
    public String getData(){
        String str = name + ", " + address + ", " + age;
        return str;
    }
    public static void main(String[] args){
        TopConstructor tc = new TopConstructor();
        String s;
        s = tc.getData();
        System.out.println(s);
        tc.setData("Minhwa", "Incheon", 25);
        s = tc.getData();
        System.out.println(s);
    }
}


제대로 자바를 공부해보는게 처음이라...ㅎㅎ
신고

'Language > Java' 카테고리의 다른 글

[Java] 상속을 이용한 프레임 창 띄우기 예제  (0) 2012.10.13
[Java] 생성자 예제  (0) 2012.10.13

Template Function

- 인수나 반환값의 형을 모호한 상태로 정의

- 호출하는 쪽에서 지정한 인수의 형에 맞춰 함수 내에서 사용하는 변수의 형을 바꿀 수 있다.



템플릿 사용을 안할 경우

=> 함수 오버로딩 기능을 이용(OOP, 다형성)하여 각각 형태에 따른 이름이 같지만 리턴형이 다른 함수를 각각 만들어줘야 합니다.

 

/* not use Template function

made by hahahia */

#include <iostream>

using namespace std;


int getMax(int a, int b){

        int buf;

 

        if(a > b) buf = a;

        else buf = b;

        return buf;

}

double getMax(double a, double b){

        double buf;

 

        if(a > b) buf = a;

        else buf = b;

        return buf;

}

int main(){

        int n1 = 1, n2 = 3, ret1;

        double r1 = 4.5, r2 = 3.5, ret2;

        ret1 = getMax(n1, n2); /* int */

        ret2 = getMax(r1, r2); /* double */

        cout << "ret1 : " << ret1 << endl;

        cout << "ret2 : " << ret2 << endl;

        return 0;

}


실행결과

ret1 : 3

ret2 : 4.5


하지만 템플릿 함수를 쓰는 경우 한번만 정의를 해두면 어느 형태가 오더라도 바로 함수의 기능을 수행할 수 있겠죠.


/* Template function

made by hahahia */

#include <iostream>

using namespace std;


template<class T>

T getMax(T a, T b){ /* getMax template */

        T buf;

        if(a < b) buf = b;

        else buf = a;

        return buf;

}

 

int main(){

        int n1 = 1, n2 = 3, ret1;

        double r1 = 4.5, r2 = 3.5, ret2;

        ret1 = getMax(n1, n2); /* int */

        ret2 = getMax(r1, r2); /* double */

        cout << "ret1 : " << ret1 << endl;

        cout << "ret2 : " << ret2 << endl;

        return 0;

}


실행결과

ret1 : 3

ret2 : 4.5

신고

'Language > C++' 카테고리의 다른 글

C++ 복사생성자(생성자에 관한 이해 및 얕은,깊은 복사)  (0) 2012.10.20
Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27

상속(Inheritance)의 사전적 의미는 자식이 부모가 가진 모든 것을 물려 받는 것을 의미하는데 OOP의 상속도 기본적인 의미는 동일하다. 이미 정의되어 있는 클래스의 모든 특성을 물려 받아 새로운 클래스를 작성하는 기법을 상속이라고 한다. 흔히 상속은 이미 만들어진 클래스를 재활용하기 위한 기법으로 소개되며 재활용이 상속의 가장 큰 장점이기는 하지만 상속에 의해 부차적으로 발생하는 효과도 있다. 상속을 하는 목적 또는 상속에 의한 효과는 다음 세가지로 간략하게 요약할 수 있다.

 

① 기존의 클래스를 재활용한다. 가장 기본적인 효과이다.

② 공통되는 부분을 상위 클래스에 통합하여 반복을 제거하고 유지, 보수를 편리하게 한다.

③ 공동의 조상을 가지는 계층을 만듬으로써 객체의 집합에 다형성을 부여한다.

- 출처(http://www.winapi.co.kr)



지금 예제에서는 

circle 객체는 point 객체를 포함 하여, 중심 좌표를 가지며 figure 객체를 상속하고 있습니다. 즉 circle 객체는 figure의 모든 public, protect 멤버에 대해서 접근이 가능합니다(public 상속)

그중 protect는 상속받는 객체만이 public처럼 접근이 가능하지만, 외부에서 protect변수는 private처럼 접근이 불가능합니다. (circle이 figure을 상속받게 되는거겠죠)


/*

Class 상속 예제

made by hahahia

*/

 

#include <iostream>

#include <string>

using namespace std;

 

class point{ /* x,y 좌표를 나타내는 간단한 클래스 */

private:

    int x,y;

public:

    point(int _x,int _y): x(_x),y(_y) {}; /* C++ Style(= {x = _x; y = _y;} */

    int getX() const { return x; }

    int getY() const { return y; }

};

 

class figure{

private:

    string Name;

protected:

    string protect;

public:

    figure(string _Name){

        Name = _Name;

    }

    const string getName() const{

        return Name;

    }

};

 

class circle : public figure // <--  

{

private:

    point center;

    int radius;

public:

    circle(int x,int y,int _radius)

        :center(x,y),figure(""),radius(_radius){}; // constructor에서 figure 클래스에 대해 "" public 속성에 있는 figure 생성자로 설정

    void showData(){

        cout << getName() << " 입니다" << endl; //<-- figure 객체의 함수를 사용!

        cout << " (" << center.getX() << ", " << center.getY() << ")" << endl;

        cout << "Radius : " << radius << endl;

        protect = " protect 마치 public처럼 접근이 가능~~~!! // protect변수 접근가능

cout << protect << endl;

    }

};

 

int main(){

    circle myCircle(1,23,5);

    myCircle.showData();

    return 0;

}

 


실행결과


신고

'Language > C++' 카테고리의 다른 글

C++ 복사생성자(생성자에 관한 이해 및 얕은,깊은 복사)  (0) 2012.10.20
Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27

사실 포함을 설명하는 이유는 다음에 이어갈 상속과 관련해서 볼 때 도움이 될꺼같아서 이렇게 포스팅을 합니다....

객체가 다른 객체를 멤버변수로 사용하고 있는 것을 포함 이라고 합니다

/*

Class 포함 예제

made by hahahia

*/

 

#include<iostream>

 

using namespace std;

 

class point{ /* x,y 좌표를 나타내는 간단한 클래스 */

private:

    int x,y;

public:

    point(int _x,int _y): x(_x),y(_y) {}; /* C++ Style(= {x = _x; y = _y;} */

    int getX() const { return x; }

    int getY() const { return y; }

};

class rectangle{ // rectangle class(사실 클래스도 간단하네요....ㅎㅎ)

private:

    point topLeft;

    point bottomRight; //point 객체를 포함

public:

    rectangle(int a, int b, int c, int d) : topLeft(a,b), bottomRight(c,d){};

    void print(){

               cout << "Top Left : (" << topLeft.getX() << ", " << topLeft.getY() << ")\n";

               cout << "Bottom Right : (" << bottomRight.getX() << ", " << bottomRight.getY() << ")\n";

        }

};

 

int main(){

    rectangle myRec(1,2,3,4);

    myRec.print();

    return 0;

}


실행결과


 

신고

'Language > C++' 카테고리의 다른 글

Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27
Class GradeBook Using an Array to Store Grades  (0) 2011.05.25
연산자 오버로딩(Operator Overloading) 이란?
- C++에서 연산자가 하는 일을 함수로 개인의 필요에 맞게 구현한 것.
- operator<연산자> 형태. 이항 연산자의 경우 좌측의 연산자의 피연산자는 호출하는 객체가 될 것이고, 우측의 피연산자는 인수가 된다.


지금 예제에서는 간단히 입력하는 연산자 >> 와 출력하는 << 연산자에 대해서 입출력 오버로딩을 구현해 보았습니다.

/* made by hahahia */

#include <iostream>

#include <string>

using namespace std;

 

class Student{

        friend istream &operator >> (istream &, Student &); /* Operator overloading(input, output) */

        friend ostream &operator << (ostream &, const Student &);

public:

        string getName() const { return Name; } /* Get Function */

        int getNumber() const { return Number; }

private:

        string Name; /* student name, number */

        int Number;

};

 

istream &operator >> (istream & in, Student & stu){

        cout << "student name : ";

        in >> stu.Name;

        cout << "student number : ";

        in >> stu.Number;

        return in;

}

ostream &operator << (ostream & out, const Student & stu){

        out << "Student Name : " << stu.Name << "\n"

               << "Student Number : " << stu.Number << "\n" ;

        return out;

}

int main(){

        Student stu1;

        cout << "input Student Name and Number\n";

        cin >> stu1;

        cout << stu1;

 

        cout << "getFunction Student Name : " << stu1.getName() << "\n"

               << "getFunction Student Number : " << stu1.getNumber() << "\n";

}

 

실행결과



신고

'Language > C++' 카테고리의 다른 글

C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27
Class GradeBook Using an Array to Store Grades  (0) 2011.05.25
재귀함수를 이용한 fibonacci  (0) 2011.05.17


urllib 모듈은 웹상의 문서나 파일을 가져올 수 있고 url, header 등 여러 웹의 정보를 가져올수 있습니다.


예제(urllib.py)



실행결과



첫번째로 headers 정보(apache, ubuntu OS 사용한다는 것을 알 수 있네요...)

두번째로 숫자 200은 음..... 웹페이지의 상태를 나타냅니다. 위에서는 주석처리를 못했네요. 200이라고 나오는게 정상적으로 웹페이지가 나왔다는 것을 의미하구요.

read()함수는 이 웹페이지의 html 소스를 가져옵니다. 

신고

'Language > Python' 카테고리의 다른 글

[Python] URL Regular Expression  (0) 2012.11.10
[Python] urllib 모듈  (1) 2012.08.16
  1. 광영 2017.02.26 16:13 신고

    이건 파이썬 2.7용 입니다. 파이썬 3에는 적용되지 않습니다. 이제 와서 검색해서 오신 분이라면 백발백중 파이썬 3 쓰실텐데 이거 따라하면서 안된다고 하시지 마시고 빨리 다른 예제 찾아 가세요.

Loop 사용법 =>

ex)

mov ecx, LoopCount ; loop를 수행할 횟수(loopcount), ecx 레지스터에 저장한다.
LoopName : ; ecx레지스터의 카운트 값이 0이 될때까지 1씩감소하면서 loop를 돈다.
    loop를 돌면서 반복
    수행할 제어문들
loop LoopName


/* fibo.asm */

; made by hahahia 

; site => http://hahahia.tistory.com

INCLUDE Irvine32.inc

.data

fibo DWORD 1, 1, 5 DUP(0)

.code

main PROC

mov esi, OFFSET fibo

mov eax, [esi]

call Dumpregs

add esi, 4

mov eax, [esi]

call Dumpregs

add esi, 4

mov ecx, 5

L1 :

mov ebx, [esi-4]

mov edx, [esi-8]

add ebx, edx

mov eax, ebx

mov [esi], eax

call Dumpregs

add esi, 4

loop L1

exit

main ENDP

END main

신고

'Language > Assembly' 카테고리의 다른 글

assem fibo  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제(loop추가)  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제  (0) 2012.05.04
SetTextColor procedure  (0) 2012.05.04
Reversing String(readstring, writestring procedure사용법)  (0) 2012.05.04
mov, add, sub 명령어  (0) 2012.04.14

+ Recent posts