'개발'에 해당되는 글 11건

  1. 2009/07/24 [뻘짓금지]저장프로시저 자동 문서화하기 (2)
  2. 2008/10/12 학생 무료제품 추가 SQL 2008, Windows Server 2008
  3. 2008/09/22 열람실배정관리 시스템 베타 릴리즈 (2)
  4. 2008/05/25 컴공학생들이 해보는 짝프로그래밍의 고찰 (2)
  5. 2008/04/20 아니 이런코드가 컴파일 되는거? (1)
  6. 2008/04/20 학교는 개발툴 전쟁? (4)
  7. 2008/04/19 학생증 가지고 마이크로소프트 제품 무료로 사용하기 (3)
  8. 2008/04/12 구구단 출력, 이대로 좋은가?
  9. 2008/04/07 비주얼스튜디오 2008에서 VC++ 하기 (학생용) (2)
  10. 2008/04/02 프로그래밍 공부도 방법론을 적용하자 (3)

먼저 필요한 건 데이터베이스의 정보입니다. 그 정보를 바로 엑셀에서 읽을 수도 있지만 여기선 그냥 복사하는 형태로 하겠습니다.


다음은 데이터베이스의 정보를 가져오는 쿼리입니다.

SELECT
/*프로시저이름*/ SO.name AS [ObjectName],
/*파라미터이름*/ P.name AS [ParameterName],
/*파라메터타입*/
[ParameterDataType] = CASE TYPE_NAME(P.user_type_id)
WHEN 'varchar' THEN 'varchar('+ CAST(P.max_length  AS VARCHAR(10)) +')'
WHEN 'char' THEN 'char('+ CAST(P.max_length  AS VARCHAR(10)) +')'
ELSE TYPE_NAME(P.user_type_id)
END + '  ' + CASE P.is_output
             WHEN 1 THEN 'OUTPUT'
             ELSE 'IN'
             END
FROM sys.objects AS SO
INNER JOIN sys.parameters AS P
ON SO.OBJECT_ID = P.OBJECT_ID

WHERE SO.OBJECT_ID IN ( SELECT OBJECT_ID
FROM sys.objects
WHERE TYPE IN ('P'))
ORDER BY
SO.name, P.parameter_id

 

이 쿼리를 실행하면 다음과 같이 반환을 하게 됩니다.

  ObjectName ParemeterName ParemeterDataType
1 usp_procedure1 @param1 int IN
2 usp_procedure1 @param2 varchar(50) IN
3 usp_procedure1 @param3 int OUTPUT
4 usp_procedure2 @param1 int
 
이 내용을 복사하여 엑셀에 있는 시트에 붙여 넣으시기 바랍니다.
그럼 다음과 같이 됩니다.
 
 
여기서 A열을 비워 두었는데 다 이유가 있습니다. 그건 각 저장프로시저들의 그룹단위를 표시하기 위해 비워 두었는데 이유는 나중에 데이터를 열마다 읽을 때 어디서부터 어디까지가 하나의 프로시저묶음인지 알기 위해서 입니다. 그럼 A열 2번째 부터 ‘=B2=B1’ 라는 식을 넣고 1번째는 False라는 문자열을 삽입합니다.
 
 
 
이렇게 되었으면 매크로를 통해 하나의 열을 돌아다니며 표를 만들면 끝이 됩니다라는 코드 작성하면 됩니다.
 
늘 말은 짧고 쉽죠~ 코드는 말이 참 많습니다.
 
그럼 말 많은 코드를 공개하겠습니다.
 

Sub GeneratorParamDoc()
    Dim tableGr As Range
    Dim writeCur As Range
    Dim firstCur As Range
    Dim rowCnt As Integer
    Set writeCur = ActiveCell
    Set firstCur = writeCur.Offset(0, -1)
    rowCnt = 0
     For Each tableGr In Range("A1:A10000")
        If tableGr = False Or tableGr = "" Then
            If rowCnt <> 0 Then
                Range(firstCur.Offset(3, 0), firstCur.Offset(3, 0).Offset(rowCnt, 0)).Merge
                '매개변수
                With Range(firstCur.Offset(4, 1), firstCur.Offset(4, 1).Offset(rowCnt, 3)).Borders(xlInsideHorizontal)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                '매개변수 중앙정렬
                With Range(firstCur.Offset(3, 1), firstCur.Offset(3, 1).Offset(rowCnt, 3))
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                End With
                '큰 틀 그리기
                With Range(firstCur, firstCur.Offset(rowCnt + 3, 4)).Borders(xlEdgeTop)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlMedium
                End With
                With Range(firstCur, firstCur.Offset(rowCnt + 3, 4)).Borders(xlEdgeRight)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlMedium
                End With
                With Range(firstCur, firstCur.Offset(rowCnt + 3, 4)).Borders(xlEdgeLeft)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlMedium
                End With
                With Range(firstCur, firstCur.Offset(rowCnt + 3, 4)).Borders(xlEdgeBottom)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlMedium
                End With
                With Range(firstCur, firstCur.Offset(rowCnt + 3, 4)).Borders(xlInsideVertical)
                    .LineStyle = xlContinuous
                    .ColorIndex = xlAutomatic
                    .TintAndShade = 0
                    .Weight = xlThin
                End With
                If tableGr = "" Then
                    Exit For
                End If
            End If
            rowCnt = 1
            Set writeCur = writeCur.Offset(4, 0)
            Set firstCur = writeCur.Offset(0, -1)
            writeCur.Offset(0, -1).Value = "프로시저명"
            writeCur.Offset(3, 0).Value = "이름"
            writeCur.Offset(3, 1).Value = "형태"
            writeCur.Offset(3, 2).Value = "설명"
            writeCur.Offset(3, 3).Value = "비고"
            writeCur.Offset(1, -1).Value = "프로시저 설명"
            writeCur.Offset(2, -1).Value = "반환형태"
            writeCur.Offset(3, -1).Value = "파라매터"
            '!

            '셀합치기
            Range(writeCur, writeCur.Offset(0, 3)).Merge
            Range(writeCur.Offset(1, 0), writeCur.Offset(1, 0).Offset(0, 3)).Merge
            Range(writeCur.Offset(2, 0), writeCur.Offset(2, 0).Offset(0, 3)).Merge
            '셀 합치기 끝
            With Range(writeCur.Offset(0, -1), writeCur.Offset(0, -1).Offset(0, 4)).Borders(xlEdgeBottom)
                .LineStyle = xlDouble
                .ColorIndex = xlAutomatic
                .TintAndShade = 0
                .Weight = xlThick
            End With

            With Range(writeCur.Offset(1, -1), writeCur.Offset(1, -1).Offset(0, 4)).Borders(xlEdgeBottom)
                .LineStyle = xlDouble
                .ColorIndex = xlAutomatic
                .TintAndShade = 0
                .Weight = xlThick
            End With

            With Range(writeCur.Offset(2, -1), writeCur.Offset(2, -1).Offset(0, 4)).Borders(xlEdgeBottom)
                .LineStyle = xlDouble
                .ColorIndex = xlAutomatic
                .TintAndShade = 0
                .Weight = xlThick
            End With
            With Range(writeCur.Offset(3, -1), writeCur.Offset(3, -1).Offset(0, 4)).Borders(xlEdgeBottom)
                .LineStyle = xlDouble
                .ColorIndex = xlAutomatic
                .TintAndShade = 0
                .Weight = xlThick
            End With
            writeCur.Value = tableGr.Offset(0, 1)
            Set writeCur = writeCur.Offset(4, 0)
            writeCur.Value = tableGr.Offset(0, 2)
            writeCur.Offset(0, 1).Value = tableGr.Offset(0, 3)
            writeCur.Offset(0, 2).Value = tableGr.Offset(0, 4)
        Else
            rowCnt = rowCnt + 1
            Set writeCur = writeCur.Offset(1, 0)
            writeCur.Value = tableGr.Offset(0, 2)
            writeCur.Offset(0, 1).Value = tableGr.Offset(0, 3)
            writeCur.Offset(0, 2).Value = tableGr.Offset(0, 4)
        End If
     Next tableGr
End Sub


 

이 코드는 표를 그리고 정렬하고 데이터 넣고 하는 VBA코드입니다. 이렇게 만들어지기까지 수많은 시행착오가 있었…(모르게 눈물이)

아무튼 멀찌감치 커서를 놓고 위의 매크로를 실행합니다.

실행 결과는 다음과 같습니다.

 

표들이 보이시죠?

그것을 복사해서 문서화하면 되는 것 입니다.

여기서 안타까운건 설명컬럼입니다. 설명컬럼은 일일이 그 컬럼에 가서 써야 하지요. 성격상 또 반복 작업스러운건 질색입니다. 그래서 MSSQL에 있는 설명글을 가져와서 붙이고 싶었지만 MSSQL내부의 프로시저에 설명을 작성하지 않아서 일일이 또 작업을 해야만 했습니다.
만약 설명을 틈틈히 프로시저 만들때 하였다면 이 설명까지 가져와 깔끔한 문서를 생성했겠지요.

MSSQL뿐만 아니라 다른 DBMS의 정보를 맨 처음 쿼리 같이 리스트를 뽑는다면 쉽게 문서화 할 수 있겠죠?

프로시저뿐만아니라 테이블 등등…
더이상 문서를 만들진 맙시다. 개발자는 코드로 시크하게 답변해주자고요~

아무튼 뻘짓금지는 계속됩니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TAG 뻘짓

 

학생으로서 요긴하게 잘 써먹고 있는가운데 기다렸던 제품 2개가 추가되었네요.


https://downloads.channel8.msdn.com/Products.aspx


크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

드디어 시작합니다.

약 9개월 고생을 하여 만든 좌석배치 프로젝트!

경험이 없고 또한 혼자 만들다 보니 헛점투성에 3개월 기간의 프로젝트를 3배로 뻥튀기를 해버렸습니다. 프로젝트 기간의 곱하기 3법칙이 적용이 된 것이죠.

현 시스템은 프레임웍 형태로 제작되어서 코어만 배포하고 개발자는 UI만 적용시키면 되는 형식의 시스템입니다. 그래서 먼미래를 바라보고 만든 시스템이라 많이 뒤집고 엎었고 그래서 오랜시간이 걸렸던 것이죠.

300미터 거리의 중앙열람실을 왔다갔다 하느라 바쁜 와중에 기쁜 발걸음이내요.

앗 방금 또 변경사항이 생겼습니다.

바쁩니다. 나중에 자세한 내용 전달 하겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

애자일방법론을 아시나요?

본인은 애자일방법론을 아주 좋아합니다.(현재 열심히 배우고 있습니다)

쉽게 애자일방법론을 말하자면

알파 -> 베타 -> 베타 -> RC1 -> RC2

위와 같은 순환으로 점진적으로 App를 완성시킨다는 것이죠. 처음 핵심만 만들고 점점 살을 붙이는 격이라 하겠습니다.

위키백과 - 애자일








이에 반면에 폭포수는 프로젝트마다 다르겠지만 대부분 위에 왼쪽 사진과 같습니다.(ㄷㄷㄷ)

여기서 말하고 싶은것은 애자일이 가지는 짝프로그래밍입니다.

짝프로그래밍을 말하려 하는 배경은 본인은 틈틈이 많은 학생들의 코드를 유심히 관찰해 보았습니다. 역시 학생이다 보니 명명법을 비롯해 제대로 된게 하나 없죠. 이것은 배워야 하는 문제이니 스스로가 노력해야겠죠.

하지만 문제는 모두 로직과 스타일이 다른데 스스로가 제대로 한 건지 못한 건지 모른다는 것입니다. 심지어 자신이 잘 짜고 있다고 믿는 학생도 있습니다. 출력만 예쁘게 잘 나오면 장땡인가 봅니다.

자 그럼 본론으로 코드는 사람마다 모두 다르다고 합니다. 맞습니다. 사람의 환경이 서로 다르니깐요. 그래서 인도나 미국회사들은 정해진 스타일의 틀을 지정하죠. 그래야 유지보수가 한결 쉬워지니깐요.

그런데 학생들은 자신의 코드에 대해 망각에 빠진 채 아무런 지적 없이 코딩을 한다는 것이죠. 하지만 정확히 지적하냐는 건 힘들기에 배제하겠습니다.


한컴퓨터로 두명이상이 코딩하기?

처음 이런 소리 들으면 도저히 이해가 안될 것입니다.(저도 그랬으므로)

하지만 애자일 관련 도서나 블로그를 보면 짝프로그래밍의 장점이 분명 있다는 것이고 프로젝트에 있어 매우 효과적이라는 것입니다. 짝프로그래밍 하다가 성격 안 맞으면 욕나오겠지만 유지보수 안돼서 버그나서 욕나오는거랑 맘먹을 것입니다.


그럼 어떻게 짝프로그래밍을 해야 할까요?

일단 학교 숙제를 가지고 서로 한다는건 엄두도 안날 것입니다. 왜냐면 코드가 같으면 낙제니깐요.ㅎㄷㄷ

또 짝이라 하지만 포기한 학생들 분명 있습니다. 즉 한명만 열심히 코딩 할 수도 있다는 것이죠.

그러므로 수업정책상 하기힘든 방법일 것 같네요.

하지만 스스로가 발전되길 바라는 학생이 있을 것입니다. 그런 학생들이 모여 서로 구현을 하려 한다면 분명 발전이 생긴다는 것 입니다.


결론!

프로그래밍 공부는 책을 가지고 반복

프로그래밍 구현은 두명 이상이 한명은 코딩치고 나머지 참여자는 같은 모니터를 보면서 의견내보고(여건이 안되면 어쩔수....)


장점.

컴퓨터대 개인으로 인해 생기는 망상이 깨진다.

코드가 더 정교하게 된다.

단점.

서로 잘났다 하는 친구랑 하면 싸움이 난다.


애자일하면 이렇게 된다.(잘 뭉치면 승리한다)

짝프로그래밍의 장단점에 대해 잘 정리된 글이네요. http://mars.egloos.com/1635173


생각

분명 팀 과제는 있지만 현실은 팀이 아니고 웬수라고들 합니다. 이런 상태에 이런 방법까지 제안한다면 A+ 받기 힘들죠.

그리고 코드는 그저 네이버검색에 의존하여 나온 코드 위주이고 또는 스스로 생각해낸 코드이니 서로 독특하죠.

그래서 개인이 작성한 코드를 학생들끼리 서로 교환하고 서로 지적받고 물어봐야 한다고 생각을 합니다.

즉 분명히 코드의 피드백은 있어야 한다고 생각을 합니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

비주얼스튜디오에서 한글은 가능하단건 알았지만 실지로 한번 전부 한글로 해보았습니다.

소스는 저번 구구단에 대한 얘기를 할때 만든 소스를 사용해 보겠습니다.


#include<stdio.h>

#define 한줄의총커서 72
#define 엑스문자표시총행 16
#define 구구단한계산의글씨량 5

#define 구구단앞숫자 9
#define 구구단뒷숫자 9

void 야너곱하기만해(int x, int y)
{
        printf("%dX%d=%d",x,y,x*y);
}

void 몇줄띄기(int count)
{
        for(int i=0;i<count;i++)
               printf("\n");
}

void 몇칸띌래?(int count)
{
        for(int i=0;i<count;i++)
               printf(" ");
}

bool 짝수이면_(int value)
{
        if(value%2==0) return true;
        else return false;
}

void main()
{
        int
여태총몇줄했어= 0;
       
int
총몇개계산했어= 0;

        int 임시1야= 0;
       
int
임시2야= 0;

        for(int i=1 ;i<=구구단앞숫자;i++)
       
{
               for(int j=1 ;j<=
구구단뒷숫자;j++)
              
{
                      
총몇개계산했어++;
                      
임시1야= (여태총몇줄했어%엑스문자표시총행)+1;

                       if(임시1야<= 엑스문자표시총행/2)
                      
{
                              if(!
짝수이면_(총몇개계산했어))
                             
{
몇칸띌래?((임시1야-1)*구구단한계산의글씨량);
                             
}
                              else
                              {
몇칸띌래?(한줄의총커서-(임시1야*구구단한계산의글씨량)-(임시1야-1)*구구단한계산의글씨량);

                              }

                              임시2야= 임시1야;

                       }

                       else

                       {

                              if(!짝수이면_(총몇개계산했어))

                              {

몇칸띌래?(임시2야*구구단한계산의글씨량);

                              }

                              else

                              {

                                      몇칸띌래?(한줄의총커서-(임시2야*구구단한계산의글씨량)-(임시2야+1)*구구단한계산의글씨량);
                             
}
                       }
야너곱하기만해(i,j);
                       if(
짝수이면_(총몇개계산했어))
                      
{
몇줄띄기(1);

                              여태총몇줄했어+= 1;

                              임시2야--;
                      
}
               }
        }
        getchar();

}

VS 2003부터 가능하지만 VS2003은 앞글자가 영문이어야 한다고 하더군요.

솔직히 지저분하고 쫌 웃기지만  초보들이 읽기에 더더욱 편할 것 같네요.

모로 가든 서울만 가면 되지 않을까요? ^^ (서울을 출력으로 비유한게 아니라 배움)

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

현재 다양한 개발을 위해 적합한 툴을 전도하고 있습니다.

전도의 이유는 아직까지 10년 전의 툴로 10년 전의 기술을 하고 있다는 게 저는 납득이 되질 않거니와 기술도 재미없기 때문에 학생들의 의욕도 없다는 것이죠.

VS?

그래서 VS 2008 무료판을 받고 즐겁게 재미있게 역량을 보이길 바라고 있습니다.
그런데 관점은 전혀 다르게 보고 판단 한다는 것입니다.

대표적인 피드백은 다음과 같습니다.

1. 배우는 입장은 아무것이나 해도 된다.

2. 자기의 취향에 맞춰야 한다.

말로만 비춰보면 100% 맞는 말입니다. 틀린 거 하나 없습니다.
저는 참고로 메모장으로 공부 하였습니다. 하지만 컴파일러는 현재 나오는 것으로 했죠.

"아무거나?"
네! 메모장이 되었든 드림위버가 되었든 이클립스가 되었든 비주얼스튜디오가 되었든 아무거나 하시길 바랍니다.

"취향?"
웹이 되었든 임베디드가 되었든 윈도우즈용이 되었든 맥용이 되었든 원하는 것을 하세요.

사용자 삽입 이미지adobe dreamweaver CS3

사용자 삽입 이미지

하지만 학생들의 관점은 바로 언어(특히 C,C++,C#,자바)라는 것과 또 그 외에 아무것도 모른다는 것입니다. 다른 쉬운 것들 편한 것들 아주 재미있는 것들이 허다한데 C가 개발의 시작점이라 인식이 완전히 박혀 있는 상태입니다. 이 글을 읽어도 아마도 당연히 C가 기초라고 못마땅하실 것입니다.

사실 VS6.0을 해본 저도 아이콘 변경이나 그림삽입 같은 멀티미디어적인 요소에 엄청난 삽질을 해야만 하였고 디버깅도 어지럽게 네이티브코드로 가버리는 등 온갖 삽질투성이게 됩니다. 저는 이런 것이 배움에 있어 더디게 한다고 문제 삼아 왔지만 학생측은 당연시 해왔고 그로 인해 언어는 어렵다라는 인식만 가중되고 있게 됩니다.

다시 한번 위에 피드백을 보자면 배우는데 왜 10년 전 도구와 기술을 배우나요?  그리고 취향이 고전적인가요? 또 현재 컴퓨터에 10년 전 프로그램 찾아보세요. VS6.0 말고 무엇이 있나요? (추가 : 스타크래프도 있네요.)

(추가 - C가 않좋다는 것은 절대 아닙니다. 해당프로젝트에 걸맞으면 C도 당연히 써야죠! 언어가 구식이라는 것을 지적하는게 아닙니다.)

세상은 바뀌고 있고 그 세상에 맞춰 기술은 변화하고 있습니다. 스스로도 변화해야 할 것입니다.

저의 관점은 간단히 말하자면 이렇습니다.

· 코딩은 짧게 생각은 깊게 하라.

· 다양하게 해보고 그 중에 원하는 것을 깊게 하라.

· 자신의 창조물을 만들어라.

지금 하고 있는 기술로는 저의 관점을 충족할 수가 없을 것입니다. 학교의 방침은 따르시되 스스로가 길을 만들어 나가길 바랍니다.

그 길은 자신이 우물 안에 있다는 것을 깨달을 때 더 잘 보일 것입니다.

본인 또한 그 길이 잘 보이도록 노력하겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

학생들의 혜택을 모르고 개발도구나 제품들을 얻기 위해 많은 수고를 하셨을 것입니다.

그것도 불법으로 찝찝하게 말이죠.

이젠 정정당당히 공부하고 개발하세요!

일단 무료 버전은 두가지가 있습니다.

하나는 ISIC로 고가의 정품을 무료로 다운 받을 수 있지만 학생이어야 하고 두번째는 Express 버전을 다운 받는 방법입니다.

ISIC로 제품 받기

학생들은 ISIC(International Student Identity Card)라는 학생을 증명하는 학생증이 있을 것입니다. 그럼 준비는 끝!

학생증을 보시면 ISIC 고유번호가 있을 것입니다.

학생인증은 S로 시작하는 번호를 사용하게 됩니다.

Channel8를 통하여 제품을 얻게 되는데 Channel8의 자세한 설명은 박중석님의 블로그를 참조하세요.

Channel8

준비가 되었다면 다운로드 사이트에 접속하셔서 마이크로소프트 계정으로 로그인 하시기 바랍니다.

다운로드 설명보기

제품 고르기

원하시는 제품을 고르시면 로그인이 안되어 있을시 로그인창이 뜨고 로그인 되면 학생인증창이 뜨게 됩니다.

일단 국가를 고르는데 아무국가나 고르시고 Step3에서 ISIC를 선택하시면 됩니다.

그 다음 버튼(Select and Continue)을 누르고 ISIC번호를 입력하면 됩니다.

S는 대문자로 쓰시고 마지막 문자는 제외 하시고 입력하세요.

그후 다운로드페이지가 나오고 Get Key를 눌르면 Key도 다운을 받을 수 있습니다.

아직 한글언어팩으로 한글화가 가능할지 모르겠지만 일단 정품은 소유하게 되었습니다.

Express 버전으로 받기

마이크로소프트의 Express사이트에 가시면 여러가지 제품을 무료로 받으시면 됩니다.

쉽죠?

아무나 누구나 개발 할 수 있는 환경은 열려 있습니다.
열심히 하셔서 재밌고 멋진 작품 많이 만들었으면 좋겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

매번 언어를 배울때 "Hello World"의 출력문으로 본격적인 배움을 시작하게 됩니다.

그 후 if문과 for문 등을 마치면 서로 약속 한듯 구구단출력을 하게 되는게 일반적이죠.

구구단 출력은 제어문과 반복문을 알기에 좋은 과제인듯 싶습니다.


그런데 간혹 구구단만을 주장하는 학생들을 보기도 합니다.  출력형태를 바꿔봄으로 자기만의 학습을 꾀하게 되는데 여기서 무척 않좋은 습관을 가지게 된다는 것입니다.

소스가 어떠하든 어떻게든 출력해라

그들의 소스를 보자면 가독성이라곤 보이지도 않는 출력은 제대로이지만 재활용 될 수없는 그런 상태인 것을 줄 곧 보게 됩니다.

저는 이런 문제를 많이 제기하였지만 이미 출력위주에 성향이 깊은 학생에게는 좀 무미건조한 지적일 수 밖에 없겠죠.

실무에도 마찬가지이듯 오로지 출력만 장땡으로 자기만 알 수 있고(또한 알수 없고) 버그 발생이나 요구 사항 변경시 엄청난 보수를 치뤄야할 문제가 도살이는 광경을 보게 되는데(본인 얘기) 이런 일을 대비해 학생때부터 그런 출력위주의 관점을 탈피하였으면 하는 바램입니다.

아 그럼 어떻게 짜야하는데?

출력은 첫번째이지만 스스로가 잘 된 코드인지 검토하고 보수하여 발전시켜야 합니다. 먼저 책의 예제를 잘 따라하면 책의 저자는 고수일 것이기에 고수의 스타일을 익히게 됩니다. 그런 반복을 통해 코드 스타일이 더 고수다워지겠죠. 즉 많이 보고 많이 접해야 코드 품질이 향상될 것이라고 말씀드리는 것입니다.

넌 어떻게 하는데? 보여줘!

알겠습니다. C언어로 본인이 한번 구구단을 출력해보겠습니다. 그리고 쫌 복잡하게 출력을 해보겠습니다.

먼저 본인의 코드는 "왜 내가 지금 구구단을 짜야하지?"라는 생각으로 씩씩거리며 코딩하였기에 품질은 우수 하지 않습니다. 그래도 "배움의 길을 걷는 학생들에게 도움이 되겠지"라는 믿음으로 코딩한 것이기에 본인의 수고를 위로해 주시고 복사해서 과제 제출은 삼가하시길 바랍니다.(전국 대학 과제에 돌거라 예상ㅋ)

먼저 출력을 보여드리겠습니다.


X자 형식으로 출력을 해보았습니다.

코드는 다음과 같습니다.

#include<stdio.h>

//한줄의총문자입력가능한수
#define TotalLineCursor 72

//하나의표시에사용되는문자갯수
#define RoundReturnCount 16

//하나의계산의글자크기지정
#define ReturnLength 5

 

//구구단
#define FirstValueCount 9
#define SecondValueCount 9

//곱하고출력하는함수
void MultiplyAndPrint(int x, int y)
{
        printf("%dX%d=%d",x,y,x*y);
}

//입력받은수만큼줄바꿈
void AddLine(int count)
{

        for(int i=0;i<count;i++)

               printf("\n");

}

 

//입력받은수만큼빈공간삽입

void AddSpace(int count)
{

        for(int i=0;i<count;i++)

               printf(" ");

}

 

//짝수판별

bool IsOdd(int value)
{

        if(value%2==0) return true;

        else return false;
}

 

void main()
{

        //총라인수
        int iLineCount = 0;

        //총계산수
        int iReturnCount = 0;

 

        int iTemp1 = 0;
        int iTemp2 = 0;

 

        for(int i=1 ;i<=FirstValueCount;i++)
        {

               for(int j=1 ;j<=SecondValueCount;j++)
               {

                       iReturnCount++;
 

                       iTemp1 = (iLineCount%RoundReturnCount)+1;
 

                       if(iTemp1 <= RoundReturnCount/2)
                       {
                              if(!IsOdd(iReturnCount))
                              {
                                      AddSpace((iTemp1-1)*ReturnLength);
                              }
                              else
                              {                                     

AddSpace(TotalLineCursor-(iTemp1*ReturnLength)-(iTemp1-1)*ReturnLength);
                              }
                              iTemp2 = iTemp1;
                       }
                       else
                       {
                              if(!IsOdd(iReturnCount))
                              {
                                      AddSpace(iTemp2*ReturnLength);
                              }
                              else
                              {
AddSpace(TotalLineCursor-(iTemp2*ReturnLength)-(iTemp2+1)*ReturnLength);
                              }
                       }

                       MultiplyAndPrint(i,j);

                       if(IsOdd(iReturnCount))
                       {
                              AddLine(1);

                              iLineCount += 1;

                              iTemp2--;
                       }
               }
        }
        getchar();
}

참으로 복잡하죠?

여기서 말씀드리고 싶은 것은 변수의 이름과 자주 사용되는 내용을 분리하였는데 여기 예제는 좀 손볼때가 많은 코드이니 대충 이렇구나만 하고 넘어가 주시길 바랍니다.

보시면 함수에 AddLine와 AddSpace가 있고 매개변수에 따라 반복을 하게 됩니다. 이 함수만으로도 엄청난 복잡성을 줄일 수 있고 표현을 다양하게 할 수 있었다라는 것을 강조하고 싶습니다.

마무리

이런 것 까지 신경쓰기에는 좀더 느리고 신경쓰일테지만 나중에는 더 쉽고 더 빠른 결과를 표현할 수 있습니다.

아름다운 코드가 시간을 단축시킵니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

다니고 있는 학교의 개발도구 현황을 보면 대부분 비주얼스튜디오(이하 VS) 6.0을 사용하고 자바관련 수업은 최신버젼의 이클립스를 사용하는 것을 보게됩니다.

왜 VS6.0만 고집하면서 이클립스는 최신버젼을 사용할까요? 단지 무료이기 때문일까요?

단언컨대 이클립스는 자주 사용하지 않아서라고 할 수 있습니다. 학교의 커리큘럼에 1학년과 2학년의 수업은 대부분 C와 C++ 관련되어 있어서 이클립스를 만져 볼 기회도 없거니와 수업은 VS6.0 위주로 가기 때문에 마치 VS6.0은 개발도구의 단계라고 여기고 있는 것 같습니다. 즉 이클립스는 안해왔기 때문에 최신버젼이라도 어색하지 않는 반면 VS는 늘 6.0만을 다루었기 때문에 VS 6.0 이상 도구는 어색 하게 느껴지며 더 불편하단 소리로 접근 조차 하지 않으려고 합니다.

본인은 학부때 숙제를 VS 2003, VS 2005 로 개발하여 제출 해왔고 프로젝트는 혼자 다른 플랫폼을 사용하여 주목을 받곤 하였습니다.


그럼 VS2008에서 C++을 어떻게 사용하는지 간단히 보여드리겠습니다.


먼저 VS2008을 설치합니다. 닷넷 3.5기반이고 멋진기능들이 가득해서 설치가 오래 걸릴 것입니다.

그럼 이 세 분이 기다리고 있을 것입니다.(설치 중에 대화도 해보세요.)

설치가 잘 마무리 되었다면

첫 실행을 하면 자기의 주류의 언어를 선택하고 그에 맞는 스타일을 자동으로 구성을 하게 됩니다.

프로젝트의 종류를 선택합니다.

늘 숙제는 Console(콘솔)형태로 하기 때문에 아래 그림처럼 선택을 합니다.

그림과 같이 Win32 콘솔 응용 프로그램을 선택하고 프로젝트 이름을 입력 후 확인 버튼을 누릅니다.

그럼 아래와 같이 마법사가 시작이 됩니다.

다음 장면에 주의 하실점은 바로 "미리컴파일된 헤더" 체크를 해제 해야 한다는 것입니다. 이 것은 컴파일시 매번 필요없는 컴파일을 미리 해준다는 것인데 큰 프로젝트가 아니므로 체크 해제를 반드시 하시기 바랍니다. 만약 체크 하시고 하신다면 미리 컴파일을 해두는 파일에 헤더를 설정하여야 합니다.(어렵진 않습니다.)

그냥 단순히 헤더를 미리 컴파일 할꺼냐 말꺼냐라는 옵션입니다.

나중에 프로젝트 옵션에서 재설정 할 수 있습니다.

 

자 그럼 프로젝트는 만들어지게 됩니다. 처음 솔루션창을 보시기 바랍니다.

조금 잡다한 파일들이 있는데 본 소스파일만 남겨두고 나머지 파일을 과감히 삭제 하시기 바랍니다.

이제는 소스 내용을 봐 볼까요?

 

진입점(main)도 이상하고 이상한 글자들이 괴롭히십니까? 그럼 그냥 다 지우세요.

그리고 즐겁게 코딩하시면 됩니다.


using namespace std; 구문은?

각종 함수가 각각의 패키지로 들어가 있어야 하는데 만약 패키지가 없다면 모든 함수는 일관성없이 한곳에 모여 있을 것입니다.

현재 코드는 cout함수가 있는 std의 패키지를 사용하겠다라는 구문입니다.

그리고 옆에 그림을 보시면 눈에 확들어오는 인텔리센스가 펼쳐지고 원하는 함수에 마우스를 올리면 그림과 같이 입력과 출력 타입을 알 수가 있습니다.

atof의 함수는 char * 타입을 변수로 받고 double 타입으로 출력을 하며 stdlib.h 헤더에 들어가 있다는 것을 알 수가 있네요.

이래도 힘들어 보입니까?

초보인 학생들은 좋은 툴이 정말 좋은 길을 제시할 것 입니다.

간혹 위 그림처럼 나오는 인텔리센스 덕에 "학생들이 너무 의존하게 되어 버릇이 없어진다." 라고 함구하는 분들이 간혹 계십니다.

저는 그 분들에게 이렇게 답변을 하고 싶습니다.

"학생들에 있어서 코드가 전부는 아닙니다."

생각하고 만들고 박수 받을 시기에 먼 훗날 코딩을 대비해야 할까요?

생각하세요. 펼쳐보이세요. 재미있는 것을 해보세요.

과정에 있어서 중요한 건 코딩도 언어도 아닙니다. 중요한 건 만들어질 작품의 기대입니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.

후배1 : 어떻게 공부해야지 프로그래밍언어를 쉽게 있을까요?

본인이 어느 후배에게나 듣는 상담내용입니다. 이 물음의 본인의 답변을 요약 하자면 다음과 같습니다.

  1. 책을 읽어라.
  2. 손으로 읽어라.
  3. 지속해라.

뻔한 답변에 뻔뻔하기까지 한 듯 하네요, 하지만 실제로 하나하나 살을 붙이며 이야기를 전달하고 각종 예를 들어가며 더욱 이해시키고 있습니다.

그럼 책을 어떻게 읽고 지속하는지를 말하기 전에 경험상 실패 사례를 말씀 드리겠습니다.

학생 김철저.

맘먹고 공부하려는 김철저학생은 열심히 공부하겠다는 독한 맘을 먹고 주먹을 불끈 쥔 학생입니다. 이 학생은 철저하고 확실하게 공부하기 위해 두껍고 어려운 책을 골랐습니다.

그 다음 그 두꺼운 책의 한 장을 넘기고 한 글자 한 글자 놓치지 않고 밑줄 그으며 공부를 했습니다. 하지만 처음부터 이해 못하는 것 투성이고 무슨 요상한 단어들로 가득하여 졸음만 올 뿐이었습니다. 그래도 독한 맘은 오래 가서 일주일이 지났습니다. 하지만 갈수록 어려운 단어에 도저히 이해가 되질 않고 이제 겨우 100페이지도 넘겼는데 전에 내용은 하나 생각이 안 나고 과연 할 수 있을까 하는 의심만 생기게 됩니다.

그리고 곧 여태껏 배운 내용은 까마득할 뿐 뭔 발전이 있겠냐며 핑계를 합리화 하고 포기를 하게 됩니다.

이와 같은 학생의 사례는 아주 많이 봐왔습니다. 그리고 도서관의 기초적인 자바나 C,C++ 책을 보면 100페이지 이내는 공부한 흔적으로 닳아 있으나 100페이지 넘어는 깨끗하다는 것을 볼 수 있습니다.

의심이 시작되면 흔들리기 마련이게 되고 포기의 시작이기도 합니다.

폭포수

저는 이 방법론을 단계별 완성을 목표로 하는 폭포수공부법이라고 하겠으며 나쁜 방법이라 말하진 않겠습니다. 이 같은 방법은 지루하지만 앞 단계가 확실히 하고 다음 단계를 학습 해야 하는 학습에 적용 할 수 있을 것입니다.

드럼을 예로 들자면 먼저 원스트록으로 1비트 2비트 3비트 4비트 8비트 9비트 16비트 24비트 32비트를 단계별로 다양한 템포에 연습을 하고 더블 스트록으로 넘어 가야 합니다. 바로 넘어갈 순 있겠지만 오히려 더 늦은 학습이 되거나 뭔가 부족한 게 여력 할 것 입니다.

그럼 프로그래밍언어는 어떻게 공부해야 할까요?

언어는 거대한 건물과 같습니다. 그 건물은 하늘에서 내려다 보거나 멀리서 보면 전체를 볼 수 있지만 볼 수 없다고 가정하고 무척 가까이에 있다고 생각을 해보십시오.

자 그럼 이 건물을 이해하려면 구석구석 살펴봐야 합니다. 위에 글에 김철저학생의 방법은 처음 보이는 벽부터 열심히 조사했다고 할 수 있습니다. 이 벽이 어디 벽이고 어떤 용도의 벽인지 열심히 살펴보고 있다는 것이죠.

쉽게 그리고 반복

우리는 벽이 있구나 하고 지나 다른 곳을 살펴봐야 합니다. 한번 손으로 만져보기도 하고 또 그 다음 벽을 보고 계속 보다 다 보았으면 다시 처음 그 벽을 조사합니다.
그때 처음 이해되지 않았던 벽은 (예를 들어)화장실을 가리는 벽이라는 것을 깨달을 것입니다.
또 반복을 합니다. 그럼 더 깊이 어느 벽하고 연결이 되어 있고 어떤 벽하고 재질을 비교 할 수 있게 됩니다. 이 후 계속 반복을 한다면 벽의 구조가 학습이 되어 어느 정도의 건물을 이해하게 됩니다.


저는 이 방법을 민첩하게 반복하고 회귀하는 애자일공부법이라고 말하겠습니다.반복 주기

본인의 방법은 애자일공부법으로 한 권의 책을 3번 읽은 적도 하나의 챕터를 몇 번씩이나 읽은 적이 많습니다. 그리고 하나의 책보다 많은 책을 보려고 노력 하였고 그 와중에 좋은 책들은 정독을 하였습니다.

저는 되도록 많이 그리고 빨리 그 와중에 자세히라고 말하고 싶습니다.

저의 프로그래밍언어 공부 법을 정리 하자면

  1. 책을 읽어라.
  2. 이해가 되지 않는 챕터는 그냥 읽고 예제를 타이핑해본다.
  3. 그리고 이해되지 못한 챕터를 다시 읽어본다.
  4. 그래도 이해가 안 된다면 그 챕터를 무시하고 다음 챕터를 읽는다.
  5. 책을 다 읽었다면 이해가 되지 못했던 챕터를 다시 읽어본다.
  6. 그래도 이해가 안 된다면 완전 무시해라.
  7. 다른 책을 찾는다.
  8. 다시 1번으로..
  9. (다른 책을 읽어보고 다시 이해가 안되어 완전 무시된 챕터를 다시 읽어본다.)

임하는 자세를 정리하자면

  1. 절대 의심하지 말고 꾸준히 읽어라.
  2. 긍정적으로 생각해라.
  3. 주의에 학습에 대한 핍박이 있더라도 절대 흔들리지 말아라.

학습에 있어서 반복은 아주 큰 도움이 될 것이며 책의 '머리말'이나 '들어가며'라는 부분을 꼭 읽어보시길 바랍니다. 그 곳에 학습하는 방법이 녹아져 있으며 완독에 있어서 중요한 부분이라고 생각을 합니다.

많은 학생들 중 어떤 학생은 책은 소용없고 그냥 프로그램 하나 짜거나 분석하는 게 좋다라는 학생도 있고 강의를 듣는 게 좋다고 하는 학생이 있습니다.

저는 딱 한 권이라도 완독하라고 강조를 합니다.
그리고 책의 첫 장에서의 자신과 끝장에서의 자신은 엄청난 차이가 분명 있다고 덧붙입니다.

꾸준히 반복해라


읽으세요, 그것만큼 빠르고 쉬운 학습은 없습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
1 2 

글 보관함

get rsstistory!