'똘이'에 해당되는 글 71건

  1. 2012.12.20 가상함수를 이용한 다형성 구현 by 똘이 임덕규
  2. 2012.12.20 다중상속(Multiplex inheritance) by 똘이 임덕규
  3. 2012.12.20 접근제어 키워드 by 똘이 임덕규
  4. 2012.12.20 포인터간의 형 변환, 레퍼런스간의 형변환 by 똘이 임덕규
  5. 2012.12.20 레퍼런스 by 똘이 임덕규
  6. 2012.12.20 배열의 이름은 첫번째 원소의 주소이다. by 똘이 임덕규
  7. 2012.10.15 [리눅스 커널] 모듈 개발 by 똘이 임덕규
  8. 2012.10.12 [리눅스커널] 시스템 호출 과정과 시스템 호출 제작 by 똘이 임덕규
  9. 2012.10.12 by 똘이 임덕규
  10. 2012.10.11 Visual Studio 유용한 팁 몇 가지 by 똘이 임덕규
부품간의 조립, 객체간의 연결이 다형성을 통해서 어떻게 보다 효율적으로 이루어질 수 있는지 알아보자.


원은 도형이며, 원과 도형은 'is-a' 관계를 가지고 있다는 뜻이다.



전체소스보기



위 소스는 아래와 같은 결과를 출력한다.


멤버 변수의 경우에는 부모 클래스로부터 상속 받은 것을 그대로 사용할 수 밖에 없지만 멤버 함수의 경우에는 부모 클래스에서 구현한 것이 맘에 들지 않는다면 자기에게 맞도록 새롭게 정의할 수 있다.


보관한 객체를 사용하기 그리고 문제점

실제로 수십가지의 도형이 존재할 수 있기 때문에 수십 가지의 도형별로 배열을 만들고 관리하는 것은 너무 귀찮고 비효율적이다.

대신 이 모든 클래스들이 Shape 클래스의 자식 클래스라는 점을 사용해서 하나의 배열에 모든 객체를 보관할 수 있다.

int main()
{
    // 도형들을 담을 배열을 준비
    Shape* shapes[5] = {NULL};

    // 각 타입의 객체를 생성해서 배열에 보관한다
    Shapes[0] = new Circle(100, 100, 50);
    Shapes[1] = new Rectangle(300, 300, 100, 100);
    Shapes[2] = new Rectangle(200, 100, 50, 150);
    Shapes[3] = new Circle(100, 300, 150);
    Shapes[4] = new Rectangle(200, 200, 200, 200);

    // 배열에 보관된 모든 객체를 그린다
    for(int i = 0; i < 5; ++i)
    {
        shapes[i] -> Draw();
    }

    // 배열에 보관된 모든 객체를 소멸
    for(i = 0; i < 5; ++i)
    {
        delete shapes[i];
        shapes[i] = NULL;
    }

    return 0;
}


위의 소스는 아래와 같은 모양으로 메모리를 구성한다.

동적으로 생성한 객체가 5개 있고 배열에 그 객체들이 보관되었다. 여러가지 타입의 객체를 하나의 배열에 넣어 두었기 때문에 손쉽게 사용할 수 있었다.


하지만 아래의 결과 출력처럼 Shape::Draw() 함수를 출력했다는 뜻이다.


가상함수를 통해서 이 문제를 해결할 수 있다.

#include 

using namespace std;

// 일반적인 '도형'을 상징하는 클래스
class Shape
{
public:
    void Move(double x, double y);
    virtual void Draw() const;

    Shape();
    Shape(double x, double y);

protected:
    double _x;
    double _y;
};
Draw() 함수앞에 virtual을 적어줌으로서 객체 타입에 맞는 Darw()함수가 호출된다.
  • virtual 키워드는 클래스의 정의 안쪽에서만 한 번 붙여주면 된다.
  • 클래스 밖에서 함수를 정의할 때는 virtual 키워드가 필요없다.



저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

예외 처리  (0) 2012.12.21
오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
다중상속(Multiplex inheritance)  (0) 2012.12.20
접근제어 키워드  (0) 2012.12.20
포인터간의 형 변환, 레퍼런스간의 형변환  (0) 2012.12.20
다중상속은 두 개 이상의 부모 클래스를 동시에 상속하는 경우를 가리킨다.
학생 정보를 관리하는 프로그램을 작성시, 학부생이면서 동시에 기숙사생인 학생의 정보를 동시에 관리할 클래스를 만들때 사용할 수 있다.

#include <string>

using namespace std;

// 학부생 클래스
class UnderGradStudent
{
public:
    string name;                // 이름
    string department;          // 학부
};

// 기숙사생 클래스
class DormStudent
{
public:
    string building;            // 기숙사명
    int roomNumber;
};

// 기숙사생이면서 학부생인 경우
class UnderGrad_DormStudent:
    public UnderGrad_DormStudent,
    public DormStudent
{
public:
    
};

int main()
{
    // 기숙사생이면서 학부생인 사람의 정보 생성
    UnderGrad_DormStudent std;

    std.name = "Hyun C. Lee";
    std.department = "Info & Computer Engineering";
    std.building = "NamJeKwan";
    std.roomNumber = 1529;
    
    return 0;
}

저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
다중상속(Multiplex inheritance)  (0) 2012.12.20
접근제어 키워드  (0) 2012.12.20
포인터간의 형 변환, 레퍼런스간의 형변환  (0) 2012.12.20
레퍼런스  (0) 2012.12.20

접근 제어 키워드 정리

접근제어 키워드에 대해서 다시 정리하면 아래와 같다
  • public
    • 모든 곳으로부터의 접근을 허용한다.
  • protected
    • 자식 클래스의 멤버 함수로부터의 접근만 허용한다.
  • private
    • 자신의 멤버 함수 외에는 접근할 수 없다.

자신의 멤버 함수에서 접근 자식 클래스의 멤버 함수에서 접근 외부에서 접근
private 멤버 O X X
protected 멤버 O O X
public 멤버 O O O

보통 일반적인 사용 가이드 라인은 아래와 같다.
  • 외부로부터 숨겨야 하는 멤버는 protected로 지정
  • 그 밖의 경우에는 public으로 지정
  • 반드시 자식 클래스에 숨기고 싶다면 private으로 지정.

저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
다중상속(Multiplex inheritance)  (0) 2012.12.20
접근제어 키워드  (0) 2012.12.20
포인터간의 형 변환, 레퍼런스간의 형변환  (0) 2012.12.20
레퍼런스  (0) 2012.12.20
자식 클래스의 포인터를 사용해서 부모 객체를 가리키는 경우.
//부모 객체성성
DocWriter dw;

// 자식 클래스의 포인터로 부모 객체를 가리킨다.
HTMLWriter* phw = &dw    // 실패
  • 이 경우에는 컴파일러 자체 판단인 암시적 형변환을 허용하지 않음
  • (HTMLWriter*) 같은 명시적 형변환은 허용하지만 이후 문제는 작성자 몫.
  • 위 경우에는 문제 발생

  • 포인터가 아니라 레퍼런스를 사용한 경우에도 상황은 똑같다.
  • 객체 기준으로 호출 우선시할 수 있게 하는것은 아래와 같이 부른다.
    • 자바 :: Abstract Method
    • C++  :: Virtual Function
저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
다중상속(Multiplex inheritance)  (0) 2012.12.20
접근제어 키워드  (0) 2012.12.20
포인터간의 형 변환, 레퍼런스간의 형변환  (0) 2012.12.20
레퍼런스  (0) 2012.12.20
지금까지 &는 변수의 주소를 얻을 때 사용했지만, &를 사용해서 변수를 정의해주면 레퍼런스 변수를 만들 수도 있다.
레퍼런스 변수를 정의할 때는 별명을 붙여주고 싶은 변수의 타입도 함께 적어주어야 한다.
int& ref = target;
레퍼런스의 경우에는 자체적인 메모리 공간은 존재하지 않고 오로지 이름만 존재한다.
#include <iostream>

using namespace std;

int main()
{
    /* 실험에 사용할 변수를 정의 */
    int target = 20;

    /* 레퍼런스 변수를 정의 */
    int& ref = target;

    /* 정보를 출력 */
    cout << "ref        = " << ref << endl;
    cout << "target     = " << target << endl;
    cout << "&ref       = " << &ref << endl;
    cout << "&target    = " << &target << endl;

    /* ref의 값을 변경 */
    ref = 100;

    /* 출력 */
    cout << "ref        = " << ref << endl;
    cout << "target     = " << target << endl;
    
    return 0;
}
  • ref는 target의 별명으로 설정
  • 둘 모두 같은 주소 즉, 같은 메모리 공간을 사용하고 있다는 것.
  • 반드시 생성할때 초기화가 필요
  • 처음 정의할때 외에는 다른 변수를 참조하게 만들 수 없다
  • 어떠한 타입의 변수라도 참조 가능
  • const 속성을 가지는 레퍼런스 변수는 자신의 값을 변경할 수 없게 된다.
    • 이러한 특징은 함수와 함께 사용할 때 유용하다.
  • 상수를 참조해야 할 때는 const속성을 가진 레퍼런스만이 가능
  • char c = 'A';
    const int& rci = c;
    int& ri = c;
    
저작자 표시
신고

'컴퓨터 언어 > C++' 카테고리의 다른 글

오버라이딩  (0) 2012.12.20
가상함수를 이용한 다형성 구현  (0) 2012.12.20
다중상속(Multiplex inheritance)  (0) 2012.12.20
접근제어 키워드  (0) 2012.12.20
포인터간의 형 변환, 레퍼런스간의 형변환  (0) 2012.12.20
레퍼런스  (0) 2012.12.20
#include <stdio.h>

int main()
{
    float f[5];

    if(f == &f[0])
    {
        /* 항상 이곳이 실행된다 */
    }

    return 0;
}
f는 배열의 이름이며, &f[0]은 첫번째 원소의 주소다.

포인터를 이용한 배열 사용
#include <stdio.h>

int main()
{
    // 배열을 정의
    int nArray[10];
    int* p = &nArray[0];

    // 배열을 탐색하면서 값을 넣는다.
    for(int i = 0; i < 10; ++i)
    {
	*(p + i) = i;
    }

    return 0;
}

  • p + i 는 괄호에 쌓여있기 때문에 제일먼저 계산이 된다.
  • *(p + 1)이라고 해주면 i 번째 원소 자체를 의미하게 된다. 즉 nArray[i]와 똑같은 의미가 되는 것이다.
    • *(p + 3) == p[3]
    • *(p + 0) == p[0]
  • 포인터는 다른 원소를 가리키게 변경할 수 있지만, 배열의 이름은 항상 첫번째 원소의 주소만을 의미하는 상수라는 점이다. 즉, nArray++ 같은 것은 불가능하다.

배열을 가리키는 포인터

#include <stdio.h>

int main()
{
    long lArray[20];

    /* 포인터가 배열을 가리킴 */
    long (*p)[20] = &lArray;

    /* 포인터를 통해서 배열 사용 */
    (*p)[3] = 300;

    /* 결과 확인 */
    printf("%lArray[3] = %d\n", lArray[3]);
    
    return 0;
}
  • []연산자가 * 연산자보다 우선 순위가 높다.
  • long* p[20]이라고 써주면 p[20]이 먼저 해석, long* 타입의 원소 20개를 갖는 배열을 정의 한다.
  • 괄호를 사용해서 우선 순위를 바꿔줄 필요가 있다.
  • 그럼 *p가 먼저 해석이 되기 때문에 long타입의 원소 20개를 갖는 배열의 대한 포인터가 정의 된다.
저작자 표시
신고

'컴퓨터 언어 > C' 카테고리의 다른 글

Static 변수  (0) 2013.02.25
메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10
다수의 소스 컴파일을 도와줄 Make  (2) 2012.06.10

모듈 프로그래밍 page 222

학습 목표

  • 모듈을 버전 2.4 2.6 맞춰 제작 있다.
  • 모듈 관련 명령어를 사용할 있다.

 

모듈 관련 명령어.

  • insmod
    • 모듈을 올릴 .
  • lsmod
    • 올라가 있는 모듈을 확인 .
  • rmmod
    • 모듈을 내릴 .

모듈을 제작 때는 올리고, 내리는 기능을 모듈 속에 모두 구현해야 한다.

  • 올릴
    • init_module
  • 내릴
    • cleanup_module

모듈을 올리는 과정에서 init_module return값이 0 아니라면 올리는 것에 실패한다.

 

link 걸기 까지는 코드만 봤을 까지는 크게 상관이 없다.

 

커널 2.4 모듈 제작시 기본 소스는 아래와 같다.

 

커널 2.4에서의 모듈 컴파일

커널은 컴파일시 참고한 커널 라이브러리에서만 작동한다

 

커널을 적재시 메세지

 

커널이 올라가 있는지 확인

 

커널을 내릴시 메세지

 

2.4 Makefile

 

 

커널 2.6 모듈 제작 

 

 

신고

Page 181

나만의 시스템 호출제작 과정은 

  • 시스템 호출 번호 할당
  • 시스템 호출 테이블 등록
  • 새로운 시스템 호출 작성
  • 커널 재컴파일

으로 나뉜다.

 

시스템 호출 번호 할당

시스템 호출 번호 할당은 아래의 파일에서 찾아, 추가할 있다.

(include/asm-i386/unistd.h) 파일은 단지 define 위한 과정이다. 아래처럼  newcall 정의해주고 값을 명시한 아래 갯수를 하나 올려준다.

 

시스템 호출 테이블 등록

커널 2.6 부터는 arch/i386/kernel/syscall_table.S 있다. 여기에 등록해 두면 호출을 받았을때 아래의 sys_newcall 이라는 함수를 찾아서 실행해 것이다

 

새로운 시스템 호출 함수 작성

kernel/newcall.c 작성한다. kernel. printk 함수 제공을 위함. syscall 함수는 커널영역에서 실행되는 함수이기에 아래 코드를 잘못 작성하면 어플리케이션 단위의 에러가 아닌 커널 패닉을 일으킨다. 그리고 커널 영역에서는 printf같은 표준라이브러리는 사용할 없다.

 

커널 재컴파일

이제 커널을 재컴파일을 하여 추가 시킨 새로운 시스템콜이 동작할 있게 커널에 넣어 준다.

Makefile 수정해 줘야 하는데 newlcall.o 끝에 적어준다.

 

여기까지 진행이 됐으면 이제 커널 이미지를 만들어 준다. 전체 컴파일을 필요가 없으므로 커널 이미지만 빌드한다.

make bzImage

이미지를 boot 디렉토리에 복사하고 grub 추가 시켜준다.

 

새로운 시스템 호출을 이용하는 응용프로그램 작성

_syscall0 모습은 아래의 처럼 바뀐다. define

 

_syscall0 모습(include/asm-i386/unistd.S)

 

소스는 아래와 같이 전처리가 끝나면 바뀌어 있을거라 예상하고 적어보았다..

 

이것을 실제로 소스를 컴파일 하여 중간파일을 생성하여 살펴보자. 현재 공유파일을 사용할 있는 커널을 사용하기 때문에 컴파일을 우리가 손을 커널소스를 참조 하지 않는다. 그렇기 때문에 아래와 같이 입력하여 제대로 나오게 필요가 있다.

 

 

이제 생성된 i 파일을 보자. 아래에 보면 _syscall0 어떻게 처리되었는지 있다.

 

 

중간 과정에서 생성된 어셈블리 파일 확인

 

 

App 영역과 Kernel 영역

가상메모리 개념이 있기 때문에 4기가라는 메모리를 가상으로 가지고 어플리케이션은 돌아간다.

실제 부족한 메모리는 Swap 통해서 보충하게 되는데 이때 과도한 하드디스크 엑세스로 느려 있다.

 

우리는 application 통해서 원하는 함수를 호출하는데 이것은 실제로 커널에게 system_call 요청한것이다.

 

 IDT 보디가드라고 보고 집은 커널 우리는 보디가드에게 원하는 일을 요청하고 보디가드가 집에 들아가서 그것을 실행하고 21번을 리턴하는데 이것이 수행했다는 말이다. 커피 창고에는 절대 못들어간다. 커피창고는 리소스 창고. 일종의 newcall이라는 비서를 만들었고 작성해둔 한다.

 

모듈과 커널에 심는것.

 

신고

분류없음 2012.10.12 07:52

캐릭터를 일단 생성한다. 생긴건 좀 이상하지만 이름은 Man vs. Wild의 소똥에서 물도 짜마시는 남자인 생존왕 'Bear Grylls' 형의 이름으로!

종족은 고무고무 열매를 드셨나.. 수영을 전혀 못하지만 활 좀 쏜다고 알려진 올빼미족(Owl-tribe)을 선택. 성별은 커피 원샷 때리는 싸나이!
얼굴은 건방진듯 하면서도 사랑스러워 보이는 그런 얼굴을 선택. 계절은 일단 생존에 있어서는 두 번째 쯤이지만 겨울을 충분히 준비하기 위해서 봄에서부터 시작하도록 하자. 다른 초보자 글들을 보니 겨울나기가 어렵다니 나라고 별 수 있겠나. 찌그러져야지.

 

이제 자신의 능력치 굴림을 할 시간인데, 몇 번이라도 다시 굴릴 수 있으니 만족할 만한 수치가 나올 때까지 계속 굴리자. 천천히. 맘에 드는 수치가 나왔는데도 불구하고 반사적으로 Reroll을 눌러 넘겨 버리지 말고. 침착하게 굴리자. 아래 그림에서는 힘이 좀 낮은데 다른 수치가 괜찮은 편이다. 힘이 낮으면 들고 다닐 수 있는 물건 수가 줄고 데미지가 좀 덜 나오거나 약간씩 실질적인 부분에서 제약이 있겠지만… 넘겨 버리기엔 아쉬운 정도라 그냥 이걸로 가자.

'고양이과 공포증 (Fear of felines)'가 있는데 나중에 여우사냥이나 그런거 나갈 때 고생을 좀 할 수 도 있을거 같다. 이 게임에서 키가 얼마나 중요하지는 모르겠지만 정말 작네. 그래도 명문대 출신인 Bear 형의 두뇌를 충분히 고려하여 지능은 최고치로.

 

 

기본으로 얻을 수 있는 의식이 철의 맹세와 여우 사냥꾼 떳다. 이거 뭐 어렵게 생각 할 거 없이 버프라고 생각하면 된다. 해주면 정해진 시간동안 해당 능력이 상승 시켜주는 건데.. 둘 다 나쁘지 않고 나쁘다고 해도 바꿀 수가 없기에 별 도리없이 진행한다.

철의 맹세는 철기류 무기에 버프를 주는건데 명중률이 올라가게 된다. 여우 사냥꾼은 여우 잡을 때 좋겠지 뭐.

 

맵이 생생되고 자신이 처음 위치하게 될 곳을 역시나 무작위로 고를 수 있는데 되도록이면 저기 보라색 애들과 좀 멀리 떨어진 곳에서 시작하자. 보라색 애들은 NZ 라는 애들인데 일단 무조건 적인 적대 관계이며 준비 없이 만나서 좋을거 하나 없는 녀석들이다. 역사적으로는 훈족일 수도 있다는데..

 

초기 시나리오 선택인데 마을 옆에서 시작할 수 있는 The Village 를 선택할거다. 바로 아래 Runaway slave 는 NJ 에게 노예로 잡혀갔다는 가정하에 도망치는 시나리오인데 해봤다가 1분만에 죽었다.ㅋ

 

게임 코스는 튜토리얼을 포함하고 있는 야생에서의 삶(Living in the wild)를 선택. 초보자들은 이게 최고다.

 

자신이 고른 것을 보여주며 진행한다면서 몇 번 왔다리 갔다리 하다가 결국 야생에 버려져 있는 자신을 보게 된다. 이제 내가 제일 먼저 해야 할 일은?

 

이것으로 초기 캐릭터 생성까지 끝이 났고 , 캐릭터는 그나마 괜찮은 능력치 소유에 Nj부족과는 멀리 떨어진 곳의 마을 바로 옆에서 생활 하게 됐다. 왜 아무도 없는 야생이 아니냐고? 난 초보자니깐. 그리고 베어그릴스 형은 Man vs. Wild 동영상을 통해, 사토루는 생존게임의 만화책에서 나를 서포터 해줄 것이다.

신고

Visual Studio 유용한 단축키 .

 

오늘 RF 통신 수업시간에 define 일이 많았는데, PDF에서 긁어서 붙여 넣기 해야 작업이 많았다.

아래 처럼 PDF 문서를 긁어서 복사한다고 ,

 

저것을 편집기에 붙여넣기를 하면 아래와 같이 나온다.

 

우리가 원하는 형태가 아래 그림과 같다고 했을때 어떻게 손쉽게 작업할 있는지 알아보자.

 

#define 스페이스바 까지 복사하여 앞에 모두 복사해 준다.

 

커서를 0x00 앞에 두고 "앞뒤 단어 위치 스위칭" 단축키인 Ctrl + Shift + t 눌러본다.

 

자리가 바뀐 있다

 

여기서 단축키를 한번 누르면 0x00 I-Code 위치를 바꾸고 1과도 바꿔준다. 그래서 아래와 같이 마무리하고 빈칸은 언더바로 이어준다.

 

이것을 스위치문을 만들때에도 쉽게 있다. 일단, 스위치 문을 아래와 같이 준비해 두자.

case 문을 위에 define 갯수 만큼 만든다.

 

그리고 아까 define 곳으로 가서 복사를 와야 하는데, 이때 alt 키를 누른 상태에서 아래와 같이 드래그를  해보자.

 

그런 다음 위의 switch 문의 그림에서 처럼 커서를 위치 시키고 붙여넣기를 한다.

 

손쉽게 기본틀을 완성했다. 나머지만 준다.

신고