더티칭랩 최종 결과보고서

■ 개요

유형 구분	■ 더티칭랩 Ⅰ
참여자 성명(소속)	양경욱(기관시스템공학과), 여동준(기관시스템공학과), 최명수(기관시스템공학과), 서호영(해양융합과학과) 강지훈(헬스케어메디컬공학부)
주제	프로그래밍 언어(Python과 C) 비교를 통한 학생 이해도 조사
정산금액	일금 오십만원 원정 (\ 500,000 )
연구기간	2022년 9월 21일 ~ 2022년 12월 30 일

2022년    12월   12일

작성자 :  양경욱         (인)

전남대학교 교육혁신본부장 귀하

◆ 연구 필요성

>> AI 시대가 도래하고 있는 시점에서 컴퓨터의 역할 비중은 매우 커지고 있으며, 컴퓨터를 이용하기 위한 프로그램 언어 습득은 매우 중요한 교과목이 되었다. 전문적으로 프로그램 언어를 배우고 이용하는 학과의 학생들은 계속적으로 관련된 내용을 가지고 연속적으로 교육을 받기 때문에 쉽게 프로그램 언어에 접근할 수 있으나, 상대적으로 한학기 정도로 수업을 듣는 학생에게는 프로그램 언어를 이용하여 실생활에 적용시킬 수 있는 시스템을 구현한다는 것은 사실상 어려운 것이다.

>> 본 참여 교수들은 교과목 특성상 프로그램 언어를 이용하면 교과 내용을 쉽게 이용하고 이해시킬 수 있다는 점은 인지하고 있으나, 실제로 어떤 프로그램 언어를 가지고 어떻게 학생들에게 접근해야 하는지에 대한 의문점이 많았다.

>> 이러 문제들을 교감할 수 있는 자리가 필요했으며, 강의자가 가지는 교육 내용이 학생들에게 잘 전달되는 것에 관한 의문점을 해소하는 방법이 필요할 것으로 판단하고 있었다. 더더구나, 한 학기만 프로그램 언어를 배우는 학과에서 학생들이 느끼는 프로그램 언어에 대한 생각과 교수자의 접근 방법에 대한 내용을 중심으로 하여 학생들의 이해도를 조사할 필요가 있을 것으로 판단 하였다.

◆ 연구 과정(논의사항)

>> 학생들의 프로그램 언어에 대한 이해도를 조사하기 위하여 Python 과 표준 C를 중심으로  전공 교과목 중 프로그램밍 수업을 중심으로 강의 한 후, 공학 문제에 적용시 효과적으로 적용 가능한 프로그램을 선정하기 위한 강의 플랫폼을 구성하여 교과목 이해도와 성취도를 조사하여 프로그램 언어 교과 운영 방법을 모색하고 수업의 질을 높이고자 하였다.

>> 프로그래밍 수업을 진행하면서 다음과 순서로 진행을 하였다.

① 전공 교과목인 “프로그래밍 및 실습” 교과목을 대상으로 주간별로 Python과 표준 C를  강의함. 연습문제를 중심으로 코딩을 실시하여 각 언어의 장점과 단점을 파악할 수 있도록 수업을 진행시킴. 중간고사 및 기말고사를 통하여 공학 문제에 대한 해결 방법을 코딩을 통하여 해결하도록 유도하고 그 결과를 이용하여 수강 학생들이 쉽게 접근할 수 있는 프로그램 언어를 선정함.

② 전공 교과목인 “보조기계실습” 교과목을 대상으로 2개의 실습 보고서를 코딩을 통하여 문제해결 하도록 지도한 후 그 결과를 파악하여 수강 학생들의 이해도를 파악함.

③ 수강 학생들에게 전달해줄 공학 문제는 참여 교수들의 의견을 받아 다양한 분야에서 적용되고 있는 공학 문제들을 중심으로 수업을 진행함.

④ 여기서 얻어진 결과를 통하여 추후 프로그램 언어 교육에 참고함.

>> 다음 그림은 연구 과정의 순서도를 나타낸 것이다.

◆ 연구 결과

>> 교수자들의 모임을 통하여 산출된 결과를 기초로 하여, 교과 수업 진행 구성을 만들어 보았다. 아래의 표는 각 주에 진행할 내용에 대하여 소개한 것이다.

구 성	주 요 내 용
1주	전체 강의 내용 소개 및 코딩 필요성에 대하여 강의한다. 전반적인 컴퓨터 언어에 사용되고 있는 주요 명령어(함수), 문법 등을 중심으로 강의를 진행하며, 교과서 나오는 예제 문제를 중심으로 코딩을 수행함을 설명한다. 현대 산업 사회에서 절대적으로 필요한 컴퓨터 프로그램을 배우는 배경 및 필요성을 설명한다.
2주	AI의 역사 및 관련 방정식에 관련된 수학적 배경을 간단히 설명하고, 예제 프로그램을 통하여 학생들의 호기심을 이끌어 낸다. AI에 사용된 수학적 배경을 중심으로 설명하고 이것을 코딩에 적용시키는 방법을 설명한다.
3주	“Python”과 “C”언어의 발전 역사에 관하여 설명하고, 코딩을 수행하는 에디터 프로그램으로 웹기반 에디터 프로그램인 “https;//www.replit.com”, “https;//www.colab.com”사용법을 자세히 설명한다. 또한, 일반 프로그램 언어에 언급되지 않는 코딩시 발생될 수 있는 문법 에러문(syntax error statement)에 대하여 설명함으로써 추후 학생들이 코딩시 가지는 불안함을 해소하도록 한다. Python”과 “C”차이점과 유사점도 상세히 설명을 한다.
4주	본격적으로 “Python”과 “C” 언어에 나오는 명령어를 중심으로 코딩을 하면서 필요한 문법과 함께 실습을 통하여 대하여 배운다. 배우는 명령어와 함수는 학생들이 오픈 소스에서 필히 접하는 것을 중심으로 약 20여개의 명령어와 함수를 습득하도록 지도한다. 교과서 뿐만 아니라 오픈소스를 가지고 스스로 알고리즘을 파악하게 하고 공학 문제 등 다양한 문제에 능동적으로 접근할 수 있도록 가급적 1대1로 실습을 지도할 예정이다. 수행한 코딩은 “Python”과 “C”을 이용하여 실습하도록 지도함으로써, 두 언어의 차이를 스스로 인지할 수 있도록 한다. 각 주에 학습할 주요 내용은 다음과 같다. 변수와 수식(“Python”, “C”로 구현), 제어문(조건문, “Python”, “C”로 구현), 제어문(반복문, “Python”, “C”로 구현), 함수(“Python”, “C”로 구현), 파일처리(“Python”, “C”로 구현) 이다.
5주
6주
7주
8주
9주	인공지능(artificial intelligence)의 개요와 역사에 관해 소개하고,] 인공지능과 관련된 여러 가지 사항들에 대해 알아본다. 9주에서는 인공지능에서 중요한 역할을 하는 기계학습(machine learning)의 개념에 대해 알아본다. 다양한 기계학습 기법으로 지도 학습(supervised learning)과 비지도 학습(unsupervised learning)에 대해서 살펴보고 각각 대표적인 학습방식에 대해서 살펴보도록 한다. 10주, 11주에서는 인공신경망의 기초와 함께 최근 가장 활발히 연구되고 있는 심층학습(deep learning(딥러닝))에 관해 알아본다. 심층학습의 대표적인 예로 컨벌루션(합성곱) 신경망(convolutionanl neural networks), 순환 신경망(recurrent neural networks) 대해 학습한다. 각 주에 학습할 주요 내용은 다음과 같다. 기계학습(“Python”, “C”로 구현), 딥런닝 구현(“Python”로 구현) 1, 딥런닝 구현(“Python”로 구현) 2 이다.
10주
11주
12주	지금까지 배운 프로그램 명령어 및 함수를 이용하여 팀별로 프로젝트 정하여 수행하도록 지도한다. 가급적 총 6시간 내로 결과를 도출하도록 함으로써, 지루하고 재미없는 코딩이라는 생각을 지울 수 있도록 생동감 있는 그래픽을 이용한 내용으로 프로젝트를 수행하도록 한다. 일부 프로젝트에서는 학생들이 많이 접하고 있는 엑셀 프로그램과의 상호 연관성을 고려한 내용으로 프로젝트를 수행시키려 한다. 예를 들어 엑셀을 이용한 데이터 분석 알고리즘을 “Python”과 “C”를 이용하여 구현해 보고 그 결과를 상호 비교하는 방법을 통하여, 지금 수강한 과목 내용이 현장에 바로 적용할 수 있는 점들을 강조하여 수업에 집중하고 나아가 프로그램 코딩에 관심을 가지도록 유도한다. 각 주마다 팀별로 평가할 수 있도록 프로그램 프로젝트를 수행하고, 주제는 팀별로 학생들이 스스로 결정하도록 한다. 다양한 주제에 대하여 예시로 제시하였다.
13주
14주

>> 수업 중에 진행할 프로그램 언어 “C”와 “Python”언어 비교 예시

표 1. 두수의 합을 구한 후 값을 변경하여 합을 구하는 프로그램 작성

Python	C
x = 100 y = 200 sum = x + y print(“합은?”, sum) x = 200 y = 100 sum = x + y print(“합은?”, sum)	#include <stdio.h> int main(void) { int x, y; int sum; x = 100; y = 200; sum = x + y; printf(“합은? %d\n”, sum); x = 200; y = 100; sum = x + y; printf(“합은? %d\n”, sum); return 0; }

표 2. 두 개의 값을 가지고 사칙 연산을 해보자.

Python	C
x = 100 y = 200 result = x + y printf(“%s+%s=%s” %x %y %result) result = x - y printf(“%s-%s=%s” %x, %y, %result) result = x * y printf(“%s*%s=%s” %x, %y, %result) result = x / y printf(“%d/%d=%d” %x, %y, %result) print(“원의면적?”, area)	#include <stdio.h> int main(void) { int x, y, result; x = 100; y = 200 result = x + y; printf(“%d+%d=%d”, x, y, result); result = x - y; printf(“%d-%d=%d”, x, y, result); result = x * y; printf(“%d*%d=%d”, x, y, result); result = x / y; printf(“%d/%d=%d”, x, y, result); return 0; }

표 3. 이차 방정식 근 구하기

Python	C
a=float(input("계수 a를 입력하시오: ") b=float(input("계수 b를 입력하시오: ") c=float(input("계수 c를 입력하시오: ") if (a == 0): print("방정식의 근은 %f입니다.", -c / b); else: dis = b*b - 4.0*a*c if (dis > 0) value = sqrt(dis) print("방정식의 근은 %f입니다.\n", (-b + value) / (2.0*a)) print("방정식의 근은 %f입니다.\n", (-b - value) / (2.0*a)) else if (dis == 0): print("방정식의 근은 %f입니다.\n", (-b) / (2.0*a)) else: print("실근이 존재하지 않습니다.\n");	#include <stdio.h> #include <math.h> int main(void) { double a, b, c, dis, value; printf("계수 a를 입력하시오: "); scanf("%lf", &a); printf("계수 b를 입력하시오: "); scanf("%lf", &b); printf("계수 c를 입력하시오: "); scanf("%lf", &c); if (a == 0) printf("방정식의 근은 %f입니다.", -c / b); else { dis = b*b - 4.0*a*c; if (dis > 0) { value = sqrt(dis); printf("방정식의 근은 %f입니다.\n", (-b + value) / (2.0*a)); printf("방정식의 근은 %f입니다.\n", (-b - value) / (2.0*a)); } else if (dis == 0) printf("방정식의 근은 %f입니다.\n", (-b) / (2.0*a)); else printf("실근이 존재하지 않습니다.\n"); } return 0; }

표 4. 파일 읽기 및 쓰기 프로그램 작성

Python	C
## # 이 프로그램은 파일 안의 데이터를 읽어서 처리한다. # # 입력 파일 이름과 출력 파일 이름을 받는다. infilename = input("입력 파일 이름: "); outfilename = input("출력 파일 이름: "); # 입력과 출력을 위한 파일을 연다. infile = open(infilename, "r") outfile = open(outfilename, "w") # 합계와 횟수를 위한 변수를 정의한다. sum = 0 count = 0 # 입력 파일에서 한 줄을 읽어서 합계를 계산한다. line = infile.readline() while line != "" : s = int(line) sum += s count += 1 line = infile.readline() # 총매출과 일평균 매출을 출력 파일에 기록한다. outfile.write("총매출 = "+ str(sum)+"\n") outfile.write("평균 일매출 = "+ str(sum/count )) infile.close() outfile.close()	#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp1, *fp2; char file1[100], file2[100]; char buffer[100]; printf("원본 파일 이름: "); scanf("%s", file1); printf("복사 파일 이름: "); scanf("%s", file2); // 첫번째 파일을 읽기 모드로 연다. if( (fp1 = fopen(file1, "r")) == NULL ) { fprintf(stderr,"원본 파일 %s을 열 수 없습니다.\n", file1); exit(1); } // 두번째 파일을 쓰기 모드로 연다. if( (fp2 = fopen(file2, "w")) == NULL ) { fprintf(stderr,"복사 파일 %s을 열 수 없습니다.\n", file2); exit(1); } // 첫번째 파일을 두번째 파일로 복사한다. while( fgets(buffer, 100, fp1) != NULL ) fputs(buffer, fp2); fclose(fp1); fclose(fp2); return 0; }

◆ 수업 운영 사례

>> 학생들에게 두 언어를 비교하면서 수업을 수행한 결과,

① 코딩 시간이 길어지고

② 전반적인 함수 문법에 에러(error)가 많이 도출되었고

③ 프로그램 이해도가 상당히 떨어짐을 확인하였다.

>> 한 학기에만 프로그램을 교육할 경우에는 한가지 프로그램 언어에 집중하는 것이 좋을 것으로 판단하였다. 학생들에게 있어 처음 배우는 언어여서 집중도 많이 떨어짐에도 불구하고 또 다른 언어와의 문법적인 차이 및 알고리즘 구현에 어려움이 발생되어 수업 집중도가 떨어지고, 프로그램 언어는 어렵다는 선입견을 주며 흥미를 떨어뜨리게 된다는 점을 확인하였다.

>> 교수자의 일방적인 교육 방법과 학생들 입장에서의 과도한 지식 전달은 프로그램 언어 교육에는 그다지 좋은 결과를 얻을 수 없음을 확인하였고, 참여한 교수자들의 의견을 고려한 수업 진행은 수정이 필요할 것으로 판단하였다.

>> 다만, 전문적으로 프로그램 언어를 공부하는 학과에서는 유용한 결과를 얻을 것으로 판단하였는데, 그 이유는 성적이 상위권에 있는 학생들의 반응은 두 언어의 차이점을 극명하게 알 수 있었다는 반응을 보이며 수업 내용에 만족함을 표시하였기 때문이다.