반응형

전체 글 145

[Effective Java] Item64. 객체는 인터페이스를 사용해 참조하라

적함한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인스턴스 타입으로 선언하는 것이 프로그램을 훨씬 유연하게 만들어 줍니다. 하지만 인터페이스의 일반 규약이외의 특별한 기능에 의존하고 있다면 새로운 클래스도 반드시 이 기능을 제공해야합니다. 클래스를 참조해야하는 경우 적합한 인터페이스가 없다면 클래스를 참조합니다. 1. 값 클래스 String과 BigInteger 같은 값 클래스의 경우 final인 경우가 많고 상응하는 인터페이스가 별도로 존재하는 경우가 드뭅니다. 2. 클래스 기반으로 작성된 프레임워크가 제공하는 객체 OutputStream 등 java.io 패키지의 여러 클래스가 이 부류에 속합니다. 3. 인터페이스에는 없는 특별한 메서드를 제공하는 클래스(권장X) Priorit..

카테고리 없음 2022.08.14

[Effective Java] Item63. 문자열 연결은 느리니 주의하라

public String statement() { String result = ""; for (int i = 0; i < numItems(); i++) { result += lineForItem(i); } return result; } numItems()의 값이 커질수록 이 메서드는 심각하게 느려질 수 있습니다. 이럴 때는 StringBuilder를 사용합니다. public String statement2() { StringBuilder sb = new StringBuilder(numItems() * LINE_WIDTH); for (int i = 0; i < numItems(); i++) { sb.append(lineForItem(i)); } return sb.toString(); }

카테고리 없음 2022.08.14

[Effective Java] Item62. 다른 타입이 적절하다면 문자열 사용을 피하라

문자열을 쓰지 않아야하는 경우 1. 문자열로 다른 값 타입을 대신하는 경우 받는 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환합니다. 2. 문자열로 열거 타입을 대신하는 경우 상수를 열거할 때는 열거타입이 월등히 낫습니다. 3. 문자열로 혼합 타입을 표현하는 경우 String compoundKey = className + "#" + i.next(); 이 경우 className이나 i.next()에 #이 들어가면 혼란스러운 결과를 초래합니다. 각 요소를 개별로 접근하려면 문자열을 파싱해야 해서 느리고, 오류 가능성도 커집니다. 또한, 적절한 equals, toString, compareTo 메서드를 제공할 수 없으며 String이 지원하는 기능에만 의존해야합니..

카테고리 없음 2022.08.14

[Effective Java] Item61. 박싱된 기본 타입보다는 기본 타입을 사용하라

박싱된 기본 타입 사용시 주의점 1. 박싱된 기본 타입은 식별성을 갖고 있습니다. public static void main(String[] args) { System.out.println(new Integer(42) == new Integer(42)); System.out.println(42 == 42); } Output false true 박싱된 기본 타입은 식별성을 가지므로 ==연산자 비교시 레퍼런스를 비교합니다. 2. 박싱된 기본 타입은 null일 수 있습니다. static Integer i; public static void main(String[] args) { if (i == 42) { System.out.println("hi"); } } i == 42를 검사할 때 NullPointerExc..

카테고리 없음 2022.08.14

[Effective Java] Item59. 라이브러리를 익히고 사용하라

표준라이브러리를 사용하면 많은 장점을 얻을 수 있습니다. 전문가의 지식과 앞서 해당 라이브러리를 사용한 다른 프로그래머들의 경험을 활용할 수 있습니다. 핵심적인 일과 크게 관련 없는 문제를 해결하는라 시간을 허비하지 않아도 됩니다. 신경쓰지 않아도 지속적으로 성능이 개선됩니다. 기능이 점점 많아집니다. 우리가 작성한 코드가 많은 사람들에게 낯익은 코드가 됩니다. 이는 자연스레 유지보수, 재활용성에 도움이 됩니다.

카테고리 없음 2022.07.30

[Effective Java] Item58. 전통적인 for 문보다는 for-each문을 사용하라

while문과 for문의 관계처럼 반복 변수를 반복문 종료 후에도 사용할 것이 아니라면 for-each문을 사용하는 것이 낫습니다. 아래는 for-each문을 사용할 수 없는 상황입니다. 파괴적인 필터링: 컬렉션을 순회하면서 선택된 원소를 제거해야 하는 경우 변형: 리스트나 배열을 순회하면서 그 원소의 값 일부 혹은 전체를 교체하는 경우 병렬반복: 여러 컬렉션을 별렬로 순회해야 하는 경우

카테고리 없음 2022.07.30

[Effective Java] Item57. 지역변수의 범위를 최소화하라

지역변수의 유효범위를 최소로 줄이면 코드 가독성, 유지보수성이 높아지고 오류 가능성을 낮출 수 있습니다. 가장 처음 쓰일 때 선언 선언과 동시에 초기화 메서드를 작게 유지하고 한 가지 기능에 집중 반복문의 경우 반복 변수의 값을 반복문 종료 후에도 사용할 것이 아니라면 for문을 사용하는 것이 보통은 낫습니다.

카테고리 없음 2022.07.30

[Effective Java] Item56. 공개된 API요소에는 항상 문서화 주석을 작성하라

문서화 주석은 API를 문서화 하는 가장 효과적인 방법이므로 공개 API라면 이에대한 설명을 빠짐없이 달아야 합니다. 메서드용 문서화 주석 메서드와 클라이언트 사이의 규약을 명료하게 기술합니다. 사욕용으로 설꼐된 클래스의 메서드가 아니라면 무엇을 하는지 기술합니다.(how가 아닌 what) 메서드 호출 전제조건을 모두 기술합니다. 메서드가 성공적으로 수행된 후에 만족해야 하는 사후조건을 모두 기술합니다. 전제조건은 @throws태그로 비검사 예외를 선언하여 암시적으로 기술하며 @param태그를 이용해 조건에 영향을 받는 매개변수도 기술합니다ㅣ. 메서드 계약(contract) @param 태그를 달아 메서드 계약을 완벽하게 기술합니다. 반환타입이 void가 아니라면 @return태그를 답니다. @retur..

카테고리 없음 2022.07.30

[Effective Java] Item55. 옵셔널 반환은 신중히 하라

메서드가 특정 조건에서 값을 반환할 수 없을 때 예외를 던지거나, null을 반환합니다. 예외는 진짜 예외적인 상황에서만 사용해야하며 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 상당합니다. null을 반환하면 메서드를 호출할 때 마다 null처리는 해야하며 그렇지 않으면 언젠가는 NullPointerException이 발생할 수 있습니다. Optional 자바 8에서는 하나의 선택지가 더 생겼습니다. Optional는 null이 아닌 T가 있거나 없을 수 있습니다. Optional은 원소를 최대 1개 가질 수 있는 불변컬렉션입니다. (실제로는 Collection를 구현하지는 않았습니다.) public static E max(Collection c) { if (c.isEmpty()) throw ..

카테고리 없음 2022.07.30

[Effective Java] Item49. 매개변수가 유효한지 검사하라

매개변수를 제대로 검사하지 않으면? 메서드 수행 중간에 모호한 예외를 던질 수 있습니다. 메서드가 잘못된 결과를 반환할 수 있습니다. 잘못된 결과를 반환하므로 이후에 알 수 없는 시점에 이 메서드와 관련없는 오류를 낼 수 있습니다. public과 protected 메서드는 매개변수 값이 잘 못 됐을 때 던지는 예외를 @throws 자바독 태그를 이용해 문서화해야 합니다. 매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외도 함께 기술해야합니다. /** * Returns a BigInteger whose value is {@code (this mod m}). This method * differs from {@code remainder} in that it always returns a * ..