JAVA
규칙 48 - 정확한 답이 필요하다면 float와 double은 피하라
이 자료형들은 이진 부동 소수점 연산에 사용된다. 하지만 float와 double는 정확한 돈계산에 사용에는 적합하지 않다. 예를 들어보자. 위의 코드를 예상하는 바로는 4 items bought가 나와야 하고 잔돈은 0원이 나와야하는 것이 맞다. 하지만 예상과 달리 잔돈이 생기고 구매 숫자가 다르다. 그 이유는 float와 double은 0.1(또는 10의 다른 음수, 10-1, 10-2...)을 정확하게 계산을 못하기 때문이다. 이는 컴퓨터가 계산을 10진수에서 2진수로 변환하는 과정에서 문제가 발생한다고 한다. 참조 : http://apphappy.tistory.com/152 자바에서는 그래서 이런 문제를 해결하기 위해 BigDecimal을 제공한다. 참조 : http://12soso12.tisto..
규칙 47어떤 라이브러리가 있는지 파악하고 적절히 활용하라
기존의 개발자들이 0부터 제한된 난수의 값을 만들라고 하는 경우에 다음의 코드를 사용하는 경우가 많다. 1234private status final Random rnd = new Random();static int random(int n) { return Math.abs(rnd.nextInt()) % n;}Colored by Color Scriptercs 위의 코드는 동일한 숫자를 뱉어내는 경우와 범위 이상에 데이터를 뱉어내기도 한다. 이는 다행 스럽게도 Random.nextInt(int) 플랫폼 라이브러리를 이용하여 해결할 수 있다. 이런 라이브러리에 내부 구현 동작을 모두 알면 좋지만, 모두 해석해서 사용하기에는 어려움이 있다. 만들어져 있는 라이브러리만 정상적으로 잘 사용한다면 시간을 낭비하지 않고..
메서드- 규칙 46 for문 보다는 for-each 문을 사용하라
기존에 배열을 순회할 때 다음과 같이 for문장을 사용하는 경우가 있다. 123for (int i = 0; i
메서드- 규칙 45 지역 변수의 유효범위를 최소화하라.
지역 변수의 유효 범위를 최소화하면 가독성과 유지보수성이 좋아지고, 오류 발생 가능성도 줄어든다. C 에서는 선언부에 모든 변수를 먼저 작성한다. 하지만 자바에서는 어디에서나 작성이 가능하다. 이것이 핵심이다. 지역변수의 유효범위를 최소화하는 가장 강력한 기법은, 처음으로 사용하는 곳에서 선언하는 것이다. 선언하기 전에 적으면 프로그램의 의도를 알고자 소스 코드를 읽는 사람에게 혼란을 야기할 수 있기에 실제로 변수가 사용될 때쯤 되면, 그 변수의 사용에 대해 잊어먹게된다. 그리고 또 다른 이유로, 문장의 초기에 선언하게되면 변수의 사용 가능 범위가 증가하게 된다.(변수는 선언된 순간 부터 문장의 종료까지 유효하다.) 그리고 반복문은 for문장이 while보다 좋다. 그 이유는 for의 () 안에 선언된 ..
메서드- 규칙 43 null 대신 빈 배열이나 컬렉션을 반환하라.
다음과 같은 상황을 보자. getData()를 통해 Babo 클래스를 담고 있는 List를 반환받고 그 반환된 List를 통해서 어떤 행위를 Main 메서드에서 실행한다고 가정해보자. 123456789101112131415161718192021package effective42; import java.util.List; public class Main { public static void main(String args[]) { System.out.println(getData().contains(new Babo())); } public static List getData() { return null; } static class Babo { int a; int getA() { return a; } }}Col..
메서드- 규칙 42 varags는 신중히 사용하라.
Varags는 가변 인자 메서드로 자바 1.5부터 공식적으로 추가되었다. 이 메서드는 지정한 자료형의 인자를 0개 이상으로 받을 수 있다. 기본 형태는 다음과 같다. 123public int sum(String... args) { System.out.println(args.size());}Colored by Color Scriptercs varargs 가변 인자 메서드는 0개 이상 인자를 받을 수 있기 때문에 인자를 보내지 않아도 사용할 수 있다. 이런점이 편리할 수도 있으나 문제점을 야기할 수 있다. 만약 인자를 가지고 동작을 하도록 설계된 함수가 있다고 해보자. 12345public void getString(String... args) { for (int i = 1; i
메서드- 규칙 41 오버로딩할 때는 주의하라.
오버로딩을 조심하라는 이번 주제를 확인하기 전에 오러로딩이 무엇인지 정리해보자. 오버로딩이란 오버로딩은 같은 이름의 메소드를 파라미터를 달리하여 사용하는 메서드를 말한다. 아래에 보면 오버로딩이 된 printData를 int와 string 데이터들이 사용하는 것을 볼 수있다. 12345678910111213141516171819public class Effective41 { public static void main(String args []) { printData(10); printData("test"); } public static void printData(int data) { System.out.println("test " + data); } public static void printData(S..
메서드- 규칙 40 메서드 시그니처는 신중하게 설계하라.
메서드를 설계할 때 주의해야 할 부분과 좋은 개선 방안에 대한 이야기를 살펴보겠다. 1. 메서드 이름을 신중하게 고르라. - 개발을 진행하면서 어려운 부분중에 네이밍 규칙이 꼽히는 것 같다. 메서드뿐만 아니라 변수를 선언을 할 때에도, 이름을 지어야하는데 쉽지 않은 것 같다. - 일관성을 유지해야하고, 일반적인 이름을 사용하지 않아서 혼돈을 격을 수 있는경우를 피해야한다. 2. 편의 메서드(convenience method)를 제공하는데 너무 열 올리지 마라. - 자주 사용하는 메서드를 정의하기 위해서 우리는 CommonUtil등에 정의를 하여 공통으로 사용할 수 있도록 하는경우가 많다. - 하지만 이는 유지보수, 테스트와 같은 여러 측면에서 번거로움이 생길 수 있기에 그럴지 모르겠다면 빼버려라. 3. ..
메서드- 규칙 39 필요하다면 방어적 복사본을 만들라.
포인터를 사용하지 않아 잘못된 메모리 접근으로 다른 메모리 영역에 데이터를 건드려서 beffer overrun(오버플로우)등의 오류는 자바에서는 발생하지 않는다. 하지만 아무리 안전한 언어를 사용한다고 해도, 스스로 노력하지 않는 경우, 클래스의 클라이언트가 불변식(invariant)을 깨버릴 수 있기 때문에, 조금 더 방어적인 프로그래밍을 해야 한다. 예를 통해서 확인해보자. 결재정보를 담고 있는 BillTimeObj라는 클래스는 결재 날짜 정보를 가지고 있는 Date 클래스를 생성자를 통해서 전달받는다. BillTimeObj 클래스는 final로 선언되어 있어서 변경되지 않을 것 같아 보이지만 생성자로 전달되는 Date 객체가 변경이 가능하기 때문에 이는 불변식이 깨져버린다. 1234567891011..
메서드- 규칙 38 인자의 유효성을 검사하라.
만약 메서드에서 파라미터 값으로 전달되는 값을 제한해야 하는 경우 어떤 값이 들어오면 시스템이 죽거나, 잘못된 데이터가 나온다는 것을 기재해 놓아야 한다. 그렇지 않으면 심각한 문제가 발생될 수 있다. 그렇기 때문에 몇 가지 안전장치를 마련해야 한다. 방법 - 만약 인자 유효성을 위반하는 경우는 Javadoc의 @throw 태그를 사용하여 문서화 해야 한다. 1234567/** * * @throw ZeroDivisionException (0으로 나누었을 때)*/public int getData() { return 222/0;}Colored by Color Scriptercs - assertion을 이용하여 인자 유효성 체크할 수 있다. - assertion은 항상 참이 되어야 한다. 만족되지 못하면 As..