달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'프로그래밍'에 해당되는 글 19

  1. 2016.08.04 Java Native Interface
  2. 2016.05.22 sizeof
  3. 2016.05.04 객체
  4. 2016.05.04 변수
  5. 2016.05.04 hello world
  6. 2016.02.13 리눅스에 자바 설치 및 실행 방법
  7. 2016.02.08 인터넷 check sum 함수의 구현
  8. 2016.02.07 다운
  9. 2015.11.24 함수 포인터
  10. 2015.10.24 [visual studio 2013] scanf_s에서 s없애기와 freopen
2016. 8. 4. 17:58

Java Native Interface 프로그래밍/java2016. 8. 4. 17:58

JNI


1. JNI(Java Native Interface)이란?

다른 언어로 작성된 코드를 자바에서 호출할 수 있도록 만들어진 규약이다.  Native Code란 플랫폼에 종속적인 기계어 코드로 C/C++와 같은 언어를 말한다. 자바는 특정 플렛폼에서 제공하는 고유의 서비스의 기능을 모두 처리할 수 없기때문에 특수한 목적으로 제작된 하드웨어를 제어해야 할 필요가 있다면 자바만으로 해결하기 힘들다.


2. DLL이란 무엇인가?


라이브러리란 자주 사용되는 표준적인 함수를 매번 직접 작성해서 사용하는 것은 지나치게 시간 소모적이므로 표준화할 수 있는 함수를 미리 만들어서 모아 놓은 집합이며 보통 LIB확장자를 가진다. 이 라이브러리를 프로그램에 링크시키는 방식에는 정적 링크(Static Link)와 동적 링크(Dynamic Link)가 있는데 동적 링크 방식을 쓰면 DLL이 된다.


- 정적 링크(Static Link)

실행파일을 만들 때 프로그램에 라이브러리 코드를 복사하여 컴파일하는 방식이다. 그래서 파일의 크기는 커지지만 실행파일은 완전한 단독 실행파일이 된다. 컴파일이 끝나면 라이브러리 파일(LIB)이 없이도 프로그램을 실행할 수 있다.


- 동적 링크(Dynamic Link)

실행 파일을 만들 때 프로그램에 라이브러리를 복사시키지 않고 링크시키는 방식이다. 그러면 실행파일에는 호출할 함수의 정보만 포함되고 실제 함수 코드는 복사되지 않으므로 실행파일의 크기는 작아진다. 실행 파일은 실제코드를 가지고 있지 않으므로 프로그램 실행시에 DLL이 꼭 있어야 한다.


3. Shared object란 무엇인가?

라이브러리는 함께 링크될 수 있도록 보통 미리 컴파일된 형태인 오브젝트코드(Object code) 형태로 존재한다. 이 Object들은 자주 사용하는 함수의 소스를 컴파일하여 만들 수 있다.


*표준 시스템 라이브러리: /lib와 /usr/lib에 위치

*라이브러리의 이름은 대개 lib로 시작




1단계: Native Method를 선언하는 자바 클래스를 작성하고 컴파일한다.

여기서 Native Method란 Native code(C/C++)를 호출하기 위한 자바 함수이다.

native는 Native Function이라는 것을 알여주는 키워드이다.




[출처]

- DLL이란 무엇인가?

http://stdesignstar.tistory.com/entry/DLL-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80




'프로그래밍 > java' 카테고리의 다른 글

객체  (0) 2016.05.04
변수  (0) 2016.05.04
hello world  (0) 2016.05.04
리눅스에 자바 설치 및 실행 방법  (0) 2016.02.13
:
Posted by youjin.A
2016. 5. 22. 06:59

sizeof 프로그래밍/C언어2016. 5. 22. 06:59


:
Posted by youjin.A
2016. 5. 4. 15:22

객체 프로그래밍/java2016. 5. 4. 15:22

-클래스의 구조

class    class_name {

//필드 정의

data_type    field1;

...


//메소드 정의

return_type    method1(parameter) { ... }

...

}

클래스(class) : 자신만의 변수와 함수를 가지고 있는 자료형

객체(object) : 클래스를 통해 생성되는 인스턴스(instance)

필드(field) : 클래스 내의 멤버 변수. 필드는 메소드 밖에서 선언하며 같은 클래스 내부에서 모든 메소드가 직접 접근이 가능하다. 접근 지정자를 통해 외부 클래스로의 접근을 조절할 수 있다. 

메소드(method) : 클래스 내의 멤버 함수. 필드가 아닌 일반 변수를 메소드 내부에 사용할 경우, 지역 변수가 되어 메소드 내에서만 유효하다. public 메소드의 경우 외부 클래스에서 호출이 가능하다. static이 지정된 메소드는 선언된 클래스의 객체를 생성하지 않고 호출할 수 있다. 


-객체의 생성

class_name    object;    //참조 변수 선언

object = new class_name();    // 객체를 생성하고 참조값을 참조 변수에 저장


먼저 지정된 클래스는 객체의 주소를 저정할 객체 참조 변수를 생성한다.

new 예약어는 클래스 타입의 객체 메모리 공간을 할당하여 객체를 생성한다.


-메시지 전달

메시지(message) : 객체와 객체간의 상호 작용을 하기 위한 통신 메카니즘.

object.filed    // 객체에 포함된 필드 참조

object.method(parameter)    // 객체에 포함된 메소드 

객체의 외부에서 객체에 포함된 속성과 메소드를 참조하려면 도트(.) 연산자를 사용한다.


//클래스의 구조

class Car{

String name;

String color;

int engine;


public void displayCar() {

System.out.println("차이름 : " + name);

System.out.println("차색깔 : " + color);

System.out.println("배기량 : " + engine + "CC");

}

}


public class Example303 {

public static void main(String[] args) {

//객체의 생성

Car myCar;

myCar = new Car();


//메세지 전달

myCar.name = "sonata";

myCar.color = "black";

myCar.engine = 2000;

myCar.displayCar();

}

}




'프로그래밍 > java' 카테고리의 다른 글

Java Native Interface  (0) 2016.08.04
변수  (0) 2016.05.04
hello world  (0) 2016.05.04
리눅스에 자바 설치 및 실행 방법  (0) 2016.02.13
:
Posted by youjin.A
2016. 5. 4. 15:20

변수 프로그래밍/java2016. 5. 4. 15:20

-변수

데이터를 저장하는 공간

사용 전에 변수를 선언하여야 한다.

자료형      이름 


-문자열 변수

문자열은 문자 상수가 하나 이상 모여서 연속된 형태를 구성하며 끝에는 널 문자('\0')가 포함되어 있다.

기본 자료형은 아니지만 String 타입을 이용하여 문자열 변수를 선언할 수 있다.

String 클래스는 문자열을 처리하기 위해 java.lang 패키지에서 제공하는 클래스이다. String 클래스로 생성된 문자열은 문자의 변경이 불가능한 문자열 상수이다.


public class Example202{

public static void main(String[] args){

int num1, num2, sum;

String sentence = "The calculate is completed.";


num1 = 10;

num2 = 20;

sum = num1 + num2;

System.out.printf("num1 = %d, num2 = %d \n sum = %d\n", num1, num2, sum);

System.out.println(sentence);

}

}


'프로그래밍 > java' 카테고리의 다른 글

Java Native Interface  (0) 2016.08.04
객체  (0) 2016.05.04
hello world  (0) 2016.05.04
리눅스에 자바 설치 및 실행 방법  (0) 2016.02.13
:
Posted by youjin.A
2016. 5. 4. 15:06

hello world 프로그래밍/java2016. 5. 4. 15:06

public class HelloWorld{

public static void main(String[] args){

System.out.println("Hello World!!");

}

}



- 메인 클래스

자바 프로그램에는 반드시 메인 클래스가 존재해야 함.

public class 프로그램의_파일_이름


- 메인 메소드

메인 클래스에는 메인 메소드가 반드시 존재함.

프로그램 실행 시 자바 가상머신에 의해 자동으로 실행

public static void main(String[] args)


- 표준 출력 방법

System.out.print()

System 클래스: 자바 라이브러리를 통해 표준 입출력의 기능을 제공함.

out 스트림: 표준 풀력을 위해 시스템과 연결된 콘솔 창으로 데이터를 내보내는 역할을 수행.

표준 출력 메소드: print(), println(), printf()




'프로그래밍 > java' 카테고리의 다른 글

Java Native Interface  (0) 2016.08.04
객체  (0) 2016.05.04
변수  (0) 2016.05.04
리눅스에 자바 설치 및 실행 방법  (0) 2016.02.13
:
Posted by youjin.A

설치 방법

http://ngee.tistory.com/276


실행 방법

http://gangsanilee.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%AC%EC%97%90%EC%84%9C-JAVA-%EC%8B%A4%ED%96%89-%ED%95%98%EA%B8%B0

'프로그래밍 > java' 카테고리의 다른 글

Java Native Interface  (0) 2016.08.04
객체  (0) 2016.05.04
변수  (0) 2016.05.04
hello world  (0) 2016.05.04
:
Posted by youjin.A

1. 과제명: 인터넷 Checksum 함수의 구현

2. 제출기한: 2015년 11월 18일(수)

3. 제출방법: on-line 제출

4. 내용:

 

인터넷 Checksum 계산과 검사를 위한 함수를 C로 구현하라. 구현하는 함수는 아래 내용을 참고하고, 함수의 이름이나 넘겨받는 메시지의 유형은 필요에 따라 다르게 정의하여도 된다.

 

(1) Checksum 계산과 검사를 위한 루틴에 대한 flow chart를 작성하라.

(구현은 교재 p.280의 Figure 10.17 인터넷 Checksum 알고리즘을 참고할 것.)

-Checksum계산

 

-Checksum 검사

 

  

(2) 아래의 함수를 완성하라.

 

int calculation_Checksum(message)

int *message;

{

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int calculaton_Checksum(int* message)
{
    /* 임의의 길이를 갖는 메시지를 넘겨받아 Checksum을 계산하여 return한다.*/
    int Checksum;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if (pre_sum > sum)
            sum++;
        pre_sum = sum;
    }
 
    Checksum = ~sum;
 
    message[data_num] = Checksum;
    data_num++;
 
    return Checksum;
}
cs

}

 

int check_Checksum(message)

int *message;

{

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int check_Checksum(int* message)
{
    /* Checksum이 부착된 임의의 메시지를 넘겨받아, 에러가 검출되면 0, 아니면 1을 return한다. */
    int result = 0;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if ((unsigned int)pre_sum >(unsigned int)sum)
            sum++;
        (int)pre_sum = (int)sum;
    }
 
    result = ~sum;
 
    if (result == 0)
        return 1;
    else
        return 0;
}
 
cs

}

 

(3) 완성된 함수 calculation_Checksum()와 check_Checksum()를 동작을 검증할 수 있는 테스트 프로그램을 작성하고 시험하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#define MAXNUM 100
 
int data_num;
 
void sending_message(int* message)
{
    printf("데이터의 갯수를 입력하시오.");
    scanf_s("%d"&data_num);
    if (data_num >= MAXNUM)
    {
        printf(" 최대 가능한 데이터 갯수를 초과하였습니다.\n 프로그램 종료.\n");
        exit(-1);
    }
 
 
    printf("데이터를 입력하시오.\n");
    for (int i = 0; i < data_num; i++)
    {
        scanf_s("%d"&message[i]);
    }
    printf("데이터 입력이 끝났습니다.\n\n");
 
}
 
int calculaton_Checksum(int* message)
{
    /* 임의의 길이를 갖는 메시지를 넘겨받아 Checksum을 계산하여 return한다.*/
    int Checksum;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if (pre_sum > sum)
            sum++;
        pre_sum = sum;
    }
 
    Checksum = ~sum;
 
    message[data_num] = Checksum;
    data_num++;
 
    return Checksum;
}
 
int check_Checksum(int* message)
{
    /* Checksum이 부착된 임의의 메시지를 넘겨받아, 에러가 검출되면 0, 아니면 1을 return한다. */
    int result = 0;
    int sum = 0, pre_sum = 0;
 
    for (int n = 0; n < data_num; n++)
    {
        sum += message[n];
        if ((unsigned int)pre_sum >(unsigned int)sum)
            sum++;
        (int)pre_sum = (int)sum;
    }
 
    result = ~sum;
 
    if (result == 0)
        return 1;
    else
        return 0;
}
 
void print(int* message)
{
    printf("message: ");
 
    for (int i = 0; i < data_num; i++)
        printf("%d ", message[i]);
    printf("\n");
}
 
int main(void)
{
    int mes[MAXNUM];
    int Cks;
 
    sending_message(mes);
    printf("sender: \n");
    print(mes);
 
    Cks = calculaton_Checksum(mes);
    printf("checksum: %d\n\n", Cks);
 
    if (!check_Checksum(mes))
        printf("Checksum error!!");
    else{
        printf("Receiver: \n");
        print(mes);
    }
    return 0;
}
 
cs



Term Project #2 2013104430 안유진.hwp


 

'프로그래밍 > 자료구조설계' 카테고리의 다른 글

다운  (0) 2016.02.07
void*  (0) 2015.10.23
열거형 enum  (1) 2015.10.23
윈도우에서 리눅스처럼 컴파일하기  (1) 2015.09.19
:
Posted by youjin.A
2016. 2. 7. 23:36

다운 프로그래밍/자료구조설계2016. 2. 7. 23:36

'프로그래밍 > 자료구조설계' 카테고리의 다른 글

인터넷 check sum 함수의 구현  (0) 2016.02.08
void*  (0) 2015.10.23
열거형 enum  (1) 2015.10.23
윈도우에서 리눅스처럼 컴파일하기  (1) 2015.09.19
:
Posted by youjin.A
2015. 11. 24. 20:29

함수 포인터 프로그래밍/C언어2015. 11. 24. 20:29

-함수 포인터(function pointer)

함수의 메모리 주소를 가지는 포인터 변수


-함수 포인터의 선언

만약 함수 포인터 이름에다가 소괄호를 붙이지 않고 다음과 같이 선언하면 무엇을 의미할까?

int*    pFunc(int, int)

위 문장은 반환형이 int형 포인터인 함수를 선언한 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int add(int x, int y)
{
    return x + y;
}
 
int main(void)
{
    int sum;
    int(*pFunc)(intint= NULL;
 
    pFunc = add;
    sum = pFunc(1662);
    //sum = (*pFunc)(16, 62);
    //sum = add(16, 62);
    //sum = (*add)(16, 62);
 
    printf("16 + 62 = %d\n", sum);
 
    return 0;
}
cs




-함수 포인터 자료형

함수 포인터를 선언할 때 특정 반환값과 인자를 가지는 함수 포인터를 반복적으로 만들기 귀찮기 때문에, 이것을 자료형으로 아예 만들 수 있다.


-함수 포인터 자료형의 선언

typedef void (*funcName_1)(int);

typedef void funcName_2(int);


둘 다 함수 포인터의 자료형이지만 둘의 차이가 있다.

만약 void temp(int)의 주소값을 전달 받는 다면 

funcName_1 fc = temp

는 옳은 문장이지만 funcName_2 fc = temp는 컴파일 에러가 난다. 이를 해결하기 위해서는 

funcName_2 * fc = temp;

와 같이 사용해야 한다. 다만 매개변수로 함수의 주소값을 전달 받는 경우에는 *의 생략이 가능하다.

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include <stdlib.h>
 
typedef    int    BTData;
 
typedef    struct _bTreeNode
{
    BTData data;
    struct _bTreeNode* left;
    struct _bTreeNode* right;
}BTreeNode;
 
 
BTreeNode* MakeBTreeNode(void)
{
    BTreeNode* nd = (BTreeNode*)malloc(sizeof(BTreeNode));
    nd->left = NULL;
    nd->right = NULL;
    return nd;
}
 
BTData GetData(BTreeNode* bt)
{
    return bt->data;
}
 
void SetData(BTreeNode* bt, BTData data)
{
    bt->data = data;
}
 
BTreeNode* GetLeftSubTree(BTreeNode* bt)
{
    return bt->left;
}
 
BTreeNode* GetRightSubTree(BTreeNode* bt)
{
    return bt->right;
}
 
void MakeLeftSubTree(BTreeNode* main, BTreeNode* sub)
{
    if (main->left != NULL)
        free(main->left);
 
    main->left = sub;
}
 
void MakeRightSubTree(BTreeNode* main, BTreeNode* sub)
{
    if (main->right != NULL)
        free(main->right);
 
    main->right = sub;
}
 
typedef void VisitFuncPtr(BTData data);
 
 
void PreorderTraverse(BTreeNode* bt, VisitFuncPtr action)
{
    if (bt == NULL)
        return;
 
    action(bt->data);
    PreorderTraverse(bt->left, action);
    PreorderTraverse(bt->right, action);
}
 
void ShowIntData(int data)
{
    printf("%d ", data);
}
 
int main(void)
{
    BTreeNode* bt1 = MakeBTreeNode();
    BTreeNode* bt2 = MakeBTreeNode();
    BTreeNode* bt3 = MakeBTreeNode();
    BTreeNode* bt4 = MakeBTreeNode();
 
 
    SetData(bt1, 1);
    SetData(bt2, 2);
    SetData(bt3, 3);
    SetData(bt4, 4);
 
 
    MakeLeftSubTree(bt1, bt2);
    MakeRightSubTree(bt1, bt3);
    MakeLeftSubTree(bt2, bt4);
 
 
 
    printf("Preorder Traverse: \n");
    PreorderTraverse(bt1, ShowIntData);
    printf("\n");
 
    return 0;
}
 
cs



:
Posted by youjin.A

scanf_s에서 s없애기

프로그램 맨 위에 

#pragma warning(disable:4996)

를 붙여주면 visual studio 2013에서 scanf_s나 freopen_s 처럼 _s 를 붙여줘야하는 것을 피할 수 있다. 


freopen

freopen은 프로그래밍 문제 풀때 입력을 자동으로 받아주는 함수이다.

프로그램의 프로젝트안에 text파일을 넣어주고 함수를 쓰면 text파일 안에있는 값을 자동으로 받아서 키보드로 입력한것처럼 동작하게 한다.

text파일이 다음과 같이 저장해놓고 프로그램에서 freopen을 쓴다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#pragma warning(disable:4996)
 
 
int main(void)
{
    int d[20];
 
    if (freopen("sample_input.txt""r", stdin) == NULL)
        fprintf(stderr, "error redirecting stdin\n");
 
    for (int i = 0; i < 20; i++){
    
        scanf("%d"&d[i]);
        
    }
 
    for (int i = 0; i < 20; i++){
 
        printf("%d ", d[i]);
    }
 
    printf("\n");
 
    return 0;
}
cs

 

'프로그래밍 > C언어' 카테고리의 다른 글

sizeof  (0) 2016.05.22
함수 포인터  (0) 2015.11.24
Visual Studio 설치시 설정 및 Hello world!  (0) 2015.09.11
구조체 포인터의 선언과 접근( -> )  (0) 2015.09.07
구조체 선언에 typedef 사용하기  (0) 2015.09.07
:
Posted by youjin.A