안녕하세요. 여러분들에게 학습관련 조언을 구합니다.

battlexnwl의 이미지

안녕하세요. 여러분들의 조언이 필요해서 이렇게 글을 올려봅니다..

저는 모 대학교의 학생으로 올해 한국 나이로 25살입니다.

학교를 다니면서 2학년을 마칠 때까지 수학과에서 수학을 전공했고, 복수전공 욕심으로 학점은 4/4.5로 4학년까지의 필수과목들을 대부분 이수했습니다..

그리고나서 군대를 다녀왔고, 어릴때부터 프로그래밍에 관심이 있었던 터라 소프트웨어공학으로 전과해서 지금은 3학년 2학기 역학기로 복학했습니다.

그럼 이제 스케일이 나오죠.. 학년은 3학년에 프로그래밍은 거의 할 줄도 모르는 상태이니 기초부터 새로 닦아야했습니다.

수업이 c++위주이다보니 hello world부터 혼자서 how to랑 이런저런책들을 참고하면서 공부했답니다.

그러다 이번에 1학년 과제 발표가 있어서 처음으로 소스를 짜서 발표를 했고 최하점을 받았습니다.

발표도중에 교수님께서 처음부터 다시 공부를 해야겠다고 말씀해주시더군요..

비록 1달의 짧은기간동안 혼자서 시간만 들입다 투자하면서 공부를 했지만 프로그래밍이란 새로운 분야의 공부학습을 제가 그저 쉽게 생각했나봅니다.

따로 찾아가서 구체적으로 어떤점에서 잘못되었는지를 교수님께 여쭤보았으나 콕콕집어서 이야기 해주시진 않으시더라구요.

"다른 학생들이 짠 소스랑 너랑은 좀 다르다는건 알겠더나?"라던가 "우리학교에 너를 개인적으로 따로 가르쳐줄 사람이 있을지는 잘 모르겠다"
하시면서 저를 포기하시더군요... 아직 출발시점인 제 입장에서는 많이 난처했습니다.

우물속 개구리가 된 저를 누가 좀 도와줬으면 좋겠습니다.. 제가 짠 소스 보시고 어떤 기본개념이나 생각이 잘못된것인지, 어떻게 프로그래밍 공부를 해야 할 지 조언을 구합니다..

File attachments: 
첨부파일 크기
Package icon payroll.zip251.91 KB
36311의 이미지

늦기 전에 성의가 없는 교수님을 먼저 바꾸는 게 우선일 거 같습니다. 가르쳐줄 사람이 없는 학교라면 일단 학교를 그만두고 등록금이라도 아껴야 할 거 같고요.

* 포럼 주제와 무관한 신변잡기를 반복해서 올리지 맙시다.
* 질문 게시판 만이라도 익명 글쓰기를 막아야 한다고 생각합니다.

snowall의 이미지

일단 첨부하신 파일에서 학번이랑 이름은 빼시는게 어떨까요...

그것만으로도 신상 털릴수도 있을 것 같네요 -_-

직접 짠 소스코드의 생김새에 정답은 없습니다. 굳이 기준을 제시한다면, 수행 속도가 빠를 수록 좋고, 남들이 알아보기 쉬울수록 좋습니다. 나머지는 뭐 언어 종류와 개발 방법론에 따라 달라지겠지만 크게는 이 두가지가 중요해요.

첨부화일을 봤는데, 실행시켜보지는 않았지만, 일단 컴파일 잘 되고 설계한 대로 작동한다면 나쁘진 않습니다.

소스코드를 보니, C++치고는 객체지향적인 모습이 좀 없어 보인다는 느낌이 들긴 하네요.

하지만, 어쨌든 학생이 실력이 있건 없건 학생의 부족한 부분을 제대로 이야기해주지 못하고 포기하는 교수님이라면, 역시 그분에게서 배울 것은 없겠죠.
차라리 학생의 인간성이 나빠서 포기한다면 그 교수님을 이해하겠어요.

뭔가 부족한 부분이 느껴진다면, 코딩보다는 알고리즘과 자료구조를 집중적으로 파서 내공을 쌓으세요. 코딩은 그냥 하다보면 느는 거죠 뭐.

피할 수 있을때 즐겨라! http://melotopia.net/b

battlexnwl의 이미지

답변 감사합니다.. 저도 뒤늦게 다른사람들 발표한것과 잘 생각하다보니 구조적인 측면에서
객체지향이라는 원론적인 부분을 거의 무시하다시피 짠 것 같네요. 비록 돌아가긴 하지만요.
막상 혼나고 나서 몇 시간동안 패닉상태에서 곰곰이 생각해봤는데.
제가 짠 코드에서는 클래스가 클래스로서의 의미를 상실한 것같은 기분이 들어요.
하지만 역시 이 부분이 맞는 생각인지는 아직 확신이 서지는 않네요.

파일 첨부는 파일 명만 바꿔올리고 막상 코드 내부에 있는건 깜빡하고 있었네요.
그래서 문의 보냈습니다. 감사합니다.

neocoin의 이미지

교수가 상황을 몰라서 오해하는건 아닐까요. 비교적 고학번인데 기초 수업에 들어와 있으니까요.

만약, 저렇게 극단적인 이야기를 한 이유가 오직 이 소스 때문이라면, 수업을 바꾸시는걸 추천합니다.

바꿀수 없다면, 일단 저위의 피드백을 바탕으로 함께 발표한 다른 학생들중 괜찮은 학점의 학생들에게 밥이라도 사면서 학생들의 소스 리뷰를 부탁하고 차이점을 깨달으면 좋겠네요.

만약 그 차이점을 인지하고 다시 교수에게 가서 의도한바가 맞는지 확인하면 좀 더 다른 형태의 피드백을 줄 수도 있으리라 생각합니다.

후자가 이상적이라고 생각하는데, 저도 졸업 이후이니 3자의 시각에서 '그때 이러이러 하면 되었구나'라는 생각이 드는거구요. 아마 글쓴이의 상황이라면 극도의 자괴감에 빠졌을 것 같습니다. 어느 분야나 쉽지 않습니다. 힘내세요.

battlexnwl의 이미지

답변 감사합니다..덕분에 위로가 되었네요.
후자를 택하겠습니다. 나중에 정답 보고 소스 리뷰를 하라고 교수님께서 말씀하셨어요.
제가 좋아서 선택한 길이니 겨우 시작 단계에서 극복할 의지를 꺾이고 싶진 않네요.
'차이점'에 대해 조금 더 구체적인 답을 얻고 싶었지만 답변 해 주셔서 정말 위로가 되었습니다. 추석 잘 보내시길

buelgsk8er의 이미지

소스 보니까 각이 안나오는 것은 사실이긴 합니다. 처음하니까 잘 못하는 게 당연합니다. 조언조차 거절하다니 그 교수 참 그러네요.

그래서, 간략하게 몇가지만 짚어볼까 합니다.

void main(void) {
... 중략...
 
  FileStream employeeLoad;
  employeeLoad.datFileLoader(thisYear, thisMonth); // employee.dat파일의 자료를 로드 한다.
}

객체 이름(employeeLoad)도 그렇고, 함수 이름(datFileLoader)도 그렇고, 주석도 그렇고, 이 부분을 읽는 사람은 당연히 저 함수 속에서 employee 데이터를 employee.dat라는 파일에서 읽어들이는 기대하게 됩니다. 그리고는 생각하겠죠. "응? 로드만 하고 끝나네?"

이 의문을 풀기 위해 datFileLoader() 함수 내용을 찾아들어가보면, 그곳에서 자료를 읽어들이는 작업 뿐만 아니라, 데이터를 계산해서, 화면에 출력하고, 다른 파일로 저장하는 내용까지, 전부 그 안에 뭉뚱그려져 있다는 걸 발견하게 됩니다. 뭔가 로딩을 하는 것 같은 이름을 가진 함수에서, 계산과 저장까지 다 하다니, 대략 좋지 않죠.

비슷한 맥락에서, IncludeData 클래스나 FileStream 클래스 같은 경우, 그 이름만 봐서는 그게 어떤 역할을 수행하는 클래스인지 짐작하기 어렵거나(IncludeData), 이름과 실제 수행하는 역할과 매칭이 되지 않습니다(FileStream).

등등.

그래서 총평을 하자면, 컴파일한 결과물이 의도한 출력을 낼지는 모르겠으나(안해봄), 소스코드가 개념적으로 잘 조직 되어있지 않습니다. (크게 나눠봤을 때) A B C를 해야하는 프로그램인데, "B", "C"라고 이름 붙은 부분은 없이, "A"라는 이름 붙은 부분만 존재하고, 그 "A"를 한다고 이름 붙은 부분에서 A B C를 다 하고 있는 식이죠.

다음과 같은 구조를 생각해보시면 어떨까 싶네요.

void main(void) {
... 중략...
 
  // 피고용인의 데이터를 가지는 빈 객체 정의
  EmployeeData employee;
 
  // employee.dat라는 파일에서 객체 내부로 데이터를 읽어들임
  employee.load("employee.dat"); 
 
  // employee 내부에 저장된 데이터와 함수 인자로 주어진 날짜 정보를 가지고
  // 급여 정보를 계산 한 뒤, 이 급여 정보를 갖는 Payroll 객체를 생성.
  Payroll payroll = employee.calcPayroll(thisYear, thisMonth);
 
  // Payroll 정보를 출력
  payroll.display();
 
  // Payroll 정보를 'payroll-<연도>-<날짜>.dat' 라는 파일로 저장
  payroll.save();
}

현재 만드신 프로그램을 *조금씩 조금씩* 바꿔서, 대략 이런 비스무리한 형태를 갖는 프로그램으로 변형하는 연습을 해보시면 어떨까 싶네요.

한꺼번에 싹 다 바꾸다 뭔가 엉키면 도전 의욕을 잃을 수도 있으니, 조금 바꿔서 컴파일 -> 실행 -> 결과 확인 하는 걸 반복하다보면, 어느 순간 프로그램의 전체적인 구조가 내 머리속에 그려지는 순간이 있을 겁니다.

OOP 책 하나 사서 읽어보시고요. 거기 나온 개념들을 다 외우거나 절대화할 필요는 없고, 지금은 대략 그게 뭔지 감을 잡는다 정도로 생각하시면 될 듯 합니다.

battlexnwl의 이미지

구체적인 답변 감사합니다..이제 좀 잘 알 것 같네요.
발표수업이 1학년 과목이다보니 제가 발표를 끝까지했더라면 학우들에게 악영향이 있었을 것 같네요.
최하점을 받은 이유를 이제 알겠네요. 부족한 점에 대해서 자세하게 답변해주셔서 정말 감사합니다.
그저 코딩 스킬들만을 가지고 컴파일 목적으로 짜버렸으니,,, 개념적인 설계 부분에서도 그렇고 객체 명명 방법등에 대해 꼼꼼하게 다가가질 못했기 때문인것 같네요.
제가 답변을 보면서 느낀 점은, 프로그램을 짠다는 것이 결과프로그램을 만들어내기만 하는게 아니라 문제들에 대해서 어떻게 다가가느냐가 더 중요하다는걸 느꼈고, 이 생각이 맞다면 덕분에 이번 기회가 중요한 점을 배울 수 있었던 좋은 계기가 된 것 같습니다.
howto에서는 oop설계에 대해서 나오는 이야기가 없는거 같은데 실제로 잘 짜려면 ..열혈c++에는 oop프로젝트가 많다고 하는데 좀 사서 봐야겠네요

buelgsk8er의 이미지

악영향이라니.. 별로 그렇게까지 생각 안하셔도 됩니다. 1학년들이 코딩 잘해봐야 특출난 학생들 몇몇을 제외하면 거기서 거기일 거예요. 그렇기 때문에, 발표내용 듣고 잘못된 점들을 자근자근 씹어주는게 그 교수의 책임이었을 겁니다.

그럼에도 불구하고 이리 저리 찾아가며 일단 원하는 결과를 내도록 돌아가게 만들었다는 점에서, 제가 교수였다면 그 점을 평가했을 듯.

snowall의 이미지

C++은 OOP를 잘 지원해주기는 하지만, OOP를 배우기에 좋은 언어 같아 보이지는 않아요.

개인적으로는 자바나 VB가 더 객체지향적이라고 생각합니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

bleu의 이미지

처음 치곤 잘하신 소스 같네요..다들 보시는 눈이 다른지라..
제가 보기엔 어느정도 감을 잡으신듯 한데..

잡힐듯 말듯 하는 부분에서 조금..헤매신거 같은데..

이런 경우 실행 계획을 조금 명확히 해서 스스로 이해를 높이고 코드로
구현 하시는게 좋습니다.

먼저 무얼 하실지..

클래스 설계 경우 includeData 같은 경우 자료 구조를 의도 하신듯 한데
완성도를 높이실려면 데이터 재사용성(저장 후 사용)을 위해 저장공간(array,vector,etc)에
저장을 하시는게 좋을듯 하고..

FileStream의 경우는 클래스 네임처럼 데이터의 로드/저장을 주목적으로 하시는게 좋을듯
하네요.
당연히 연산자 오버로딩 하셔서 includeData자료 구조를 받는(vector/array,etc를 받는게 좋겠죠)
메서드가 있어서 거기까지 처리를 해주신다면 의도한대로 되지 않을까 싶네요.

Calcurator 클래스는 유틸리티 클래스인 경우인듯 한데..이 경우는 현직에 계시는 분들은
머 여러가지 방식으로들 구현 하시겠지만..저 같은 경우는 includeData쪽에 합치는게
좋지 않을까 싶네요..

사용되는 메서드의 파라미터들이 모드 자료구조에 있는 내용들이니..
굳이 따로 떼어놓을 필요가 있을까 싶은데..( 이 부분은 구현 하시는 분들마다의 성향이라서..)

일단 제가 보기엔 나쁘지 않네요.. 단지 경험이 부족하셔서 하시는 실수들이..
교수님 말씀에 너무 신경 쓰지 마시고 꾸준히 하시면 좋을듯 하네요.

혹시나 필요 하시면 연락 주세요.

dif공공일 앳 네이버 닷컴

한글 숫자는 아라비안으로 수정해서.. :)

ps. 그리고 덧붙여서 화면 표현쪽은 따로 작업을 하시는게 좋을듯 하네요 :)

battlexnwl의 이미지

클래스를 역할대로 나누고 분류하는 방법(?)이라고 해야할까요..
젤 처음 만들땐 그냥 제 머릿속으로 마음대로 혼자 분류해서 짰다가 코드 쓸 때는 사실 크게 신경안쓰고 짰는데..
끝나고 이리저리 찾아보니 클래스 설계하는 방법이 있고 중요하다는걸 알게 되었네요.
entity class, control class, iohandler class 역할대로 나누어서 하라고 말이죠.. 이게 정석으로 받아들여지는 건지 모르지만
적어도 혼자하는 프로젝트아 아닌 이상 프로그래머분들이 이미 공통적으로 사용하는 부분이라면 당연히 따라가는 편이 좋겠네요.

도움 감사합니다.. 궁금한거 있으면 메일 보낼게요. :)