편의상 자바 기준으로 쓰려고 하고..
코딩습관상 오류를 피할수있는 팁이라고 할까?
뭐 생각나는데로 적어보겠당.
뭐... 개인적인 생각이니 의견있으면 남겨주시길...
1. equals의 문제.
2. for문에서 배열 길이의 문제
3. null의 화면출력문제 (웹소스상)
이건 jsp같은 웹에서 나옴직한 문제인데...
값을 넘겨서 출력하다보면
의도하지 않게 null 데이터를 jsp단에서 출력하면
친절하게 null 이라고 화면에 출력해준다. (하지만 고객은 공백이나 출력안되길 원한다)
일반 프로그램에서 구현을 한다면
String의 null과 공백은 엄청난 차이지만,
웹에서 결과를 바라보는 입장인 사용자의 경우는 그런건 중요하지 않다.
(오히려 null이 뭐냐고 물어볼걸?)
웹개발을 하면서 출력에 관련된 메소드는 null 리턴보다는 공백리턴이 보기 좋다 (String은 "" , Integer는 0)
예를 들면,
다음소스는 "20080101" --> "2008.01.01"로 리턴하는 메소드이다.
근데... 실제 db값을 가져오거나 하면 null 도 올수 있고, 형식에 안맞는 값도 올수 있다.
그래서 웹화면 출력과 관계된 메소드는 다음과 같이 하는게 좋다. (개인적 의견)
4. 메소드에서 null 미리 피하기
5. 배열 크기제한의 오류
뭐 생각나면 추가로 적어보겠지만..흠.. 기억이 더 안난다.
코딩습관상 오류를 피할수있는 팁이라고 할까?
뭐 생각나는데로 적어보겠당.
뭐... 개인적인 생각이니 의견있으면 남겨주시길...
1. equals의 문제.
String str = "국어";
(1) if ( "국어".equals(str) ) <== 추천
(2) if ( str.equals("국어") )
(1)번과 (2)번의 차이점은 ?
기능적 차이점은 없다...
단 str이 가변적인 값이라면 문제는 달라진다.
가변적 이라는것은 그 값이 null 이 올수도 있다는것이다.
만약 str = null 이라면.. (2) 번의 경우는 오류가 날것이다.
왜냐고? null.equals 라는게 가능이나 할까?
(1) if ( "국어".equals(str) ) <== 추천
(2) if ( str.equals("국어") )
(1)번과 (2)번의 차이점은 ?
기능적 차이점은 없다...
단 str이 가변적인 값이라면 문제는 달라진다.
가변적 이라는것은 그 값이 null 이 올수도 있다는것이다.
만약 str = null 이라면.. (2) 번의 경우는 오류가 날것이다.
왜냐고? null.equals 라는게 가능이나 할까?
2. for문에서 배열 길이의 문제
for문을 쓰는 주된 이유는 보통, 배열을 순회할때 가장 많이 사용한다.
하지만 여기에도 함정이 있다. foreach를 쓰면 피할수 있겠지만
사실 실 개발을 하다보면 자바 1.4 1.3 등등 구버전을 많이 접해서
실제 개발하면 구식스타일을 고집하게 된다.
다음 예제를 보자
String [] arr = {"ABC", "DEF"};
for (int i=0; i < arr.length; i++)
{
System.out.println("출력 : " + arr[i]);
}
뭐가 문제일까?
역시 arr이 null값이 올때의 문제이다. null.length는 존재하지 않는다.
for (int i=0; i < arr.length; i++)
==> for (int i=0; i < (arr==null?0:arr.length); i++)
이런문제를 피하기 위해서 배열 순회할때 배열 크기는
습관적으로 저렇게 처리하는게 좋다.
하지만 여기에도 함정이 있다. foreach를 쓰면 피할수 있겠지만
사실 실 개발을 하다보면 자바 1.4 1.3 등등 구버전을 많이 접해서
실제 개발하면 구식스타일을 고집하게 된다.
다음 예제를 보자
String [] arr = {"ABC", "DEF"};
for (int i=0; i < arr.length; i++)
{
System.out.println("출력 : " + arr[i]);
}
뭐가 문제일까?
역시 arr이 null값이 올때의 문제이다. null.length는 존재하지 않는다.
이런문제를 피하기 위해서 배열 순회할때 배열 크기는
습관적으로 저렇게 처리하는게 좋다.
3. null의 화면출력문제 (웹소스상)
이건 jsp같은 웹에서 나옴직한 문제인데...
값을 넘겨서 출력하다보면
의도하지 않게 null 데이터를 jsp단에서 출력하면
친절하게 null 이라고 화면에 출력해준다. (하지만 고객은 공백이나 출력안되길 원한다)
일반 프로그램에서 구현을 한다면
String의 null과 공백은 엄청난 차이지만,
웹에서 결과를 바라보는 입장인 사용자의 경우는 그런건 중요하지 않다.
(오히려 null이 뭐냐고 물어볼걸?)
웹개발을 하면서 출력에 관련된 메소드는 null 리턴보다는 공백리턴이 보기 좋다 (String은 "" , Integer는 0)
예를 들면,
다음소스는 "20080101" --> "2008.01.01"로 리턴하는 메소드이다.
근데... 실제 db값을 가져오거나 하면 null 도 올수 있고, 형식에 안맞는 값도 올수 있다.
그래서 웹화면 출력과 관계된 메소드는 다음과 같이 하는게 좋다. (개인적 의견)
기존소스 | 웹에서 화면출력과 관계되는 메소드일경우 추천하는 방식 |
public static String formatDateStr( String s) { StringBuffer t = new StringBuffer(""); final String deli = "."; if ( s == null || s.length() < 8 ) return null; else { t.append( s.substring(0,4)).append(deli) .append( s.substring(4,6)).append(deli) .append( s.substring(6,8)); return t.toString(); } } |
public static String formatDateStr( String s) { StringBuffer t = new StringBuffer(""); final String deli = "."; if ( s == null ) return ""; else if (s.length() < 8) return s; else { t.append( s.substring(0,4)).append(deli) .append( s.substring(4,6)).append(deli) .append( s.substring(6,8)); return t.toString(); } } |
4. 메소드에서 null 미리 피하기
뭐... null문제가 제일 빈번하므로, 메소드 만들때 미리 null데이터를 피해버리는것..
다음과 같이 null이나 기타 문제를 일으킬만한걸 위쪽에서 모조리 체크하고 return 처리해서
실제 구현되는 부부의
소스가 안돌아 가도록 처리하는 방법이 있당 ㄱ-
public void Test1(String str, String cpy)
{
if (str == null)
return;
.....(실제로직)....
}
public int Test2(String str)
{
if (str == null)
return -1;
.....(실제로직)....
}
다음과 같이 null이나 기타 문제를 일으킬만한걸 위쪽에서 모조리 체크하고 return 처리해서
실제 구현되는 부부의
소스가 안돌아 가도록 처리하는 방법이 있당 ㄱ-
public void Test1(String str, String cpy)
{
if (str == null)
return;
.....(실제로직)....
}
public int Test2(String str)
{
if (str == null)
return -1;
.....(실제로직)....
}
5. 배열 크기제한의 오류
뭐 이런경우다. 수많은 데이터를 가진 배열에서 10개만 출력한다면?
String [] data = {"한꼬마", "두꼬마","세꼬마" ... " 백꼬마"};
이런 데이터가 올것으로 예상되는 data배열을 10개만 출력해야 한다면??
뭐 쉽네 하고 방심하면 다음과 같이 구현한다
for (int i=0; i < 10; i++)
{
System.out.println(i + "번째 : " + data[i]);
}
사실 방심하기 쉽다. data라는 변수는 충분한 데이터가 있다고 단정지으면 저런 코드가 나올수 있다.
(String [] data = {"한꼬마", "두꼬마","세꼬마" ... "일곱꼬마"); 같이 10개에 못미칠수도 있다)
data는 꼭 10개가 넘는 다는 보장은 없다.
아래와 같이 구현하면,,, 2. for문에서 배열 길이의 문제에서 말한 null도 피하고
여기서 이야기 하고자 하는 Out of Bound(??) ... 라고 할까?
아무튼 배열 인덱스 넘어가는 문제를 피할 수 있다. (소햏은 영어에 약하다)
for (int i=0; i<(data==null?0:data.length); i++)
{
if (i >= 10) // 10개가 넘으면 loop탈출
break;
System.out.println(i + "번째 : " + data[i]);
}
String [] data = {"한꼬마", "두꼬마","세꼬마" ... " 백꼬마"};
이런 데이터가 올것으로 예상되는 data배열을 10개만 출력해야 한다면??
뭐 쉽네 하고 방심하면 다음과 같이 구현한다
for (int i=0; i < 10; i++)
{
System.out.println(i + "번째 : " + data[i]);
}
사실 방심하기 쉽다. data라는 변수는 충분한 데이터가 있다고 단정지으면 저런 코드가 나올수 있다.
(String [] data = {"한꼬마", "두꼬마","세꼬마" ... "일곱꼬마"); 같이 10개에 못미칠수도 있다)
data는 꼭 10개가 넘는 다는 보장은 없다.
아래와 같이 구현하면,,, 2. for문에서 배열 길이의 문제에서 말한 null도 피하고
여기서 이야기 하고자 하는 Out of Bound(??) ... 라고 할까?
아무튼 배열 인덱스 넘어가는 문제를 피할 수 있다. (소햏은 영어에 약하다)
for (int i=0; i<(data==null?0:data.length); i++)
{
if (i >= 10) // 10개가 넘으면 loop탈출
break;
System.out.println(i + "번째 : " + data[i]);
}
뭐 생각나면 추가로 적어보겠지만..흠.. 기억이 더 안난다.