'허니몬'에 해당되는 글 349건

허니몬의 IT 이야기

좋은 코딩 나쁜 코딩
카테고리 컴퓨터/IT
지은이 박진수 (한빛미디어, 2004년)
상세보기


코딩 스타일이란 무엇인가


작성자 : 김지헌


단위프로그램 작성 과정

1. 문제를 인식한다.

2. 해법을 찾는다.

3. 해법을 플로 차트나 의사 코드로 표현한다.

4. 프로그래밍 언어로 원시 코드를 작성한다.

5. 작성한 원시 코드를 컴파일하여 목적 코드로 바꾼다.

6. 단위 프로그램을 테스트하고 오류를 수정한다.


coding_style.JPG

코딩은 프로그래밍과 거의 동일하게 사용된다. 하지만, 엄밀한 의미에서 보면 프로그래밍은 프로그램의 논리를 개발하는 일이고, 코딩은 프로그램의 논리에 따라 특정 프로그램 언어로 표현하는 일이라고 할 수 있다.


그리고 코딩하는 단계에서 다음과 같은 작업에 대한 프로그래머마다의 고유한 방식을 코딩 스타일(Coding Style)이라고 한다. 코딩 스타일과 유사한 개념으로 ‘코딩 컨벤션(coding convention)’이라는 것이 있다. 번역하면 ‘코딩 습관’이라는 말이다. 코딩 스타일과 코딩 컨벤션은 거의 동일한 의미다.

 

1. 논리를 표현하는 방식

2. 알고리즘을 표현하는 방식

3. 문장(statement)를 배치하는 방식

4. 표현식(expression)을 표현하는 방식


플로 차트(flow chart)

플로 차트는 프로그램의 흐름을 한눈에 파악하기 좋은 도구다. 하지만, 프로그램을 코딩하는 시간보다 플로차트를 그리는 시간이 더 걸리기 일쑤다. 능숙한 프로그래머들은 플로 차트 없이도 프로그램의 흐름을 쉽게 간파한다. 그리고 최신 개발 도구들은 플로 차트보다 더 생산성이 높은 분석 도구들을 제공한다.

의사코드(pseudo code)

특정 프로그래밍 언어를 동원하지 않고, 우리가 일상적으로 쓰는 언어를 동원하여 프로그램의 논리를 표현한 것이다. 어떤 면에서 프로그램보다 더 프로그램을 잘 설명한다.

한마디로 표현하면, ‘원시 코드를 작성하는 방식 = 코딩 스타일’ 이라고 할 수 있다. ^^


오류 종류

오류 설명

논리 오류

논리적인 결합이 잠재되어 있다가 특정 상황에서 엉뚱한 방향으로 프로그램이 흐른다.

연산 오류

특히 실수형 연산에서 발생한 오차가 누적되어 계산상의 거대한 오차를 불러온다. ‘나비 효과’가 발생한다.

호출 오류

라이브러리로 제공되는 함수들이 함수 제작자도 알지 못하던 오류가 숨어 있어서 그것을 호출한 프로그램이

잘못 작동한다.

결합 오류

함수의 호출, 클래스의 상속, 컴포넌트간의 결합에 있어서 인수, 복귀 자료의 자료형이나 값이 잘못 교환된다.

환경 오류

프로그램을 제작할 당시에 가정하였던 실행 환경이 바뀌면 예상하지 못한 결과를 가져온다.

입력 오류

프로그래머가 예상하지 못한 엉뚱한 값이 입력된다.

결국 계산상의 오류를 가져온다.

작동 오류

프로그램이 정해진 순서에 따라 작동하지 않는다.

발전소와 같은 대규모 공정 제어 중에 큰 문제를 일으킨다.



코딩 스타일의 목표

1. 개발 기간을 지연시키는 것을 예방한다.

2. 유지보수를 쉽게 한다.

3. 오류 없는 정확한 프로그램을 만든다.


코딩 스타일은 프로그래밍에 있어서 수학이나 영어보다 중요하다.

프로그래머들조차 프로그래머에 대한 잘못된 편견을 가지고 있다. 그 중에서 가장 흔한 것으로는, 프로그래머가 되려면 수학을 잘해야 한다는 편견이다. 물론 수학과 영어를 잘 하면 프로그램을 작성하는 데 도움이 된다. 수학을 잘하면 프로그램의 알고리즘을 잘 세울 수 있을지는 모르지만, 모든 프로그램에 고난이도의 알고리즘이 필요한 것은 아니므로 수학을 잘 한다는 것이 곧 좋은 프로그램을 작성하는 것을 보장하는 것은 아니다. 오히려 대부분의 프로그램 논리는 단순하며, 이미 잘 알려진 알고리즘을 함수의 형태로 제공받아 사용한다.
프로그래머들은 영어로 대화하는 것이 아니라 프로그램으로 대화한다. 영문법에 맞는 매끄러운 영어를 구사하는 사람들이 인정받듯이, 코딩 스타일 규칙에 따라 프로그램을 작성하는 사람이 인정받을 수 있다. 그런 사람은 다른 프로그래머와의 협업에서도 환영받을 것이다.

 

● 띄어 쓸 때 좋은 코딩 습관

 

한 줄에 한 문장만 써라.

  1. System.out.println("첫 번째 수는 1입니다."); System.out.println("두 번째 수는 2입니다."); System.out.println("세 번째 수는 3입니다.");

여기서 줄(line)이란 편집기(editor) 상에서 보이는 한 줄을 의미한다. Java의 문장이 한 줄은 아니다. 한 줄에 여러 문장을 넣을 수도 있고, 한 문장을 여러 줄에 걸쳐서 할 수도 있다. 그러므로 줄과 문장을 혼동해서는 안 된다.

  1. System.out.println("첫 번째 수는 1입니다.");

  2. System.out.println("두 번째 수는 2입니다.");

  3. System.out.println("세 번째 수는 3입니다.");

위의 예제를 한 줄에 한 문장씩으로 수정하였다. 어느 쪽이 보기 좋은가?

 

선언문과 실행문을 구분하라.

  1. public static void main(String args[]) {
  2. int num1 = 10;

  3. int num2 = 20;

  4. int sum = num1 + num2;

  5. System.out.println( "첫 번째 수는 " + num1 + " 입니다." );

  6. System.out.println( "두 번째 수는 " + num2 + "입니다." );

  7. System.out.println( " 두 수의 합은 " + sum + "입니다.");

  8. }
  1. public static void main(String args[]) {
  2. int num1 = 10;

  3. int num2 = 20;

  4. int sum = num1 + num2; // 위는 선언부

  5.  

  6. System.out.println( "첫 번째 수는 " + num1 + " 입니다." );

  7. System.out.println( "두 번째 수는 " + num2 + "입니다." );

  8. System.out.println( " 두 수의 합은 " + sum + "입니다.");

  9. } // 아래는 실행부


단락을 구분하라.

  1. public static void main(String args[]) {
  2. int num1 = a + b;

  3. System.out.println( "첫 번째 수는 " + num1 + " 입니다." );

  4.  

  5. int num2 = c + b;

  6. System.out.println( "두 번째 수는 " + num2 + "입니다." );

  7.  

  8. int sum = num1 + num2;

  9. System.out.println( " 두 수의 합은 " + sum + "입니다.");

  10. }

일반 문장에서는 생각의 덩어리 하나를 표현한 여러 문장을

모아서 단락이라고 한다. 그리고 일반 문장에서는 하나의

단락을 다른 단락과 구분하기 위하여 들여쓰지만, 프로그램

코드에서는 들여쓰기 대신 빈 줄로 단락을 구분한다.


제어문들 사이를 구분하라.

제어문은 프로그램의 흐름을 바꾸는 역할을 한다. 가정에 따른 선택(while), 상황에 따른 선택(If ~ Else ~ ), 상황에 따른 반복(for)이 이 제어문에 의해서 이루어진다.

  1. public static void main(String args[]) {
  2. if ( num1 == num2) {

  3. System.out.println( "num1 과 num2는 같다“ );

  4. } else if ( num1 < num2 ) {

  5. System.out.println( "num1이 num2보다 작다“);

  6. }else {

  7. Systrem.out.println( "num1 과 num2는 다르다“);

  8. }

  9. }
  1. public static void main(String args[]) {
  2. if ( num1 == num2) {

  3. System.out.println( "num1 과 num2는 같다“ );

  4.  

  5. } else if ( num1 < num2 ) {

  6. System.out.println( "num1이 num2보다 작다“);

  7.  

  8. }else {

  9. Systrem.out.println( "num1 과 num2는 다르다“);

  10. }

  11. }


  1. switch ( selection) {
  2. case 1 :

  3. System.out.println("1을 선택하였습니다.“);

  4. break;

  5. case 2 :

  6. System.out.println("2를 선택하였습니다.“);

  7. break;

  8. default :

  9. Systrem.out.println("3을 선택하였습니다.“);

  10. }
  1. switch ( selection) {
  2. case 1 :

  3. System.out.println("1을 선택하였습니다.“);

  4. break;

  5.  

  6. case 2 :

  7. System.out.println("2를 선택하였습니다.“);

  8. break;

  9.  

  10. default :

  11. Systrem.out.println("3을 선택하였습니다.“);

  12. }


함수들 사이를 구분하여라.

함수들 사이를 띄우지 않은 경우의 단점

[1]. 함수가 어디서 시작되어 어디서 끝나는지 파악하기 어렵다.

[2]. 프로그램이 몇 개의 함수로 구성되어 있는지 파악하기 어렵다.

[3]. 특정 함수가 어디쯤 위치하고 있는지 파악하기 어렵다.

연산자의 앞뒤로 빈칸을 두라.

  1. 1. document.write("<td>"+j+"*"+i+"="+(j*i)+"</td>");

  2. // 위와 아래의 내용은 같다.

  3. 2. document.write( "<td>" + j + " * " + i + " = " + ( j * i ) + "</td>" );

  4. // 어느 쪽 코드가 읽기가 편한가?


for();

보다는

for ();

x=1;

대신에

x = 1;


단항 연산자(++, --)를 피연산자와 띄어 쓰지 마라.

  1. int p = 9;

  2. ++ p; // p는 몇일까?

f = a + ++ b - c - -- d + e; // 이 코드는 이해가 어렵다.

-> f = a + ++b - c - --d + e; // 조금 이해가 쉽다.

--> f = a + ( ++b ) - c - ( --d ) + e; // 괄호를 해주면 이해가 더 쉽다.

 

● 들여 쓸 때 좋은 코딩 습관

중괄호의 위치( {, } )

  1. public static void main ( String args[] ) {

  2. System.out.println("Hello world!!");

  3. }


보는 것처럼 중괄호는 메서드의 끝에서 열고, 닫는 괄호는 메서드의 시작 위치와 같은 선상에 위치하도록 한다.

 

중괄호의 위치를 통일시켜라.

프로그램마다 취향이 다르겠지만, 일반적으로 두 자에서 네 자를 들여 쓰는 것이 좋다.


내부 블록은 들여 써라.

블록이란 중괄호( {, } )로 둘러싸인 문장을 말한다. 일반적으로 여러 개의 문장을 다른 문장과 구분할 필요가 있을 때 블록을 만든다.


  1. public static void main ( String args[] ) {
  2. int var = 2;
  3. System.out.println("지역변수 변수 var 의 블록 밖에서의 값은 " + var );
  4. { int var = 3;
  5. System.out.println ("지역 변수 var의 블록 안에서의 값은 “ + var );
  6. }

  7. System.out.println(" 지역변수 var의 블록 밖에서의 값은 “ + var );
  8. }
  1. public static void main ( String args[] ) {
  2. int var = 2;
  3. System.out.println("지역변수 변수 var 의 블록 밖에서의 값은 " + var );
  4.  
  5. { int var = 3;
  6. System.out.println ("지역 변수 var의 블록 안에서의 값은 “ + var );
  7. }
  8. System.out.println(" 지역변수 var의 블록 밖에서의 값은 “ + var );
  9. }


피제어부는 들여써라.


  1. if ( num1 == num2 ) {

  2. Systrem.out.println("num1 과 num2는 같다“);

  3. }

  1. if ( num1 == num2 ) {

  2. Systrem.out.println("num1 과 num2는 같다“);

  3. }


= 피제어부를 들여 쓰지 않고 제어부를 완결된 문장으로 바꾼 코드(오류 발생

if ( num1 == num2 );

Systrem.out.println( "num1과 num2가 같다.“ );

들여쓰기를 점검해야 하는 시점

[1]. 프로그램을 완결하기 전
[2]. 프로그램을 다른 사람에게 배포하기 전

[3]. 파일 변환을 마친 후

 

쓸데없는 들여쓰기를 하지 마라.


  1. int Add ( int a, int b) {
  2. int result = a +b ;
  3. return result;
  4. }
  1. int Add ( int a, int b) {
  2. int result = a +b ;
  3. return result;
  4. }


중요한 것은 들여쓰기를 하는 정도를 일정하게 하는 것이다. 들여쓰기가 꼭 필요하지만 매번 들여쓸 때마다 두 칸이면 두 칸, 네 칸이면 네 칸으로 들여 쓸 공간을 동일하게 적용시켜야 혼란스럽지 않다.

 

● 식별자 이름을 지을 때 좋은 코딩 습관

 

변수 이름을 체계적으로 지어라.

너무 많은 변수는 우리를 혼란스럽게 만든다. 심지어 프로그램 작성자마저도 어지럽게 한다.

변수 이름을 짓는 방법을 통일하여 그나마 많은 변수들의 바다에 빠져 헤매지 않도록 변수의 물길을 일정하게 해두는 것이 좋다. 변수 이름을 체계적으로 정리하면 혼돈을 피할 수 있다.

클래스의 역할을 접두사로 활용하라.


  1. class getMoney {

  2. 인사잘하기;

  3. 연락 잘하기;

  4. 웃기;

  5. 알바;

  6. }

돈을 얻기라는 클래스라고 하면 돈을 뜻하는 Money와 얻기를 뜻하는 get을 합쳐서

getMoney 라는 클래스 명을 택함.

  1. document.getElementByID();

ID를 통해서 Element를 get한다.

  1. document.getElementsByName();


이름을 의미 있게 지어라.

변수 이름을 보면 누구나 그 변수에 들어가는 자료가 무엇인지 알 수 있게 하라.

int iThisYear; 이라고 하면, ThisYear가 정수값임을 알 수 있을 것이다.

 

비슷한 변수 이름을 사용하지 마라.

  1. int number;

  2. long int numbers;

  3. int number;

  4. short int num;

만약 어쩔 수 없이 비슷한 이름을 사용해야 한다면, 이름의 앞이나 뒤에 접두사 또는 접미사를 붙여서 이름을 짓도록 하자. 예를 들어, 다음과 같이 변수 이름 뒤에 숫자를 붙여서 구분하는 것은 흔한 방법이다.

  1. int number_01;

  2. int number_02;

 

의미를 잃지 않는 범위에서 짧게 지어라.

이름을 의미 있게 만들기 위해서 무작정 긴 이름으로 지으면 안된다. 예를 들면, 단지 두 개의 정수만이 필요한 프로그램에서 두 정수를 담을 변수의 이름을 다음과 같이 장황하게 지어서 선언할 필요가 없다.


  1. int first_integer_number;

  2. int ssecond_integer_number;

  3. -> int num1;

  4. int num2;

함수나 클래스의 이름도 마찬가지.

  1. New_plus_operation_function();

  2. New_minus_operation_function();

  3. -> NewPlusFunc();

  4. NewMinusFunc();

줄여서 쓸 만한 단어는 다른 사람이 이해할 수 있는 범위 안에서 무조건 줄여서 쓴다는 원칙만 잘 기억하면 된다.

 

이름이 길면 밑줄 또는 대소문자로 구분하라.

  1. Break_Control_System_Panel();

  2. BreakControlSystemPaner();

예전에는 첫 번째 방법이 많이 쓰였지만, 근래에는 두 번째 방법을 더 많이 사용한다.

 

변수 이름을 밑줄로 시작하지 마라(시작할 수 있다고 해서 사용하지 마라). 중요.


밑줄을 과도하게 사용하지 마라. 가급적이면 한번 이상 사용하지 마라.

  1. [1]. char File__name___new__name;

  2. [2]. char File___name__new__name; // 차이를 알겠는가?

대소문자를 적절히 배합해서 만들어라. 클래스에서는 첫글자는 항상 대문자로 시작하라.

  1. Breakcontrolsystempanel();

  2. BreakControlSystemPanel(); // 어느 것이 구분이 가능한가?


대소문자를 구분하여 이름을 짓는 프로그래머의 습관

1. 변수나 객체의 이름은 소문자로 시작한다.

2. 함수, 클래스, 구조형, 공용형 등의 이름은 대문자로 시작한다(메소드 포함).

3. 기호 상수나 매크로 함수는 모든 글자를 대문자로만 짓는다.


Java 가 대소문자를 구분한다는 것을 악용하지 마라.

  1. int num; // 첫 번째 입력 변수

  2. int Num; // 두 번째 입력 변수

  3. int NUM; // 세 번째 입력 변수

 

연산자의 우선 순위에 의존하는 식을 만들지 마라.

  1. a = 2 + 3 * 4; // 의 값은 얼마인가?

  2. a = ( 2 +3 ) * 4 // 의 값은 얼마인가?

 

시프트 연산 대신 산술 연산을 사용하라.

시프트 연산(shift operation, 자리 옮김 연산)에 쓰이는 << 나 >>는 빠른 배수 계산에 TM이기도 하고 비트를 오른쪽으로 한 개씩 옮기거나 왼쪽으로 자리를 옮기는 경우 크기가 1/2로 줄거나 2배로 증가되기 때문이다.

시프트 연산의 문제점 :

1. 조작하는 수치가 음수인 경우에 왼쪽 자리옮김을 하면 음수 부호가 탈락할 가능성이 있다.

2. 프로그램을 이해하기 어렵다.

극단적인 효율이 필요하지 않다면 항상 프로그램을 알기 쉽고, 이해하기 쉽게 작성해야 한다. 따라서 시프트 연산으로 수치를 조작하려는 생각은 버리자.

 

극단적으로 효율성을 추구하지 마라.

  1. num4 = ( num1 + num2 ) * num3;

다음 두 문장으로 기술된 것보다 처리 속도도 빠르고, 기억 장소도 덜 차지한다.

  1. temp = num1 + num2;

  2. num 4 = temp * num3;

극단적인 효율을 추구하는 사람은 어떻게든 처리 속도를 빠르게 하기 위해서 매우 복잡한 식을 즐겨 쓰곤 한다. 이렇게 코드를 작성하면 효율성을 얻을 수 있을지도 모르지만, 유지보수 비용이 만만치 않을 것이다. 효율성이 중요하기는 하지만, 간단하고 명료한 코드를 희생할 만큼 중요한 것은 아니다.

우리가 중점적으로 생각할 것은, 간단하고 명료해서 읽으면 이해할 수 있는 코드이다.

 

while 문에서 관계/대입 연산자의 우선순위를 혼동하지 마라.

프로그래머가 생각하는 우선순위를 맞출 수 있도록 괄호를 사용해야 한다. 하지만 프로그래머가 늘 연산자의 우선순위를 기억하고 그것을 고려하여 괄호를 넣을 수는 없다. 그렇기 때문에 while, for, if와 같은 조건식 안에서 조건 연산 외에 대입 연산 등의 다른 연산을 하지 않는 것이 좋다.

 

조건식에 대입문을 사용하지 마라.

조건식(If, for, while)은 제어문에서 아주 중요한 역할을 한다. 조건식의 결과값에 따라서 참과 거짓이 판별되기 때문이다. 프로그래머들은 조건식에 의도적으로나 또는 실수로 대입문을 사용하는 경우가 있다.

가장 흔한 실수로는 조건 식에서 등호( A == B : A와 B가 같다) 대신에 실수로 대입 연산자( A = B : B를 A에 대입한다)를 쓰는 경우다.

  1. if ( value == 0) {

  2. System.out.println("값이 0입니다.");

  3. }

실수로 다음과 같이 등호 대신 대입 연산자를 썼다면 어떻게 될까.

  1. if ( value = 0 ) { // 이 경우 value 의 데이터는 0으로 변경된다.

  2. System.out.println("값이 0입니다.");

  3. }

-> 조건식에 대입문을 의도적으로 사용한 코드

  1. while ( ( value = new_value++ / 20 ) < 10 ) {

  2. System.out.println( "value의 값은 " + value + "입니다." );

  3. }


위의 예제와 같이 조건식에 대입문을 쓸 경우에는 프로그램을 이해하기가 힘들어진다. 이런 경우에는 알기 쉬운 코드로 만들어 줘야 한다.

  1. while ( ture ) {

  2. value = new_value / 20;

  3. new_value++;

  4. if ( value >= 0 ) {

  5. break;

  6. }

  7. System.out.println"value의 값은 " + value + "입니다." );

 

부작용이 나타나지 않도록 주의하라.

  1. number = 10;

  2. result = ++number;

결과값은 얼마일까? 정답은 11이다. 그러나 정답을 10이라고 말하지 않으려면 단항 연산자의 전치(prefix)와 후치(postfix)에 대해서 이해하고 있어야 한다.


전치란 ++number처럼 단항 연산자를 피연산자 앞에 두는 방식이고, 후치란 nuber++처럼 단항 연산자를 피연산자 뒤에 두는 방식이다. 전치의 경우에는 ++의 연산이 = 연산보다 우선순위를 가져 먼저 계산되고, 후치의 경우에는 = 연산이 더 빠르게 계산되고 그후 ++이 연산된다.


  1. number = 10;

  2. result = number++; // 결과값은 얼마일까? 10이다.

  3. -> 개선

  4. number = 10;

  5. number++;

  6. result = number;

단 한줄의 문장이 늘어났을 뿐인데 앞의 코드와 같이 전치와 후치에 대해서 알아야 하거나 고민할 필요가 없다. 이런 간단한 연산에서 우리는 전치와 후치라는 부작용을 볼 수 있다. 즉, 이 연산에서 'number에 1을 더한다‘는 것은 주된 효과지만, ’++ 연산이 먼저냐, 아니면 = 연산이 먼저냐‘를 결정하는 것은 부작용인 것이다. 단항 연산자의 부작용은 식이 복잡해질수록 더 극명하게 나타난다.

부작용이 꼭 단항 연산자에만 국한되는 것은 아니다. 대입문을 포함한 거의 모든 연산식에서도 우리는 부작용을 가져올 수 있는 문장을 흔히 볼 수 있다.

  1. average = total / ( count = last_number - first_number );

이처럼 연산식 가운데에 대입문을 두게 되면, 이 대입문이 언제 어떻게 어떤 방식으로 작동하는지에 대해서 고려해야만 문장을 해독할 수 있다. 그러므로 이 문장은 간단한 형태로 바뀌어야 한다.

  1. count = last_number - first_number;

  2. average = total / count

부작용을 피하려면 프로그램을 쉽고 짧게 작성해야 한다.

 

함수의 원형에도 인수의 자료형을 표기하라.


  1. int Team(); // 인수의 자료형이 없다.
  2. void Score(); // 인수의 자료형이 모호하다.
  3. int Board(); // 모호성은 혼동을 가져온다.
  1. int Team( void );
  2. void Score( int a, char b );
  3. int Board( int[4][3], double d );


정밀한 계산이 필요하다면 부동 소수점 연산을 피하라.

부동 소수점은 특성상 정확한 연산을 할 수 없다. 다시 말하면, 늘 오차를 포함하고 있는 것이다. 예를 들어 보자. 1/3을 소수로 표현하면 0.33333333... 처럼 무한소수가 된다. 그러나 컴퓨터는 무한 소수를 표현할 수 없다.

부동 소수점 연산은 늘 오차를 포함하기 때문에,정밀한 계산을 필요로 하는 상황이라면 부동 소수점 보다는 정수를 사용해 연산을 하는 것이 좋다. 특히 금융 관련 계산을 하는 상황이라면 더욱 그렇다.

 

정밀한 계산에는 float 형보다 double 형을 사용하라.

double은 float 형에 비해 두 배 더 큰 자료형이다. 그 만큼 정밀도가 높다. 그렇기 때문에 소수 이하 자릿수를 더 늘려서 계산할 수 있는 것이다. 정밀도를 고려해서 double 형을 사용하라.

 

계산 단위를 반드시 명시하라.


  1. int num;

  2. int sum;

  3. int total;

  1. int num; // 당일 총 결산수지 : 원 단위로 계산

  2. int sum; // 한달간 총 결산수지 : 천원 단위

  3. int total; // 일년간 총 결산수지 : 백만원 단위


나눗셈 연산에는 주의를 기울여라.

  1. int num;

  2. num = 15 / 10; // num의 값은 얼마일까?

답은 1이다. 왜냐하면 15을 10으로 나누면 1.5가 되는데, 이 계산식에서 15 / 10은 정수형 자료 간의 연산이다. 이런 정수형 자료 사이의 연산에서는 소수인 0.5가 제거되고 1만이 최종 결과가 된다. 이처럼, Java 언어에서는 정수형 데이터의 나눗셈에서 가차없이 소수 이하 부분을 잘라버린다.

  1. float result;

  2. result = 1 / 3; // 의 결과값은 얼마일까?

0.33333...일 것이라 예측하겠지만, 결과는 0.0 이 나온다. 여기에 나눗셈의 함정이 숨어 있다.

result = 1 / 3; 이라는 문장에서 1/3이 먼저 정수형으로 계산되고 나서 result에 대입된다.

 

자료형의 변환이 이루어지지 않도록 하라.

강제변환 (int)(3.14f)와 같은 것도 사용을 자제하라.

 

goto 문을 사용하지 마라.

 

짜파게티 소스를 만들고 싶지 않다면, goto 문을 쓰지 마라. 나중에 후회한다.

 

조건식(조건 연산자) 보다는 if문을 사용하라.

 

  1. if ( num1 == num2 ) {

  2. temp = num 3 + f( num1 );

  3.  

  4. } else {

  5. temp = f(num1) - num3;

  6. }

이 문장을 한줄짜리 조건식으로도 바꿀 수 있음.

  1. temp = ( num1 == num2 ) ? d + f ( num1 ) : f( num1 ) - d;


조건식은 삼항 연산자를 사용하여 표현한다. 삼항 연산자란 ‘? True : False '를 말하는데, 이 연산의 대상이 되는 피연산자가 세 개라서 삼항 연산자라 불린다. 조건 연산자라고 부르기도 한다.


어느 편이 읽기 쉽고 이해하기 쉬운가? 그리고 어느 편이 더 효율적인가? 일단 효율적인 면에서 보면 한 줄 짜리 조건식이 조금 더 효율적이다. 그러나 컴퓨터 성능이 좋아진 지금에서는 큰 차이가 없다. 읽기 쉬움, 즉 가독성의 측면에서 보면 if 문이 좋다. 훈련된 프로그래머들은 조건식이 더 해석하기 쉽다고 말할지도 모르지만, 그건 소수의 훈련된 프로그래머의 얘기일 따름이다.

 

배열의 차원을 3차원으로 한정하라.

  1. multi_dimention[10][20][30][40]....[10];

배열은 얼마든지 선언해서 사용할 수 있다. 그러나 이런 배열은 무용지물이다. 우리의 사고력의 한계가 있기 때문이다.


● 오류없는 프로그램을 만들기 위한 좋은 코딩 습관

배열의 index는 0부터 시작한다는 것을 잊지마라!! 잊으면 곤란해!!


치환 문자열은 반드시 괄호를 씌워라.


괄호를 열었다면 반드시 닫아라.

이런 경우를 방지하기 위하여, 괄호를 생성시 {} () 열린 괄호와 닫힌 괄호를 바로 입력하고 그 사이에서 확장해 나가는 방식을 사용하도록 하라.

이 글은 스프링노트에서 작성되었습니다.

허니몬에 관한 보고서/허니몬의 드림성공노트
오늘은 잘 쓰던 서비스에 편의성에 대한 이야기를 해보겠다. ㅡㅅ-);;

어제까지 잘 들었던 musicON(신곡들이나 예전 노래들을 다운받으러 찾아다니기 귀찮아서 스트림 서비스로만 듣고 있는)에서 갑자기 장기간 비밀 번호 변경을 하지 않았다는 메시지가 뜬다. 사실 나는 비밀번호를 잘 바꾸지 않는다. 보안업체에서 말하는 것처럼 비밀번호를 자주 바꾸어야될 필요성을 느끼지 못하는 것도 있고, 개인적으로 자주 바꾸는 것을 잘 기억하지 못하는 탓도 있지만, 처음에 만들때 잘 조합된 비밀번호를 사용한다면 굳이 자주 바꿀 필요도 없다는 내 나름의 논리가 있기 때문이다.

사용자 삽입 이미지
  어쨌든, 이 서비스를 이용하기 위해서는 비밀번호를 변경해야 한다. 오랫동안 비밀번호를 바꾸지 않았다는 안내를 하면서 비밀번호를 바꾸라고 한다. 변경하러 가기를 누른다.
사용자 삽입 이미지
아래창이 뜬다.
사용자 삽입 이미지
홈페이지로 이동한다.
사용자 삽입 이미지
ID와 비밀번호를 누른다. ㅡㅅ-)
사용자 삽입 이미지
화면만 다시 바뀌고 아무런 변화도 없다. 암호변경 페이지로 이동하는 것도 아니고, 내가 입력한 아이디/비밀번호에 대한 처리여부도 나타나지 않는다. ㅡㅅ-); 나보고 알아서 하라는 거지? 그래서 아이디/비밀번호 찾기를 클릭했다.
사용자 삽입 이미지
아이디 찾기, 비밀번호 찾기 모두 같은 메시지가 뜨길래 다시 한번 확인해봤다.
사용자 삽입 이미지
ID 찾기 했더니 정상적인 접근이 아니란다. ㅡㅅ-); 오우, 살짝 화나?
사용자 삽입 이미지

그래서 비밀번호 찾기를 시도해봤다. 이렇게 하면 비밀번호라도 바꿀 수 있겠지.... 기대하면서

사용자 삽입 이미지

그랬더니 정상적인 접근이 아니란다. ㅡㅅ-);;

사용자 삽입 이미지

그리고는 하단에 이런 메시지를 보여준다. 일반회원 또는 LG 텔레콤을 해지한 이력이 있는 회원은...
전 해지한 적도 없습니다. ㅡㅅ-);; 제가 원하는 것에 대한 결과는 보여주지 않는군요.
사용자 삽입 이미지

결론은 이렇다.
ㅡㅅ-)> 홈페이지를 심플~하게 만든것은 좋은데, 정작 필요한 기능이 정상적으로 작동하지 않는다는 거.
그게 나에게는 가장 불만이다. 국내에서 좀 힘좀 쓴다는 대기업에서 만든 홈페이지가 저런 완성도를 보이는데 혀를 내두를 수밖에 없다. ㅡㅅ-)> 뭐 웹사이트 자체가 오픈을 해놓고 필요에 따라서 바꿀 수 있다는 부분을 나도 개발자로서 이해는 한다. 하지만, 중요한 기능(아이디 찾기, 비밀번호 찾기는 중요하다고 생각한다)들에 대해서 제대로 작동하는지 여부의 테스트도 거치지 않았다는 것은 슬프기도 하다.

내가 며칠간 더 뮤직온을 사용하지 않고 있었다면, 해결된 것을 접할 수 있을지는 모르겠지만, 운이 나쁘게도 오늘 접속해서 이런 불편함을 경험을 했다. 내 블로그에서 ㅡㅅ-);; 이런 불편함에 대해서 쓸 수 있다는 즐거움에 이렇게 투덜거리면서 글을 써본다. 월 3000원정도의 사용료를 내는 서비스지만, 월 6만원 정도의 비용을 지불하는 사용자로서, 내가 왜 이런 불편을 강요당해야하는지에 대한 적절한 설명이 있었으면 좋겠다.

그렇지 않으면, 나에 LGT에 대한 불만은 점점 커져갈 거고, 나의 저렴한 주둥이는 LGT가 좋지 않다고 나불거리면서 돌아다닐 것이 분명하다.

최근들어 사용자의 편의성과 경험에 대한 UI와 UX에 대한 이야기가 한창 피어오르고 있다. 나 역시 이 부분에 대해서 관심을 가지고 공부를 시작하고 있는 상황에서 이렇게 국내 굴지의 통신사라할 수 있는 LGT에서 통합 홈페이지 구축과 동시에 나를 귀찮게 하는 불편사항을 발생시키니 고운 눈길을 가질 수가 없게 되었다. 이것이 우리나라의 현실일까? 변경예정일에 맞추어 부랴부랴 변경을 하다보니 소소한 서비스(하지만 기본적이고 중요한)들에 대한 기능들을 제대로 구현하지 못한 것이다.

ㅡㅅ-); 이로써 LGT에 대한 불만을 가진 1人 탄생이다.
허니몬의 사진기록
오늘 작열하는 태양은 뜨겁기 그지 없더군요. ^^ 개인적으로 좋아하는 구도의 사진입니다. 나뭇잎 사이로 살짝 뻗쳐나오는 햇살의 모습은 은근히 저의 가슴을 벅차오르게 만듭니다.

카메라에 내장되어 있는 방법을 이용하여 색감을 바꿔보았습니다. ^^; 별다른 건 없습니...다? ㅎㅎ.


무더운 여름날, 커피를 탄 후에 시원하게 마시기 위해 듬뿍 얼음을 넣은 모습입니다. OTL... 아이스커피 믹스는 비싸효!! ㅡㅅ-)> 냉장고에 충분한 양의 얼음이 있다면 충분히 시원한 아이스커피를 마실수 있습니다. 다만, 약간의 첨가물(꿀)을 넣어주시면 단맛이 좋습니다. 개인적으로 단맛을 좋아하거든요. 매일... 두잔 이상 마셔주고 있습니다. ㅡㅅ-)b


학원에서 선물받은 독스가 저를 빼꼼히 바라보고 있습니다. ㅡㅅ-)> 눈빛이 절 닮았다는군요... 흐음.


ISO가 높아서 거칠게 나왔군요. ㅡㅅ-);; 렌즈에 붙은 티끌들도 사진에 나와버렸습니다. ㅡ_-);;


햇살은 뜨거웠지만, 예전같지 않고, 하늘은 예전보다 푸르른 모습을 가득 머금고 있었습니다. 곧 가을이 찾아올 것 같습니다.


제가 좋아하는 나뭇잎 사이로 내리쬐는 태양입니다. ^^


한양대 여기저기에 누군가가 스프레이를 뿌려 자신만의 그래피를 그려두었습니다. ㅡㅅ-)> 자기만의 표시를 한다는 즐거움을 느낄 수 있었겠지만, 다른 사람들 입장에서는 곤란하기 그지없는 낙서일 뿐이지요. 개념 탑재 요망.


아직 방학인데다가 무더운 날씨 때문에 한양대에는 그다지 사람이 많지는 않았습니다. 다만, 오늘이 학위 수여식 날이어서 정장일 입고 꽃을 들고서 부모님과 오고가는 이들을 종종 볼 수가 있었습니다. 그들에게 졸업은 어떤 의미로 다가올까요? 저의 경우에는 이미 일을 하고 있는 상태여서 취업에 대해서 크게 걱정은 하지 않았습니다(현재는 크게 걱정하고 있습니다. ㅡㅅ-);; 저처럼 어디로 튈지 모르는 신입 개발자를 어느 회사가 데려가 주실지!!!).


한양대 동문회관쪽 도로에서 왕십리역쪽으로 빠르게 갈 수 있는 샛길입니다. ㅡㅅ-)~ 평소에는 많은 이들이 오고가는 곳이지요.


요 사진은 요래 봐도 복잡하고....


조래봐도 복잡합니다. ㅡㅅ-);; 마치 내 인생마냥, 복잡하게 얽기설기 뻗어나가고 있습니다.


이제는 말 할 수 있다. 지난번 트랜스포머2를 단체관람하고 저녁 먹을 곳을 찾아헤매이다가 들어간 가게입니다. ㅡㅅ-);; 비싼 돈 주고 주문한 생삼겹살이 가짜삼겹살로서 의심을 받은 곳이기도 하다. 나름 고기애호가로서 그런 삼겹살은 처음보았습니다. 의심의 눈길을 치켜뜨고 보니 별수가 없더군요. 하나하나가 의심스럽더군요.
- 굽지도 않았는데 반으로 갈라지는 부분
- 구울 때 특정 부위만 먼저 타는 거
- 삽겹살의 오도독 뼈가 없는 거
- 고기색깔이 갈라지는 부위를 중심으로 다른 거 하나하나 의심됨!!


한양대입니다. ㅡㅅ-);;


얼마전 한양대병원에서 정문쪽으로 이어지는 길의 양쪽으로 소나무들을 옮겨 심으셨더군요. 거기다가 특별한 의도를 가지고 삐딱하게 세워서 가운데로 모이도록 하셨더군요. 한가지 미리 말씀드리지만, 현재 중부지방의 기후는, 소나무가 건강하게 생장할 수 있는 온대기후가 아니라는 겁니다. 한해한해 갈수록 시들시들해져가는 소나무의 모습을 보시면서 '에구 내돈!!'하고 가슴을 치며 후회하실 때가 올 겁니다. 저정도 크기의 소나무라면, 가격도 만만치 않을텐데, 어떻게든 살려보려고 애쓰면서 돈도 많이 쓰시게 되겠습니다. ㅡㅅ-);; 뭐 자업자득이라고 해두지요.


한양대에서 박사과정을 진행하고 있는 친구녀석을 불러내어 시원한 카라멜 마끼야또를 얻어먹었습니다. 천사의 품안에서?




친구와 헤어져 양재에 있는 교육센터에 갔습니다. ㅡㅅ-);; 어찌나 가기가 싫던지... 이래서는 안되는데, 월요일에는 8시 20분에 가는 열의를 가져봐야겠습니다. 나는 강한 사나이!! 의지의 사나이!! 교육과정이 끝난 뒤라 횡한 모습을 보실 수 있을 겁니다.


휑하죠?


지난 프로젝트 발표회때에 비해서는 그래도 생기가 좀 돌아온 것 같지 않습니까? 하지만 조명 때문에 얼굴이 누렇게 떠보이는군요. OTL... 완전 슬픔입니다. 하지만 뭐... 원래 생긴게 이렇게 생겼습니다. 어쩌겠습니까. ㅎㅎ


집으로 돌아오는 중에 찍은 하늘 사진들 입니다. 나름 이뿌더군요. ㅡㅅ-);; 양 옆에 있는 아파트들을 모두 무너뜨리고 나서 찍고 싶을 만큼이요!!


허니몬의 IT 이야기/프로그래머, '코드 엔지니어'
링크 : http://java.sun.com/docs/books/tutorial/index.html

사용자 삽입 이미지

영문으로 되어있기는 하지만, 자바에 대한 기본적인 개념을 깨우치기에 매우 좋은 사이트인 것 같다. 자바를 배우기 시작한지 5개월이 지난 뒤에서야, 이 사이트의 가치에 조금 눈을 뜨게 된 것 같다.

현재 Java SE 는 SDK 6 버전의  16 번째 업데이트 버전 까지 나와있는 상황이며, 새로운 기술인 JavaFX와 관련된 부분에 대한 개발이 한창인 것으로 보인다. 자바 어플리케이션 스토어인 warehouse 도 곧 오픈한다고 한다.

● 이와 관련한 글들도 올라와 있다.
= 관련페이지 링크 : http://java.sun.com/warehouse/
= warehose 에 대한 동영상 설명 : http://channelsun.sun.com/video/java+warehouse+-+part+1+of+3/30631799001
오늘 12:00~ 12:20 사이에 오픈한다고 한다. Java Store beta 라고 하네.

내가 만든 프로그램을 JAR로 만들어서 배포하는 것에 대한 글도 조만간 올려야겠다.
ㅡㅅ-);; 난 그저 맛만보는 프로그래머...이기 때문에... ㅎㅎ 깊게는 못들어간다.

허니몬에 관한 보고서
사용자 삽입 이미지

현재 내가 가지고 있는 3가지의 대표적인 네임 벨류를 바탕으로 해서 할 수 있는 일, 하고 싶은 일, 해야하는 일로 구분하여 표시를 해봤다. 우선순위로 치자면 하고 싶은 일, 해야하는 일, 할 수 있는 일의 순서가 되겠지만... 현재 상황으로는 해야하는 일을 먼저 '중요'로 두고서 우선적으로 처리를 해야할 듯 하다. 후우!!! 어렵구나!!
1 ··· 40 41 42 43 44 45 46 ··· 70
블로그 이미지

Email : ihoneymon@gmail.com 안녕하세요, 꿀괴물 입니다. ^^ 멋진 비행을 준비 하는 블로그 입니다. 만능형 인간이 되어 많은 이들에게 인정받고, 즐겁고 행복하게 살기를 간절히 원합니다!! 달콤살벌한 꿀괴물의 좌충우돌 파란만장한 여정을 지켜봐주세요!! ^^

허니몬