한국에 6개월 동안 머물게 되면서 모여대의 (컴퓨터)비전공 학생들에게 자바를 통한 객체지향을 가르치는 좋은 기회를 가졌다.여학생들 앞이라 떨리고 또 비 전공학생들에게 프로그램을 가르친다는 부담감을 가지고 시작한 첫 수업은 행운의 번호라고 하는 7명의 학생으로 시작되었다. 10명 이하면 폐강이 되기고 나는 실직이 되기 때문에 어찌할까 걱정했는데 내 마음이라도 알아 준듯 2번째 수업부터는 22명의 학생들이 수강을 하게되어 이렇게 떨리는 나의 모 여대 강의는 시작이 되었다. 평소에 프로그램 전공이 아닌 학생들에게 프로그램을 가르치는 것에 관심이 많은 나에게는 정말 좋은 기회였다.
처음에는 쉬운 것들만 가르치려고 했는데 학생들이 잘 따라오고 숙제도 성실하게 해주어 생각보다 더 push (the limits) 했고 그래서 더 많은 것을 같이 나눌수 있었던것 같다. 마지막 숙제로 한학기 동안 배우면서 잘 이해되지 않는 것을 적어 보라는 과제를 내었는데 여기에서 많이 나온 질문들과 한학기 수업중에 설명하기 어려웠던 부분을 정리해보려고 한다. 이러한 개념들을 사전 지식이 없는 학생들에게 가르치는 효과적인 방법이 있다면 아래 답글에 많이 달아 주시기 부탁드립니다. 다음 수업에 많이 활용할 수 있을 것입니다.
우선 가장 어려웠던것은 개념을 가르치는 일이었다. 대부분의 학생이 논리 (loop나 조건)은 매우 강하나 클래스가 나오면서 부터 필드니, method에 값을 넘기는 것 등을 잘 이해하지 못했다. (아마 잘 설명하지 못해서일 것이다.)
예를 들면
class Foo {
void hello(int a) {
a …
}
public class main( String args[]) {
Foo f = new Foo();
int a=3;
f.hello(a)
}
이런 경우 main의 a와 hello method 안의 a를 매우 혼동해 하는 경우가 많았다.
또 다른 어려운 것은 return값을 어떻게 정하는가에 대한 어려움이다. 아무래도 순차적인 방식의 논리 전개에 익숙하다 보니 이중의 일부를 함수/Method 화하고 이를 이용하는 부분에 익숙하지 않은 것이라 생각한다. 어떻게 이부분을 잘 이해할 수 있도록 할 수 있을까?
두번째는 Exception의 개념이다. if등의 condition으로 처리하는것과 Exception 으로 처리 하는 것이 무엇이 다른가 하는 것이다. 어려운 질문이다. 사실 대부분의 Exception들은 if로 구현 할 수 있다. 그러나 if로 하게 되면 코드가 복잡해지고 error check 코드에 대한 재활용도 어려워질 수 있다. 또 어떤 에러가 난 것을 에러가 발생한 곳이 아니라 그 상위에서 처리하고 싶을때는 대부분 함수의 리턴값을 가지로 처리 하는데 예를 들어 C함수의 open 같은 경우 정상적으로 파일을 열면 0보다 큰 값을 아니면 -1을 리턴하게 된다. 그러나 어떤 method가 Object를 리턴한다면 에러가 있을 경우에 무엇을 리턴해야 하는지 결정하기 어렵다. 이럴때 Exception을 사용하면 리턴값과 상관없이 Exception을 throw할 수 있게 된다. (다른 차이점이 더 있을까요?)
질문이 많이 들어온 다른 개념은 private, protected, public 에 대한 것이었는데 이부분은 encapsulation과 관계된것으로 private는 내부 class에서만 접근 가능하고 외부에서는 지정된 method (getter/setter)를 통해서만 접근 가능하게 일종의 access control이라고 생각해주면 좋을것 같다. public은 전체에게 open이고 default인 protected는 같은 package(디렉토리)의 class들은 접근 가능.
다른 질문은 Hashtable에서 나왔는데 values로 값을 가져올때 왜 순서들이 계속 바뀌는지 하는 것이다. values() 는 Collection 을 리턴하는데 자바 API에서 적어 놓은것 처럼 “ Some are ordered and others unordered.” 즉 순서가 정돈되지 않을수도 있다는 것이다. 시간이 짤아 자바 util 들을 다 설명하지 못해 이런부분은 다 이해하기가 어려웠을것 같다.
그리고 끝으로 C에서는 파일을 다룰때 printf 같은거나 fscanf 같은거 하나면 되는데 왜 자바는 File을 열어서 FileInputStream만들고 그다음 다시 BufferedReader 같은거 열어야 비로소 readLine 같은 것을 사용할 수 있는지에 대한 질문이었다. 어떤 교수님들은 이거 어렵다고 자체 라이버르리 만들어서 FileOpen 한다음 바로 readLine이나 prinln 지원하도록 해서 수업에 이걸 사용하던데… 왜 이부분을 너무 복잡하게 한것일까요? 너무 general 하게 I/O를 처리 하기 위함인가요?

Prev
Rss Feed