C언어 한글로 코딩하기, 안녕 세상!

(Updated: )

수업시간에 문득 한글 변수를 사용할 수 있다는 사실을 깨달았습니다. 그러고나선 변수 이름 말고 함수들도 다 한글로 쓰면 좋을 것 같다는 생각이 들었습니다. 물론 이전에도 수 많은 한국 사람들이 시도를 했었죠.


전 당시 SlefRef나 주소값에 대해 조금씩 개념을 익혀가던 찰라였기에 단지 #define만 사용하는 것이 아니라 C#처럼 간단한 구조를 가진 한글 코딩을 구현하고 싶었습니다. 다운로드


korcoding.h
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/*----KOREAN CODING----*/
#ifndef _KOREAN_H_
#define _KOREAN_H_

#pragma once
/*---C++ Header File---*/
#include <iostream>
#include <iomani>

/*---C Header File---*/
#include <stdlib.h>
#include <time.h>

#define 진입점 main

#define 만약 if
#define 혹은 else if
#define 아니면 else
#define 반복 for
#define 반환 return

#define 형식정의 typedef
#define 구조체 struct

#define 클래스 class
#define 공개 public
#define 숨김 private
#define 보호 protected

#define 동적 new
#define 삭제 delete
#define 정적 static
#define 상수 const

#define 참 true
#define 거짓 false

typedef int 정수;
typedef float 실수;
typedef char 문자;
typedef void 공백;

class 기본입출력
{
public:
	template <typename type>
	기본입출력 출력(type a)
	{
		std::cout << a;
		return *this;
	}
	기본입출력 새행()
	{
		std::cout << std::endl;
		return *this;
	}
	template <typename type>
	void 입력(type &a)
	{
		std::cin >> a;
	}
};

class 출력옵션
{
private:
	기본입출력 &ref;
public:
	출력옵션(기본입출력 &r) : ref(r) {};
	기본입출력 진수변환(int x = 10)
	{
		using namespace std;
		switch (x)
		{
		default:
			cout << dec;
			break;
		case 16:
			cout << hex;
			break;
		case 8:
			cout << oct;
			break;
		}
		return ref;
	}
	inline 기본입출력 소수점(int x)
	{
		using namespace std;
		cout.precision(x);
		return ref;
	}
};

class 시스템클래스
{
public:
	inline void 정지()
	{
		system("pause");
	}
	inline void 정리()
	{
		system("cls");
	}
	inline void 명령(char a[])
	{
		system(a);
	}
};

class 수학클래스
{
public:
	수학클래스()
	{
		srand(time(NULL));
	}
	int 랜덤값()
	{
		int x = rand();
		return x;
	}
	int 랜덤값(int a)
	{
		int x = rand() % a;
		return x;
	}
	int 랜덤값(int a, int b)
	{
		int x = rand() % b - a;
		return x;
	}
	template <typename type>
	inline type 제곱(type a, int b)
	{
		type temp = 1;
		for (int i = 0; i < b; i++) temp *= a;
		return temp;
	}
};

template <typename T>
int 길이(T *len = nullptr)
{
	int count = 0;
	
	while(1) {
		if(*(len + count) == NULL) {
			break;
		}
		count++;
	} 
	return count;
}

class 문자열클래스 {
	char** 자르기(char* tmp, char ch)
	{
		int count = 0;
		int ch_count = 0;
		int length = 0;
		int max_length = 0;
		while(1) {
			length++;
			if(*(tmp + count) == ch) {
				ch_count++;
				if(max_length < length) {
					max_length = length;
					length = 0;
				}
			}
			count++;
			if(*(tmp + count) == NULL) {
				break;
			}
		}
		ch_count++;
		int index = 0;
		char **return_array = (char**)malloc(sizeof(char) * ch_count);
		for(int i=0; i<ch_count; i++) {
			return_array[i] = (char*) malloc(sizeof(char) * max_length);
			printf("%d\n",index);
			for(int j=0; j<max_length; j++) {
				return_array[i][j] = *(tmp + index);
				index++;
				if(*(tmp + index) == ch) {
					index++;
					break;
				}
				else if(*(tmp + index) == NULL) {
					break;
				}
			}
		}
		return return_array;
	}
};

기본입출력 입출력;
출력옵션 출력(입출력);
문자열클래스 문자열;
시스템클래스 콘솔;
수학클래스 수학;

#endif


Example 1: “안녕 세상!”

1
2
3
4
5
6
7
#include "korcoding.h"

정수 진입점(공백)
{
    입출력.출력("안녕 세상!").새행();
    반환 0;
}

KorCoding의 기본적인 Hello World 구조를 보여줍니다. C#의 Console.Writeln();과 같은 구조에 영감을 받아서 클래스의 구조는 SelfRef구조로 작성되었습니다.


Example 2: “만약? 아니면!”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "korcoding.h"

정수 진입점(공백)
{
    정수 ;
    입출력.입력();

    만약( == 0)
    {
        입출력.출력("'가'는 0입니다.").새행();
    }
    아니면
    {
        입출력.출력("'가'는 0이 아닙니다.").새행();
    }
    반환 0;
}

if문은 단지 #define을 이용하여 구현되어 C언어와 큰 차별점을 가지고 있지 않습니다.


Example 3: “클래스”

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 "korcoding.h"

클래스 하나의_예시_클래스
{
숨김 :
    정수 ;
    정수 ;
    정수 ;
공개 :
    예시(정수 인자1, 정수 인자2, 정수 인자3 = 수학.랜덤값())
        : (인자1), (인자2), (인자3) {};
    공백 출력(공백)
    {
        입출력.출력("예시 클래스를 출력합니다.").새행();
        입출력.출력("변수 가 : ").출력().새행();
        입출력.출력("변수 나 : ").출력().새행();
        입출력.출력("변수 다 : ").출력().새행();
    }
};

정수 진입점(공백)
{
    하나의_예시_클래스 *테스트 = 동적 하나의_예시_클래스(수학.랜덤값(100), 수학.랜덤값(1,50));
    테스트->출력();
    반환 0;
}

위 예시는 클래스 생성과 사용에 대한 코드를 나열하고 있습니다. 진입점에서 동적예시인 예시 클래스를 만들어 100이내의 랜덤값을 가, 1-50이내의 범위의 랜덤값을 나에 부여하고 다에는 기본적으로 랜덤값이 부여되어 결과값은 3개의 랜덤값이 연속으로 출력됩니다.


Example 4: “길이”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "korcoding.h"

정수 진입점(공백)
{
    정수 학생_점수_배열[] = {88, 54, 70, 80, 100, 80};
    정수 합계 = 0;

    반복(정수 =0; <길이(학생_점수_배열); ++)
    {
        합계 += 학생_점수_배열[];
    }

    입출력.출력("학생들 점수 합계 : ").출력(합계).새행();
    반환 0;
}

이번에(2019-04-04) 새로 추가한 길이 함수입니다. 배열의 길이를 측정하여 좀 더 편리하게 반복문을 사용할 수 있게 됩니다. 아직 불안정한 기능입니다. 5개 이하의 정수 배열에서 잘못된 값을 출력하고 있으며, 점수에 0을 NULL로 인식하고 있습니다. 이는 지속적으로 개선할 것입니다.


Example 5: “문자열 자르기”

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "korcoding.h"

정수 진입점(공백)
{
    문자[] 나의_정보 = "BaeJino,Student,Blogger";
    문자** 잘라진_나의_정보 = 문자열.자르기(나의_정보);

    입출력.출력("이름 : ").출력(잘라진_나의_정보[0]).새행();
    입출력.출력("직업1 : ").출력(잘라진_나의_정보[1]).새행();
    입출력.출력("직업2 : ").출력(잘라진_나의_정보[2]).새행();

    반환 0;
}

이번에(2019-04-05) 새로 추가한 문자열 클래스의 자르기 함수입니다. 파이썬의 split의 기능과 동일한 기능을 수행합니다.

Jino Bae
WRITTEN BY

Jino Bae

웹 개발자 지망생
im@baejino.com

comments powered by Disqus