사진을 합치기위해서는 반드시 사진 크기가 같아야한다!


dst = \alpha \cdot src1 + \beta \cdot src2 + \gamma


알파와 베타는 혼합비 아래와 같은 경우 감마값은 0이다.


#include<iostream>

#include<opencv2\core.hpp>

#include<opencv\cv.h>

#include<opencv2\highgui.hpp>

#include<opencv2\imgproc.hpp>


using namespace cv;

using namespace std;


int main() {


Mat src1 = imread("image/buddha.jpg", CV_LOAD_IMAGE_COLOR);

Mat src2 = imread("image/girl.jpg", CV_LOAD_IMAGE_COLOR);

Mat dst;


int alpha = 0.5;

int beta = 1 - alpha;


namedWindow("Dissolve Image", CV_WINDOW_AUTOSIZE);

//디졸브 하기

addWeighted(src1, alpha, src2, beta, 0.0, dst);

imshow("Dissolve Image", dst);


waitKey(0);

}


트랙바 만들기


createTrackbar("트랙바 이름", "트랙바를 적용할 이미지", 최소값, 최대값);

setTrackbarPos("트랙바 이름", "트랙바를 적용할 이미지", Default 값);

getTrackbarPos("트랙바 이름", "트랙바를 적용할 이미지");


코드

#include<iostream>

#include<opencv2\core.hpp>

#include<opencv\cv.h>

#include<opencv2\highgui.hpp>

#include<opencv2\imgproc.hpp>


#define MAX 255


using namespace cv;

using namespace std;


int main() {


Mat image = imread("image/flower.jpg", 0);

Mat thresholded;

int thredshold;


if (!image.data)

{

std::cout << "open failed" << std::endl;

return 0;

}


namedWindow("Binary Image");


//트랙바 만들기 and 세팅하기

createTrackbar("thredshold", "Binary Image", &thredshold, MAX);

setTrackbarPos("thredshold", "Binary Image", 100);




while (true) {

//트랙바 위치 얻어와서 threshold값에 저장하기

thredshold = getTrackbarPos("thredshold", "Binary Image");

threshold(image, thresholded, MAX - thredshold, MAX, THRESH_BINARY);


imshow("Binary Image", thresholded);



int key = waitKey(1);

if (key == 'q') break;

}

waitKey(0);


return 0;

}





히스토그램이란?

이미지에서 픽셀들이 가지는 값들의 출현빈도를 히스토그램이라한다.

GRAY이미지에서는 0~255값을 가진다.

이미지의 크기를 400 x 400이라고 한다면, 총 160,000개의 픽셀들을 0 ~ 255값에 따라 분류하여

각 개별값을 갖는 픽셀들이 몇개인지 알아낸 것이 히스토그램이다.

calcHist()

void calcHist(

const Mat* images

int nimages,

const int* channels

InputArray mask

OutputArray hist

int dims

const int* histSize

const float** ranges

bool uniform=true, 

bool accumulate=false 

);


images : 대상 이미지

nimages :  배열에 포함된 이미지의 개수

channels : Histogram을 계산할 채널 번호의 배열. 

예를 들어 아래 그림과 같이 BGR이미지 2장에 대해, img1은 B채널, img2는 G채널에 대해서   히스토그램을 구하고자 한다면 {0,4}를 배열에 넣어 전달해야한다.



mask : 히스토그램을 계산할 영역을 지정할 수 있다. Mat()을 전달하면 아무것도 하지않는다.

hist : 히스토그램을 계산한 결과를 저장한다.

dims : 히스토그램 계산 결과를 저장한 hist의 차원

histSize : 빈도수를 분류할 칸의 개수

ranges : 각 차원의 분류 bin의 최소, 최대값을 의미한다.




minMaxLoc()

배열에서 가장 큰값과 작은 값을 찾는 함수

C++ : 
void minMaxLoc(
    InputArray src,
    double* minVal,
    double* maxVal=0,
    Point* minLoc=0,
    Point* maxLoc=0,
)



코드

#include<iostream>

#include<opencv2\core.hpp>

#include<opencv\cv.h>

#include<opencv2\highgui.hpp>

#include<opencv2\imgproc.hpp>


using namespace cv;



int histSize[1];

float hranges[2];

const float* ranges[1];

int channels[1]; 



MatND getHistogram(const Mat &image) {


histSize[0] = 256;

hranges[0] = 0.0; //히스토그램 최소 값

hranges[1] = 255.0; //히스토그램 최대 값

ranges[0] = hranges;

channels[0] = 0;


MatND hist;

calcHist(&image, 1, channels, Mat(), hist, 1, histSize, ranges);

return hist;

}





Mat getHistogramImage(const Mat &image) {


histSize[0] = 256;

hranges[0] = 0.0;

hranges[1] = 255.0;

ranges[0] = hranges;

channels[0] = 0;

// 만약 BGR값을 위한 히스토 그램을 만들고 싶다면, 

// channels[0] = {0}; //blue

// channels[0] = {1}; //green

// channels[0] = {2}; //red 를 해주면된다.


MatND hist = getHistogram(image); // 히스토그램 계산


double maxVal = 0; // 최대 빈도수

double minVal = 0; // 최소 빈도수

minMaxLoc(hist, &minVal, &maxVal, 0, 0);


Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255));


int hpt = static_cast<int>(0.9*histSize[0]);


//그래프 그리기

for (int h = 0; h < histSize[0]; h++) {

float binVal = hist.at<float>(h);

int intensity = static_cast<int> (binVal*hpt / maxVal);

line(histImg, Point(h, histSize[0]), Point(h, histSize[0] - intensity), Scalar::all(0));

}

return histImg;

}


int main() {


Mat image = imread("image/humming_bird.jpg", 0);

Mat thresholded;

Mat eqHist;


if (!image.data)

{

std::cout << "open failed" << std::endl;

return 0;

}


//원본

namedWindow("Image");

imshow("Image", image);


//원본 히스토그램

MatND histo = getHistogram(image);

namedWindow("Histogram");

imshow("Histogram", getHistogramImage(image));



//히스토그램 이퀄라이제이션한 영상

equalizeHist(image, eqHist);

imshow("Image_EQ", eqHist);


//imwrite시에 영상의 퀄리티 정도를 지정해줄수있다.

imwrite("Image_Histogram EQ.jpg", eqHist, { CV_IMWRITE_JPEG_QUALITY , 50 });



//히스토그램 이퀄라이제이션 히스토그램 출력

imshow("Histogram_EQ", getHistogramImage(eqHist));



//영상 이진화

threshold(image, thresholded, 100, 255, THRESH_BINARY);

namedWindow("Binary Image");

imshow("Binary Image", thresholded);


imwrite("Image_Histogram threshold.jpg", thresholded, { CV_IMWRITE_JPEG_QUALITY , 50});




waitKey(0);


return 0;

}



결과 영상



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

6. 디졸브와 트랙바  (0) 2017.04.04
5. 영상 디졸브  (0) 2017.04.04
4. Threshold 와 트랙바  (0) 2017.04.04
2. 컬러이미지 그레이 이미지로 변환하기  (0) 2017.04.04
1. 사진에 글자적기 / 도형 그리기  (0) 2017.04.04

#include <iostream>

#include <opencv2/opencv.hpp>


#include <stdlib.h>

#include <stdio.h>


using namespace std;

using namespace cv;



int main()

{

Mat image, image_gray;

image = cv::imread("image/humming_bird.jpg", CV_LOAD_IMAGE_COLOR);


if (!image.data) { return -1; }


cvtColor(image, image_gray, CV_RGB2GRAY);


namedWindow("Image Grayed", CV_WINDOW_AUTOSIZE);

imshow("Image Grayed", image_gray);

waitKey();


return 0;

}


#include <iostream>

#include <opencv2/opencv.hpp>


#include <stdlib.h>

#include <stdio.h>


using namespace std;

using namespace cv;


int main(void) {


char* path = "image/humming_bird.jpg";

Mat img = imread(path, CV_LOAD_IMAGE_COLOR);


//텍스트 입력

putText(img, "Hello Bird!", cvPoint(150, 50), CV_FONT_BLACK, 1, Scalar(255,255,255));

//사각형 입력

rectangle(img, cvPoint(320, 70), cvPoint(150,10), Scalar(0, 0, 255),1);


namedWindow("Image", CV_WINDOW_AUTOSIZE);

imshow("Image", img);


waitKey();


return 0;

}





“초등학교 4학년부터 재미있고 쉬운 컴퓨터 코딩 교육을 받는다면 청년이 되어 코딩에 능숙한 전문가들이 늘어날 것이고, 그 중에는 스티브잡스와 같은 인재들이 나타날 수 있을 것이다.”

미래창조과학부에서 나온 말이다. 여기에 대해 “소프트웨어 개발에 대해서 알고나 하는 소리냐?”, “스트브잡스가 코딩 잘해서 성공했냐?”라고 따지고 싶은 생각은 없다. 예들 들다 보니 스티브잡스를 그냥 갖다 붙인 것이 아닌가 생각된다. 많은 사람들이 이 정책을 비난하고 있지만 나는 기본적으로 초등학생에게 코딩 교육의 기회를 주는 것을 찬성을 한다. 하지만 찬성하는 마음 못지 않게  어떤 식으로 왜곡돼서 진행될지 매우 걱정스럽다.

나는 초등학생 코딩 교육이 코딩 전문가를 늘리기 위한 것이 아니어야 한다고 생각한다. 선천적으로 뛰어난 논리력을 타고난 아이들을 찾아내고 컴퓨터와 소프트웨어에 대한 흥미를 유발하고 아이들의 창의력을 더욱 향상 시키는 것이 목적이 아닌가 생각한다. 김연아가 어렸을 때 스케이트를 타보지 않았다면 지금의 김연아가 없듯이 코딩 교육의 기회는 소질을 타고난 아이들을 찾는데 도움이 될 것이다.

정부에서 새로운 교육정책을 들고 나오면 먼저 불안감이 든다. 그 동안 신중하지 못하고 준비가 덜 된 교육 정책으로 여러 부작용을 야기해 왔기 때문에 이번에도 또 많은 문제가 생기지 않을까 우려하는 목소리가 크다.  이 정책을 통해서 아이들에게 컴퓨터와 소프트웨어에 대한 흥미를 유발하고 창의력이나 논리력을 키우는데 집중해야 하는데, 또 시험을 통과해야 하고 목표 점수를 얻고 등급을 높이는 방법으로 빠져들어 사교육만 배를 불리고 선행교육이 판을 칠 수 있다.

충분한 시간을 두고 우리나라 초등학생에게 알맞은 교육 도구가 개발된 후에 진행해야 하는데 또 날림공사 식으로 진행될까 걱정된다.

그럼 초등학생 코딩교육의 목적에 대해서 생각해보자.

초등학교 교육은 미래에 전문적인 교육을 받기 위한 기초가 된다. 그리고 기본적으로 사회를 건강하게 만드는 기반이기도 하다. 많은 사람들이 학교 다닐 때 과학과 수학을 어렵게 공부했는데 사회에 나와서는 하나도 써먹지 않아 시간 낭비 했다고 하는데 사실은 그렇지 않다. 어렸을 때의 교육은 지식을 익히는 것뿐만 아니라 논리적인 사고와 합리적인 생각을 하게 해준다.

미분, 적분은 직접 써먹을 기회가 없을 수도 있지만 자신에게 닥친 문제를 합리적이고 논리적으로 해결할 수 있도록 해준다. 비과학과 비논리의 오류에 빠져서 돈과 시간을 낭비하는 일을 줄여준다. 우리가 지금 너무 자연스럽게 생각하고 있는 것은 어렸을 때부터 받았던 교육과 경험의 결과이다.그럼 코딩교육은 어떨까?

100년 전에는 수학, 과학 교육이 거의 필요 없이 살 수 있는 세상이었다. 그럼 30년 후에는 어떨까? SF영화에도 종종 나오기도 하지만 상상하기는 쉽지 않다. 확실한 것은 컴퓨터가 지금보다 10배, 100배는 많이 쓰이는 세상이 될 것이다. 그런 세상에 합리적으로 살아가기 위해서 기본적으로 컴퓨터에 대한 이해와 논리력이 더 필요할 것이다. 교육은 시대의 흐름을 예측하고 대비해야 한다.

많은 초등학생이 잘 준비된 코딩 교육 기회를 접한다면 미래에 많은 소프트웨어 개발자가 생겨날 수도 있을 것이다. 그런데 그렇게 쉽게 기대하기에는 현재 우리나라 소프트웨어 업계는 너무나 매력이 없다. 소프트웨어 업계는 3D 취급을 받고 있고, Dreamless를 포함해서 4D라고 하기도 한다. 이런 바닥에 뛰어난 인재가 더 많이 지원할 리가 없다. 최근 10~20년간 소프트웨어 업계의 인기는 계속 추락해왔다. 대학의 소프트웨어 관련학과도 마찬가지이다.

소프트웨어 개발 일은 툭하면 야근에 부당한 대우에 사회적 인식은 바닥을 유지하고 있다. 좀 똑똑하다는 학생 중에서 미래에 개발자가 되고 싶다는 학생은 그리 많지 않다. 대부분 의사, 변호사가 되고 싶어한다. 코딩 선행 교육이 이런 문제를 해결해주지 않는다. 이런 와중에 소프트웨어 개발의 소질을 발견한들 소프트웨어 업계로 오겠는가? 근본적인 문제는 심하게 왜곡되고 뒤틀어진 소프트웨어 개발 환경이고 이를 개선해야 한다. 소프트웨어 업계가 일할만한 곳이란 비전이 보인다면 많은 인재가 지원을 할 것이다.

스티브잡스와 같은 인재가 탄생하기를 원하고 미래에 소프트웨어 인력이 많이 필요하다면 초등학생 코딩 교육보다 먼저 소프트웨어 업계를 정상화하기 위한 제도와 지원이 필요하다.

초등학교 코딩 교육은 어른들이 배우는 것을 흉내 낼 것이 아니라 논리력과 창의력을 키우는데 집중하고 재미있게 배울 수 있는 교육 도구들을 꾸준히 개발해야 할 것이다. 섣불리 어른이 배우는 것을 비슷하게 배운다면 흥미는커녕 오히려 지겨워할지도 모른다.

초등학교 코딩 교육 정책은 제대로 준비되고 꾸준히 투자가 이루어 진다면 30년 후에 우리나라의 중요한 국가 동력의 핵심이 될 수도 있을 것이다.


출처 : http://www.cnet.co.kr/view/20792



 핸드폰이 흔들리는 것을 감지하려면, 가속도 센서를 이용합니다. 가속도 센서는 핸드폰을 기준으로 x, y, z 방향으로의 가속도만 측정이 가능합니다. 즉, 이 방향성을 가지는 가속도를 가지고 제대로된 움직임을 감지해야하는 것이죠. 센서를 사용하기 위해 SensorListener를 상속받는 엑티비티를 생성합니다. 



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
public class ShakeActivity extends Activity implements SensorEventListener {
 
    private long lastTime;
    private float speed;
    private float lastX;
    private float lastY;
    private float lastZ;
    private float x, y, z;
 
    private static final int SHAKE_THRESHOLD = 800;
    private static final int DATA_X = SensorManager.DATA_X;
    private static final int DATA_Y = SensorManager.DATA_Y;
    private static final int DATA_Z = SensorManager.DATA_Z;
 
    private SensorManager sensorManager;
    private Sensor accelerormeterSensor;
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerormeterSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }
 
    @Override
    public void onStart() {
        super.onStart();
        if (accelerormeterSensor != null)
            sensorManager.registerListener(this, accelerormeterSensor,
            SensorManager.SENSOR_DELAY_GAME);
    }
 
    @Override
    public void onStop() {
        super.onStop();
        if (sensorManager != null)
            sensorManager.unregisterListener(this);
    }
 
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
    }
 
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            long currentTime = System.currentTimeMillis();
            long gabOfTime = (currentTime - lastTime);
            if (gabOfTime > 100) {
                lastTime = currentTime;
                x = event.values[SensorManager.DATA_X];
                y = event.values[SensorManager.DATA_Y];
                z = event.values[SensorManager.DATA_Z];
 
                speed = Math.abs(x + y + z - lastX - lastY - lastZ) / gabOfTime * 10000;
 
                if (speed > SHAKE_THRESHOLD) {
                    // doSomething
                }
 
                lastX = event.values[DATA_X];
                lastY = event.values[DATA_Y];
                lastZ = event.values[DATA_Z];
            }
 
        }
 
    }
}
cs


 onCreate 부분에서는 센서를 사용하기 위해서 시스템 서비스를 가져와서 SensorManager 타입으로 저장해둡니다.

onAccuracyChanged와 onSensorChanged를 오버라이딩 해줘야 합니다. 

함수 이름에서 보시듯 정확도와 센서 정보가 변하면 발생하는 함수입니다. 

흔드는 것을 감지하는 핵심적인 소스는 onSensorChanged 함수에 있습니다. 센서가 변함에 따라 이 함수가 실행됩니다. 센서 종류가 가속도 센서일 때, 이벤트를 처리해줘야합니다. 최근 측정한 시간과 현재 시간을 비교하여 0.1초 이상되었을 때, 흔듬을 감지합니다. 이 흔듬을 감지하는 함수는 조금씩 수정이 가능합니다. 자신의 프로그램에 맞게 설정할 해줄 수 있습니다. 기본적으로는 위의 소스코드에서 보이는 것처럼, 가속도의 벡터값을 이용하여 대략적으로 측정합니다. 정확도면에서는 약간 떨어지겠죠. SHAKE_THRESHOLD 또한 잘 설정을 해줘야 합니다. 속도가 얼마 이상일 때, 흔듬을 감지하겠다는 것을 설정해주는 부분입니다.

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

DialogFragment  (0) 2016.09.24
ListView에 각각 Seekbar 넣기  (0) 2016.09.24
Custom Listview  (0) 2016.09.24
ListFragment  (0) 2016.09.24
ScrollView  (0) 2016.09.15

정부에서는 2015년에 정규교육과정에 편입시킨다는 계획을 발표했고, 이미 대학을 온 인문계 전공 학생들조차 코딩을 배우고자하는 열기가 뜨겁다. 아마 이두희 선배님이 하는 무료코딩교육<멋쟁이 사자처럼>의 높은 경쟁률도 이런 분위기 속에서 나왔을 것이다.


1. 코딩 교육 시장이 커질 것은 사실이다. 하지만 첫 번째 시장은 거품시장이 될 것이다.


일단은 코딩교육 시장이 폭발적으로 성장할 것이라는 사실에는 이견이 없다. 첫 번째로 교육과정 편입으로 인해 학부모들이 사교육에 돈을 지출하기 시작할 것이다. 한국 아동청소년 교육 시장의 경우 그 교육을 받았을 때의 기대값이 금방 시장규모에 반영된다. 왜냐면 대부분의 학부모들은 근본적으로 공부에 대해 이해를 하지 못하고 있고, 사교육 업체는 "불안감을 극도로 조성하는"마케팅을 이용해 이를 충분히 활용하기 때문이다.특히 코딩과 같이 90% 이상의 학부모가 생소한 주제에 대해서는 "이건가보다"하고 무조건 비용부터 지출할 가능성이 크다.


하지만 이 기조가 지속될 것인가? 나는 여기에 이견이 있다. 코딩교육은 너무 과평가되었다. 코딩이 많은 문제를 해결해줄 것이라 얘기하지만 실제로 코딩의 본질을 이해한다면 금방 그렇지 않다는 것을 이해할 것이다. 아래에 그 것에 대한 이야기를 더 길게 서술할 것이다. 일단은 코딩 교육에 대한 기대값이 어떻게 변해갈지를 살펴보자.


그래프가 낯이 익는가? 그렇다. 이 그래프는 그 유명한 가트너 곡선이다. 가트너 곡선은 신기술이 등장했을 때 사람들의 기대감에 대한 변화를 나타낸 곡선이다. 물론 실제 그 기술이 성공적으로 사용되느냐는 이 곡선 자체만으로는 표현되지 않는다. 필자가 굳이 이 곡선을 가져온 이유는 현재 코딩을 바라보는 일반 대중의 관점이 신기술을 보는 것과 전개관점에서 매우 유사하기 때문이다.

신기술이 등장하면 유명한 사람들이 이 기술이 가져올 미래에 대해 이야기하고 이는 구체적인 전공지식이 없는 언론과 경영학계를 거쳐 마케팅 용어로 변해간다. 마케팅용어가 되면 모든 사람들이 실체보다는 그 단어에 집중을 하며 이에 대한 사업기회를 찾거나 포럼을 열거나 하게 된다. 현재 코딩 교육도 그렇다. 몇개 국가의 정부와 성공한 스타트업 대표들이 코딩이 슈퍼파워라고 얘기를 하자 그에 대한 이해도가 매우매우매우 떨어지는 정부조직과 언론들이 이에 가세하여 마치 모든걸 해결해 줄 교육인 것 처럼 기대감을 고조시키고 있다.

하지만 대부분의 신기술과 마찬가지로 코딩 교육도 성급하게 뛰어든 부분에 대해서는 "엇 생각보다 별거 없네?"하는 엄청난 역풍을 맞기 시작하는 때가 올 것이다. 실제로 "코딩"이라는 것은 본질이 없기 때문이다. 지금 뛰어들고 있는 업체와 기관은 대부분 껍데기만 들고 있다. 그래프가 첫 번째 바닥을 찍은 거품이 꺼지는 그 때가 코딩의 본질을 이해한 교육 업체들이 서서히 시장규모를 다시 끌어올리는 시기가 될 것이다.





2. 거품시장은 어떻게 꺼질 것인가?


나는 개인적으로 공교육에서의 코딩 교육을 찬성한다. 하지만 섣불리 시작하기 전에 꼭 생각해봐야할 내용이 있다. 그 내용은 바로


"왜 지난 60년간 교수들은 대학에서만, 필요한 사람한테만 코딩을 가르쳤는가"이다.


그렇다. 코딩이 탄생한 이래로 수십년간 몇몇의 올림피아드생을 제외하고는 코딩교육은 대학 아래로 내려간 적이 없다. 올림피아드생은 어느 과목인건 대학과정을 미리 공부를 하니 예외로 두자. 

이러한 교육은 다양하다. 자동차엔진에 대한 역학도, 우리 플러그에 쓰는 교류전기에 대한 이해도 배를 건조하는 방법도 모두 중고등학교에서 가르치지 않는다. 그럴 수 밖에 없다. 왜냐하면 이 내용들을 이해하기 위해서는 많은 선수학습이 필요하기 때문이다. 자동차 엔진을 이해하려면 동역학 뿐만 아니라 재료에 대한 이해도 있어야하고 열역학에 대한 이해도 있어야한다. 물론 연소하는 원료를 이해하는 화학적 지식도 있어야할 것이다. 대부분은 고등학교를 졸업할 때 까지도 이런 지식을 습득하기 힘들기 때문에 엔진에 대해서는 대학교 때 가르치는 것이다. (많은 경우 이런 과목은 대학원으로 넘어가기도 한다.)

코딩도 본질적으로는 대학에 가서야 가르치는 이유가 있다. 코딩을 제대로 하기 위해서는 수학적 배경과 문제해결적 사고능력이 성인 중에서도 매우 뛰어나야하기 때문이다. 극한의 개념이 없는 학생이 알고리즘 최적화에 대해 이해할 것이라 기대할 수는 없다. 특히 코딩은 개인의 재능과 수학적 능력이 크게 영향을 주는 분야기 때문에 초중고등학생한테 지금의 코딩 교육을 그대로 한다는 것은 말이 되지 않는다. 필자가 현재 번역하고 있는 스탠포드의 How to start a startup 강의에서는 미국 전체에서 최고의 학업성취도를 자랑하는 그 학생들에게

" Mediocre Engineers do not build a Great Company " 

라는 문장을 강조한다. 이미 고등학교 때 최고로 치던 학생들 중에서도 실제 소프트웨어 엔지니어가 될 수 있는 사람이 적다고 공언하고 있는 것이다.

자 그럼 이제 논점이 "직업적으로 하기 위해서만 배워야 하는가?"로 넘어오게 된다. 물론 아니다. 앞서 말했듯이 난 코딩 교육을 찬성한다. 하지만 우리가 이 대학에서 배워야할 내용을 섣불리 고등학교 중학교 초등학교 과정으로 가져오면 어떻게 될지 이미 알고 있다. 

그것은 기술과정 과목으로 편입될 만큼 단편적인 수준에서만 배우게 되는 것이다.

실제로 앞서 예시를 든 자동차 엔진은 이미 기술가정 시간에 배우도록 되어있다. 선수학습이 되어있지 않은 학생들이 코딩에 자체만에 대해 제대로 배울 수 있는 것은 그 기술과정 교과서의 엔진에 대한 설명 수준을 넘지는 않는다.


어떤가? 기대치가 당연히 내려갈 것이다. 처음에는 대단한 것이 있는 줄 알았는데 막상 선수학습이 되어있지 않은 상태에서 배울 수 있는 내용은 흥미롭게 읽어볼 기술가정 과목의 한 파트 정도인 것이다. 정말 이 자리에서 필자가 가르칠 수 있는 개념을 모두 읊을 수 있을 정도로 배울 수 있는 양이 적다.

이 것을 시장과 학부모가 깨닫는 순간 거품시장은 순식간에 무너질 것이고 생각보다 그 시기는 금방 올 것이다.




3. 그렇다면 코딩의 본질은 무엇인가?


필자는 정부에서 코딩교육을 하겠다고 무작정 발표했을 때 바로 정부가 코딩 교육을 이해하고 있지 못하다는 것을 단언할 수 있었다. 왜냐하면 한국은 아직 중고등학생들에게 계산기도 못쓰게 하고 있는 상황이기 때문이다.

중고등학교 수준에서 배울 수 있는 코딩은 계산기(어쩌면 공학용 계산기) 사용법을 익히는 것과 크게 다르지 않다. 물론 훨씬 더 다채롭긴 하지만 계산기의 활용가치가 사용자의 수학수준을 벗어나지 못하듯이 코딩의 활용가치 또한 사용자의 수학,논리수준을 벗어나지 못한다.

미국에서는 이미 중고등학생 때부터 계산기를 사용하면서 공부한다. 계산기를 활용하고 Numeric한 접근을 하는 법을 배우는 교육과정이 십수년 전부터 이미 존재해왔던 것이다. 미국 정부가 코딩을 가르친다고 할 때는 그 발판이 마련되어 있는 것인데, 한국 정부는 대책없이  십수년을 뛰어넘고 바로 코딩교육을 하겠다고 하고 있는 것이다.


코딩의 본질은 우리가 알고 있는 수학적 사고를 언어로 표현하는 것이고 이는 간단한 식을 받아주는 계산기를 사용하는 것과 본질적으로 다르지 않다.


이렇게 얘기하면 "언어라도 미리 배워두는 건 어떤가" 하는 질문이 나올 수 있겠다. 일단은 찬성하지만 지금 정부와 언론이 얘기하는 이유 때문은 절대 아니다. 컴퓨터 언어라는 것이 중고등학교 배경지식과 사고력을 가지고 배우기에는 너무 삭막하고 단순하다. 배울 것이 별로 없다. 분기와 반복이 배울 수 있는 대부분의 구조이다. 그 자체만은 한 두시간이면 배울 수 있는 내용일 수 있는데 이를 이렇게 거창하게 과목까지 만들면서 배울 필요는 없는 것 아닌가?



4. 코딩 교육은 어떻게 진행되어야 할까?


지금 대부분의 코딩 교육은 초중고등학교 시스템에 적용하기 힘들다. 단편적이거나 너무 재미 위주거나 너무 실무 위주이기 때문이다. 필자가 주장하는 이상적 코딩 교육 방식은 다음과 같다.




결국은 코딩은 새로운 과목이 아니라 각 과목의 연습문제를 대체하는 방식으로 교육되어야 한다는 것이 핵심이다.


예시를 하나만 보자. 우리는 등비수열과 등비수열의 합을 구하는 방법을 수1시간에 배운다. 이는 이해와 적용을 한번에 해볼 수 있는 좋은 주제이다.

처음에는 공비가 2이고 첫 항이 3인 등비수열의 5항 값을 코딩을 통해 구해보게 한다.

그 뒤 적용 범위를 넓혀 첫항과 공비와 항수를 입력받으면 수열의 n번째 항과 n번째항까지의 합을 출력해주는 프로그램을 짜도록한다. 반복문과 대입수식 몇 개로 구현해낼 수 있을 것이다. 그 뒤에는 공비 값을 1미만과 1초과의 값으로 나누어 무한루프에 가까운 반복문을 돌려 결과를 확인하게 해본다. 이때 공비가 1보다 작으면 항이 늘면 늘수록 수열의 값과 수열의 합이 어떤 값에 다가가는걸 학생들이 직관적으로 관찰할 수 있는데, 그러는 이유에 대한 궁금증이 생겼을 때 쯤 무한수열과 무한급수에 대한 얘기를 시작한다.


개념과의 상승작용이 없는 코딩교육은 가르칠 내용이 너무나 적을 뿐더러 학생에게 아무런 도움도 되지 않는다. 학교건 사업체건 정부기관이건 이 부분을 반드시 염두해 두어야 코딩 교육을 안착 시킬 수 있다.




이런 방식의 교육을 하기 위해서는 기존 교육과정도 잘 이해하고 있고 동시에 소프트웨어에 대한 깊은 지식이 있는 사람들이 오랜 연구를 하고 거품시장이 꺼질 때 쯤 등장해 주어야한다. 우리 에듀캐스트가 매우 이상적인 팀이긴 하지만 이 시장은 모두에게 열려있다고 본다.



출처 : http://taeyoungpark.tistory.com/108

+ Recent posts