본문 바로가기

후기/강의 후기

[완강 후기] 안랩샘 14기 '자바프로그래밍 입문'

728x90

 

- 공부 기간 :  2022년 3월 19일 ~ 4월 23일 (주 1회, 총 5주 과정)  <완강>

- 강의 시간 :  총 20시간

- 플랫폼 :  맘잡고

- 100% 온라인 강의

선택 이유


당시의 나는 햇병아리 그 자체였다. 개발자가 되고 싶은데 무엇을, 얼마나 공부해야 할지 감조차 잡지 못했던 상황에서 욕심은 많았다. 오히려 모르니깐 장밋빛 미래를 상상할 수 있었다. 그러나 한편으로는 두려웠다. 지금 내가 공부한답시고 펼쳐 놓은 자바 책의 내용도 모두 공부하지 못한 상태인데, 여러 부트캠프 커리큘럼에 등장하는 수많은 IT 기술 용어들을 보면 한 걸음도 내딛지 못한 것 같아 너무 막막했다.

 

그래도 일단 'Java' 언어의 기본이 충실해야 한다는 생각은 바뀌지 않았다. 아직 이 언어가 어떻게 쓰이는지도 모르는 상태였지만, 최소 자바의 정석 책에 등장하는 개념들을 이해하지 않고선 앞으로 나아가는 게 무의미하다고 느꼈다. 그래서 혼자 책을 보며 공부하며 시간을 보냈다.

 

정말 답답했다. 기본적인 내용은 그렇다 쳐도 객체지향 파트로 넘어가선 너무 낯선 세상인지라 혼란스러웠다. 책으로 공부할 때 이해되지 않는 부분을 훗날 다시 보면 과거엔 보이지 않았던 연결 고리가 떠오르기도 한다. 하지만 몇몇 개념들은 보고 또 봐도 도대체 무슨 말인지 감도 안 오는 경우가 있다. 해당 저자의 관점에서 설명하는 정보론 나에게 한계가 오는 지점이 분명히 존재한다. 객체지향과 더불어 이후 스트림, 람다, 제네릭 등의 새로운 개념들이 등장할 때마다 부담이 됐다. 오로지 텍스트란 정보로만 이해해야 하는 압박이 있었다. 그런 면에서 자바의 정석 책은 뒷부분에서 나에게 도전을 남겼고 진도 나가기가 무서웠다.

 

이러한 상황에서 안랩샘 아카데미의 자바 프로그래밍 무료 강좌를 모집한다는 공고를 봤다. 어떤 커리큘럼인지 자세히는 몰랐으나 일단 라이브 수업으로 진행되어 내가 모르는 부분을 물어볼 수 있다는 점 만으로도 지원의 충분한 이유가 됐다. 그렇게 간략한 자기소개서와 함께 지원을 했고, 다행히도 선발되었다!

강의 내용


강의는 100% 온라인, '줌'으로 진행됐다. 토요일 오후 2시부터 오후 6시까지 4시간 동안 주 1회 진행되었으며, 총 5주간 이뤄졌다. 안랩 샘 아카데미는 출결 사항에 굉장히 신경을 많이 쓴다. 결석은 물론 지각까지 감점 제도가 도입되어 있으며, 50분 수업하고 10분 쉬는데 시간 관리가 분 단위로 철저하다. 또 중간에 구글폼으로 중간 출결을 하고, 화상 카메라를 킨 채 출석 사진까지 찍는다. 아무래도 안랩이란 대기업에서 후원하는 만큼 관리가 철저히 이뤄지는 것 같았다. (이 시스템은 안랩샘 데이터베이스 수업과 동일하다)

 

중간출석을 반드시 해야한다.

 

기본적인 커리큘럼은 다음과 같다. 

 

 

수업은 강사가 준비한 PPT를 이용했다. JDK, 이클립스 IED 설치부터 시작해서 기본적인 자바 문법을 가르쳤다. 당연히 자료형, 연산자, 제어문과 반복문, 메서드가 선행되었고, 이후 클래스와 스코프, 생성자 등의 객체지향으로 진도가 나갔다. 

 

이 수업에서 질문의 빈도는 단연코 내가 제일 많았다. 다음은 내가 수업 중에 한 질문 리스트들이다.

 

더보기

1. 'a'를 저장하면 2byte를 사용하는데, 그렇다면 "ab" 두 개 저장하면 2+2 = 4byte, "abc"를 저장하면 2+2+2 = 6byte를 사용하는 건가요? 아니면 문자열은 참조형 변수라서 주소 값으로 저장되는 건가요? (맞다면 주소 값은 저장공간이 어떻게 되나요?)

2. 두 번째 질문은 똑같은 3을 저장해도 int는 32bit를, long이면 64bit를 사용하는 건가요?

그렇다. 선언하는 자료형에 따라 메모리에 할당되는 크기가 다르다.

3. char에서 int로 변환할 때 유니코드는 16진수로 변화하나요? 10진수로 보고 싶으면 따로 연산을 해야 하나요?

4. 책에서 &, |, ^ 는 비트 연산자로 본 것 같은데, 비트를 연산할 때만 사용하지 않나요? 아니면 일반 식에서도 사용하나요?

6. for문에서 초기식(int i=0)을 생략하고, 인스턴스 변수를 사용할 수도 있나요? 그리고 증감식을 사용하면 해당 인스턴스 변수도 값이 변화게 되나요?

가능은 하지만, 추천하지 않는다. for문에서 사용되면 인스턴스 변숫값이 변경되어 오류가 날 수도 있다. 해당 인스턴스 변수 값도 변화한다.

7. int [] arr = new int []; 이렇게 저장공간 크기를 설정하지 않고 선언하면 오류가 나나요?

8. for each 문에서, 'int elem'는 for each 내에서만 사용하고 다른 곳에선 사용하지 않는 건가요?

 내부에서만 사용하고 다른 곳에선 사용하지 않는다. 

 

9. 프레임워크가 개발에 도움을 준다고 알고 있는데, 이론적으로 프레임워크 없이 자바만으로도 서버 개발이 가능한가요?
▶ 물론 가능하다! 대신 많이 번거롭다.

10. 스택 영역이 콜 스택인가요?
▶ 콜 스택은 스택을 불러오는 것이다.

 

11. 메서드를 호출하고 결과를 리턴해서 객체끼리 상호작용하는 것을 '캡슐화'라고 하는 건가요?
▶ 그렇지 않다. 약간 다르다.

12. 생성자에는 접근제어자가 안 붙나요?
▶ 생성자에도 접근제어자가 붙는다.

13. 그러면 캡슐화를 하려면 멤버 변수에 private을 붙이나요?
▶ 그렇다.

14. 자료구조란 무엇인가?
▶ 스택도 자료구조 중 하나이다. 차례차례로 처리하는 것. 트리, 큐 같이 자료를 어떻게 잡는지를 이론화하는 것이다.

15. 신입 개발자로 취업 준비하는데 정보처리기사 자격증 취득이 많이 도움이 될까요??
▶ 그렇다. 특히 공공기관과 협업할 때는 더 그렇다. 이직에도 좋다.

16. 메서드 오버 로딩은 같은 클래스(객체) 내에서만 적용되는 것이지요? 만약에 서로 다른 클래스에 동일한 이름을 가진 메서드가 있다고 오버 로딩이라고 하지 않지요?
▶ 그렇다. 같은 객체 내에 있는 메서드만 오버로딩이 된다. 다른 클래스에 있으면 클래스명으로 구분이 가능하기 때문이다.

17. 이클립스에서 한 문장의 처음에서 끝으로 커서를 한 번에 옮길 수 있는 단축어가 있을까요??
▶ home키, end키

 

18. 객체를 생성하면 heap 메모리에 저장되는데, 그럼 객체를 만들기 위한 청사진인 class 파일은 어떤 메모리에 저장되어 있나요??

▶ 클래스를 저장하는 영역은 클래스 메모리 영역, 즉 상수가 있는 곳에 저장된다. class 파일은 계속 유지된다.

 

19. 현재 예제의 for문안의 model과 speed 변수에 다 this를 붙였는데, 이 예제의 for문안에선 this가 필수는 아니죠?
▶ 이름 구분이 충분히 가능하면 굳이 this를 써줄 필요는 없다. 하지만 명확하게 하기 위해 많이 쓴다.

20. 싱글톤 패턴이 필요한 이유가 무엇인가요?
▶ 스프링 프레임워크에서 쓰이는 객체들은 대부분 싱글톤 패턴이다. 보통 하나의 객체만 만든다.
변하지 않기 때문에 안전하다.

21. 접근제어자는 오버 로딩과 관련이 있나요?
▶ 접근제어자와 오버 로딩은 관련 없다. 반환 값도 상관없다. 오버 로딩은 메서드 이름과 매개 변수만 상관이 있다.

22. 만약에 A클래스가 default인데 A의 a 메서드는 public입니다. 상속받지 않은 다른 패키지의 B클래스에서 a 메서드를 받아올 수 있나요?
▶ a 메서드를 사용하려면 먼저 A 클래스를 만들어야 하는데, 클래스가 default이기 때문에 다른 패키지에서 만들 수 없다. 결론은 못 사용한다.
  ** 필드, 메서드가 public이라도, 클래스가 접근이 안되면 선언이 안된다! 결국 가장 큰 그림으론 클래스가 접근이 가능해야 한다!! 물론 오류는 나지 않는다.

23. 클래스에 private을 사용하지 않는 이유는 이해했습니다. 클래스에서 protected를 사용하지 않는 이유는 무엇인가요?
▶ 부모 클래스를 자식 클래스에서 사용할 수 있다. 이미 상속 자체가 부모 클래스를 사용할 수 있기 때문에 protected가 무용하다. protected는 자식이 사용 가능한 건데, 이미 상속으로 해결됐으니 protected를 클래스에서 사용하는 건 쓸모가 없다.
 
24. @Override라고 적는 건 컴파일러를 위해 적어주는 것인가요? 개발자들이 아니라요? 
▶ 그렇다 컴파일러에게 override 한 것이라고 알려주는 것이다. 물론 개발자들도 본다. 필수는 아니지만 오타가 있으면 컴파일러가 알려준다.

25. 다운 캐스팅을 하고 나면 자신을 포함해서 부모 클래스의 필드도 다 사용 가능한 거죠?
▶ 사용 가능하다!

26. instanceof은 다운 캐스팅을 할 때만 사용하나요?
▶ 다운 캐스팅만 사용한다. 업 캐스팅은 어차피 자동으로 형 변환되기 때문이다. 다운 캐스팅은 확인이 필요하다.

27. (형 변환) 만약에 자식인 child 객체의 새로운 기능을 사용하려면 그냥 새롭게 객체를 생성하면 될 것 같은데, 왜 굳이 부모를 형 변환을 사용하나요?
▶.. 여러 가지 사용하려고...?

28. SOLID에서 OCP 원칙을 적용하기 위해서 인터페이스를 사용한다고 봐도 무방할까요??
▶ 그렇게 생각해도 무방하다!

29.  PrintWriter를 통해 저장되는 파일 'saveExpression.txt'의 저장 위치를 알려면 어떻게 해야 하나요??
상대 경로로 되어 있어 클래스 파일과 경로가 동일하다.

30. 실수도 계산하고 싶지만 console에는 정수로 표현하고 싶을 땐?
▶ int 및 double 형 확인하는 함수가 있는지, 확인하기. 나누기했을 때 나머지가 0 인지 함수를 만들어서 확인하기

31. 만약 상위 버전 JDK를 통해 작성한 코드를 하위 버전의 JDK를 적용한 이클립스에서 동작하려고 하면 안 되나요? 그 반대 경우인 하위 버전에서 작성한 코드를 상위 버전에선 문제없이 돌아가나요?
▶ 상위 버전에서 작성된 코드는 하위 버전에서 돌아가지 안될 경우가 있다. 반대의 경우는 문제가 없다.

32. 보통 자바 버전이라고 하면, JDK 버전을 말하는 거죠?
▶ 그렇다. 동일한 의미다.

 

어찌 보면 사소한 질문일 수도 있는데 독학하는 입장에선 충분히 궁금할만했다. 내 생각엔 이 수업의 최대 장점은 실시간으로 강사에게 질의응답을 할 수 있다는 점이다.

 

수업을 진행하는 모습

 

과제는 총 3번 나왔다. 첫 번째 과제는 '구구단' 출력하기였다. 이차원 배열과 for문을 이용하는 가장 대표적인 연습문제인데, 나는 이미 자바의 정석을 통해 구현해본 적이 있어 그다지 어렵지 않았다. 대신 난이도 조절을 위해서 조건이 추가되었는데 3, 6, 9가 포함된 값을 출력하지 않아야 했다. 이 부분이 조금 고민이 됐다. 내 접근 방식은 일의 자리 3, 6, 9뿐만 아니라 십의 자리에도 3, 6, 9가 포함되면 안 되기 때문에 String 타입으로 바꾼 다음 그 내부에 "3", "6", "9"가 있는지 확인하는 메서드를 이용했다. 그러자 정상 작동됐다. 너무 뿌듯하더라!

 

강사가 제안한 정답은 굳이 String으로 바꾸지 않고 int형의 특징(소수점은 버리는 특징)을 활용 방식이었다. 특정 숫자에 '나누기 10'을 하면 1의 자리가 버려지고 10의 자리만 몫으로 계산된다. 이것을 통해 10의 자리에 3, 6, 9가 있는지 확인할 수 있다. '나머지 10' 연산을 통해 1의 자리만 구하면 해당 조건을 확인이 가능하다. 내가 생각한 정답보다 훨씬 좋아 보여 좋은 배움이 됐다.

 

두 번째 과제는 객체지향 개념들에 대해 정리하는 시간이었고, 마지막 과제는 인터페이스를 통해 실제 계산기를 구현해보는 것이었다. 과거에 스스로 계산기 앱을 만들어 본 적이 있어 이 또한 어렵지 않았다. 하지만 FileWriter 클래스와 FileReader 클래스를 이용해 파일을 저장하고 읽어오는 기능은 처음이라 추가 자료조사가 필요했다. 결과적으로 문제없이 완성할 수 있었다. 다만 다른 학생들의 구현 파일을 보면서 내 코드가 지저분하고 개선사항이 많다는 사실을 깨달았다. 항상 겸손을 잃어선 안 되는 부분이다. 따로 시험을 보진 않는다.  

좋았던 점


(1) 수업이 라이브로 진행되어서 실시간 질문을 할 수 있다는 점이 최고로 좋았다.

 

(2) 강사가 친절하고 열정 있게 가르쳐주었다.

 

(3) 무료로 강의를 수강할 수 있었던 점도 긍정적이다. 

아쉬웠던 점


(1) 수업 내용이 학생 친화적이지 못했다. 이 점이 이번 수업에서 가장 아쉬운 부분이다. 무슨 말이냐면 해당 개념을 처음 접하는 학생의 입장에선 그리 친절한 수업이 아니었다. 해당 수업은 '입문'이다. 때문에 프로그래밍을 한 번도 경험해보지 못한 사람들도 있기 마련이다. 하지만 기본적인 내용들을 다룰 때 이미 알고 있다는 전제로 수업이 진행되는 느낌이었다. 나는 독학으로 선행이 되어 있어서 수업 내용이 어렵진 않았다. 그러나 "처음 듣는 사람들에겐 내용이 어려울 것 같은데?"라고 우려가 들었으며, 실제로 일부 수강생들은 비슷한 공감대를 가지고 있었다.  

 

(2) Java란 광대한 분량을 짧은 시간 내에 모두 다루려고 하니 개념적으로 설명이 부족한 부분이 많았다. 특히 객체지향 영역은 말할 것도 없다. 2~4시간 동안 모든 객체지향의 특성을 설명하는 것 자체가 애초에 불가능하다. 이러한 한계가 분명히 있었다.

 

(3) 수업 형태가 실습을 간과하고 있었다. 대부분 강의 형식으로 진행되었는데, 중반부부터 실습에 대한 이야기가 나와 도중에 추가가 되었다. 초반 수업 설계에 실습이 없었던 만큼 실습하는 과정이 어설펐다. PPT에 띄운 코드를 학생들이 자체적으로 따라 칠 때까지 강사가 기다리는 정도였다. 이런 부분이 많이 아쉬웠다.  

총평


해당 강의를 통해서 Java 자체의 지식이 깊어졌다는 말에는 의구심이 남는다. 내 경우엔 이미 알고 있는 부분을 복습하는 것이었고, 시간 한계상 아주 기본적인 개념들만 짚고 넘어갔기 때문이다. 수업 자체의 효과론 'Java' 공부에서 등장하는 여러 개념들을 한 번 훑고 넘어가는 정도에 그쳤다. 강사의 가르치는 스킬에 대해서도 아쉬움이 남는다.

 

Java의 모든 부분들을 다 건드리지 않고 차라리 아주 중요한 부분(예를 들어 객체지향)만 파고 들어갔으면 어땠을까 생각해본다. 하나의 개념에도 연관된 기능들이 많기 때문에 고구마 줄기가 엮이듯 공부했으면 흥미도 더 올라갔을 것 같다.

 

아쉬움이 많지만, 해당 수업을 통해 Java가 더 친숙해진 것이 사실이다. 낯선 개념들에 대한 거부감도 많이 사라졌고 이후 학습에 있어 긍정적으로 작용할 것이 확실하다. 15기부턴 수업 참여 대상을 확실하게 정한 다음, 입문이라면 아예 초반 부분만이라도 확실히 다루는 게 좋을 것 같다.   

 

https://www.momjobgo.com/

 

맘잡고 - 내일을 만나다

내 브랜드 가르치며 인정 받고 성공을 이루는 곳, 이 모든 인프라를 누릴 수 있어요.

www.momjobgo.com