분류 전체보기 (214) 썸네일형 리스트형 [아이템 29] 이왕이면 제네릭 타입으로 만들라 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } Object result = elements[--size]; elements[size] = null; //.. 4장 주석 사실상 주석은 기껏해야 필요악이다. 우리는 코드로 의도를 표현하지 못해, 그러니까 ‘실패’를 만회하기 위해 주석을 사용한다. 주석은 언제나 실패를 의미한다. 프로그래머들이 주석을 유지하고 보수하기란 현실적으로 불가능하다. 코드는 변화하고 진화하지만, 불행하게도 주석이 언제나 코드를 따라가지는 못한다. 우리는 (간혹 필요할지라도) 주석을 가능한 줄이도록 꾸준히 노력해야 한다. 주석은 나쁜 코드를 보완하지 못한다 자신이 저지른 난장판을 주석으로 설명하려 애쓰는 대신에 그 난장판을 깨끗이 치우는 데 시간을 보내라! 코드로 의도를 표현하라! 코드만으로 의도를 설명하기 어려운 경우가 존재한다는 생각은 분명히 잘못된 생각이다. 나쁜 예) // 직원이 복지 혜택을 받을 자격이 있는지 검사한다. if ((employe.. 3장 함수 작게 만들어라! 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다. 한 가지만 해라! 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다. 단계가 나눠져 있더라도, 지정된 함수 이름 아래에서 추상화 수준이 하나라면 한 가지이다. 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 중이다. 함수 당 추상화 수준은 하나로! 한 함수 내에 추상화 수준을 섞으면 특정 표현이 근본 개념인지 아니면 세부사항인지 구분하기 어려워짐 내려가기 규칙 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 오게 한다. 즉, 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 번에 한 단계씩 낮아진다. Switch 문 본질적으.. 2장 의미 있는 이름 의도를 분명히 밝혀라 변수, 함수, 클래스의 이름이 포함하고 있어야 할 정보 존재 이유 수행 기능 사용 방법 예시 int d; bad int daysSinceCreation; good 그릇된 정보를 피하라 목록을 불러오더라도 List 자료형을 사용하는 것이 아니면 이름에 List를 포함시키지 말 것 목록을 List를 이용해 담아오더라도 이름에 List는 안 쓰는게 좋음 흡사한 이름 쓰지 말 것 XYZControllerForEfficientHandlingOfStrings XYZControllerForEfficientStorageOfStrings ‘소문자 L, 대문자 O’ ‘l’은 숫자 1과 헷갈리고 O는 숫자 0과 헷갈림 의미 있게 구분하라 컴파일러/인터프리터만 통과하면 된다는 식으로 작명 X 연속적인 숫.. 1장 깨끗한 코드 우리 모두는 자신이 짠 쓰레기 코드를 쳐다보며 나중에 손보겠다고 생각한 경험이 있다. … 나중은 결코 오지 않는다. 기한을 맞추는 유일한 방법은, 그러니까 빨리 가는 유일한 방법은, 언제나 코드를 최대한 깨끗하게 유지하는 습관이다. 나쁜 코드는 나쁜 코드를 ‘유혹’한다! Grady Booch “깨끗한 코드는 잘 쓴 문장처럼 읽힌다.” “캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라.” 한꺼번에 많은 시간과 노력을 투자해 코드를 정리할 필요가 없다. 변수 이름 하나 개선하고, 조금 긴 함수 하나를 분할하고, 약간의 중복을 제거하고, 복잡한 if 문 하나를 정리하면 충분하다. [아이템 28] 배열보다는 리스트를 사용하라 [Why] 배열과 제네릭 타입의 차이 첫 번째 배열은 공변(covariant; 共變)이다. Sub가 Super의 하위 타입이라면 Sub[]는 Super[]의 하위 타입 제네릭은 불공변(invariant; 不共變)이다. 서로 다른 타입 Type1과 Type2이 있을 때, List은 List의 하위 타입도, 상위 타입도 아니다. 문제는 배열 쪽에 있다. Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException을 던진다. 위 코드는 문법 상 허용되지만, 런타임에 에러를 발생시킨다. List ol = new ArrayList(); // 호환되지 않는 타입이다. ol.add("타입이 달라 넣을 수 없다.. [아이템 27] 비검사 경고를 제거하라 [Why] 할 수 있는 한 모든 비검사 경고를 제거하라. 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것이다. 모두 제거한다면 그 코드는 타입 안정성이 보장된다! [How] 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWarnings("unchecked") 애너테이션을 달아 경고를 숨기자. 경고없이 컴파일될 수는 있지만, 런타임에 여전히 ClassCastException을 던질 수 있다. 경고를 무시해도 안전한 이유를 항상 주석으로 남겨야 한다. 한편, 안전하다고 검증된 비검사 경고를 숨기지 않고 그대로 두면, 진짜 문제를 알리는 새로운 경고가 나와도 파묻힐 수 있다. @SuppressWarnings 애너테이션은 항상 가능한 한 좁은 범위에 적용하자. 심각한.. [아이템 26] 로 타입(raw type)은 사용하지 말라 용어 정리 제네릭 클래스/제네릭 인터페이스: 클래스/인터페이스 선언에 타입 매개변수(type parameter)가 쓰인 것 제네릭 타입(generic type): 제네릭 클래스와 제네릭 인터페이스를 통틀어 칭함 매개변수화 타입(parameterized type): e.g.) List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입 여기서 String이 정규(formal) 타입 매개변수 E에 해당하는 실제(actual) 타입 매개변수 로 타입(raw type): 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때 e.g.) List의 로 타입은 List 자바에 제네릭 기능이 생기기 전 코드와 호환되도록 하기 위한 궁여지책 한글 용어 영문 용어 예 아이템 매개변수화 타입 parameteri.. 이전 1 ··· 5 6 7 8 9 10 11 ··· 27 다음