프로그래밍/Java

    이펙티브 자바 규칙 26 - 가능하면 제네릭 자료형으로 만들 것

    이펙티브 자바 규칙 26 - 가능하면 제네릭 자료형으로 만들 것

    제네릭에 대한 설명을 하기 위해 6장에서 사용했던 스택 코드를 사용할 것입니다. 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(); return elements[--..

    이펙티브 자바 규칙 25 - 배열 대신 리스트를 써라

    이펙티브 자바 규칙 25 - 배열 대신 리스트를 써라

    이번 규칙은 들어가기 전에 알아야 할 개념들이 있습니다. 저도 잘 몰라서 조사하고, 테스트 해보니 천천히 설명해볼게요. 배열과 제네릭(List)의 차이 중 하나로 배열은 공변 자료형(covariant)이고, 제네릭는 불변 자료형(invariant) 입니다. 영어에 익숙하신 분들은 co 접두사를 보고 금방 눈치를 채질 수도 있으신데요. A와 B의 자료가 있을 때 공변 자료형은 A가 B의 하위 자료형이라면, A의 배열도 B의 하위 자료형이 됩니다. 반대로 불변 자료형은 상위나 하위의 자료형이 될 수 없고요. 밑의 코드를 한번 볼까요. Object 배열과, Object List를 만들어 봤습니다. 둘 다 실행이 안되는 코드입니다. 하지만 8번 라인의 코드는 런타임 중에 에러가 나고 11번 라인의 코드는 컴파일..

    이펙티브 자바 규칙 24 - 무점검 경고를 제거하라

    이펙티브 자바 규칙 24 - 무점검 경고를 제거하라

    제네릭은 컴파일러의 경고를 많이 보게되는 기능 중 하나입니다. 무점검 형변환 경고(uncecked warning), 무점검 메소드 호출 경고(unchecked method invocation warning), 무점검 제네릭 배열 생성 경고 등 밑의 코드를 한번 볼까요 컴파일러 상 에러는 나지 않았지만 Unchecked assignment로 경고를 주고 있습니다. 저번 포스트에서도 봤던 거죠. 밑의 코드대로 바꾸면 경고는 사라집니다.Set exaltation = new HashSet(): 이 경고는 간단하게 제거가 가능했지만 제네릭은 경고가 나오기 쉬운만큼 지우기 어려운 경고들도 많습니다. 만약 형 안정성이 확실한데 경고를 지우기 어렵다면 어노테이션을 사용하는 방법이 있습니다. ArrayList의 일부인 ..

    이펙티브 자바 규칙 23 - 새 코드에는 무이자 제네릭 자료형을 사용하지 마라

    이펙티브 자바 규칙 23 - 새 코드에는 무이자 제네릭 자료형을 사용하지 마라

    자바 1.5부터 제네릭을 사용할 수 있게되었습니다. 리스트, 셋 등에서 많이 사용해보셨겠지만, 제네릭은 자료형을 매개로 받아 지정하는 것을 이야기 합니다. public static void main(String[] args){ class test { private T data; public test(T data) { this.data = data; } } test test = new test("text"); System.out.println(test); } 이런식으로 말이죠. 이 제네릭은 무인자로도 사용이 가능합니다. test test = new test("text");이렇게 말이죠. 컴파일 에러가 뜨지 않습니다. 하지만 권장되지 않습니다. 무인자로 사용할 경우 형변환 하는 과정에서 의도되지 않게 삽입된..

    이펙티브 자바 규칙 22 - 내부클래스 종류와 멤버 클래스는 가능하면 static으로

    자바에서 중첩(nested)클래스는 4가지로 나뉩니다. 1. 정적 멤버 클래스(static member class)2. 비 정적 멤버 클래스(non-static member class)3. 익명 클래스4. 지역 클래스 먼저 정적 멤버 클래스는 가장 간단한 중첩클래스 형태입니다. 클래스 안쪽에 static 클래스를 선언해 바깥 클래스를 사용할 때 클래스를 자동으로 생성시켜주는 역할을 합니다. 바깥 클래스를 사용할 때 자연스럽게 사용되는 헬퍼 클래스의 역할을 하는 만큼, 매번 바깥 클래스를 호출할 때마다 내부 클래스를 재생성하는건 메모리 효율상 좋지 않기 때문에 내부 클래스에서 바깥 객체에 접근할 필요가 없는 클래스의 경우 static을 붙여 생성시켜놓고 쓰게끔 하는 것입니다. 이 경우 정적 멤버 클래스는 ..

    이펙티브 자바 규칙 21 - 전략을 표현하고 싶을 때는 함수 객체를 사용해라

    프로그래밍 언어들 중에는 특정 함수를 호출할 수 있는 언어들이 있습니다. C같은 경우에는 포인터를 이용해서, 대리자(delegate), 자바도 사용할 수 있는 람다 표현식이 있죠. 전략을 표현하는데에 포인터가 좋은 방법이 될 수 있지만 자바는 포인터를 지원하지 않습니다. 자바는 어떤 경우라도 주소값을 직접 건드리지 못하게 하죠. 하지만 비슷한 메소드를 사용할 수 있습니다. 함수 객체(function object)라고 하는 방법입니다. public class StringLengthComparator { public int compare(String s1, String s2) { return s1.length() - s2.length(); } }이 코드는 문자열을 비교하여 차이를 계산해주는 전략을 가지고 있..

    이펙티브 자바 규칙 20 - 태그가 달린 클래스 대신 클래스 계층을 활용하라

    태그가 달린 클래스라는 것이 있습니다. 두가지 이상의 기능을 커버하는 클래스인데 아래 예제를 보죠. class Figure { enum Shape { RECTANGLE, CIRCLE }; final Shape shape; double length; double width; double radius; Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } Figure(double length, double width) { shape = Shape.RECTANGLE; this.length = length; this.width = width; } double area() { switch (shape) { case RECTANGLE: retu..

    이펙티브 자바 규칙 19 - 인터페이스는 자료형을 정의할 때만 사용하라

    인터페이스는 해당 클래스의 객체를 참조 할 수 있는 자료형(type)의 역할을 합니다. 인터페이스를 구현하면 int, string 등의 자료형을 그대로 오버라이드 하게되는데 이 목적을 위해 언터페이스를 사용하죠. 하지만 개중에는 그렇지 않은 인터페이스도 있습니다. public Interface PhysicalConstants { // 아보가르도 수(1/mol) static final double AVOGADROS_NUMBER = 6.02214199e23; // 볼쯔만 상수(J/K) static final double BOLTZMANN_CONSTANT = 1.3806503e-23; // 전자 질량(kg) static final double ELECTRON_MASS = 9.10938188e-31; } 이는 ..

    이펙티브 자바 규칙 18 - 추상 클래스 대신 인터페이스를 사용하자

    이펙티브 자바 규칙 18 - 추상 클래스 대신 인터페이스를 사용하자

    자바에는 여러 구현을 허용하는 자료형을 만드는 방법이 두가지 있습니다. 추상형 클래스와 인터페이스입니다. 이 두가지의 차이점은 추상클래스는 구현된 메소드를 포함할 수 있지만, 인터페이스는 아니라는 점입니다... 는 점이었지만 자바 1.8부터 default 를 활용하여 언터페이스도 body를 가질 수 있게 되었습니다! public interface Test { public void existingMethod(); default public void newDefaultMethod() { System.out.println("New default method is added in interface"); } }덕분에 우리는 공부할 게 늘었습니다. 추상형 클래스는 구현하려면 상속(계승)을 써야합니다. 자바에서는 멀..

    이펙티브 자바 규칙 17 - 계승을 위한 문서를 갖추거나, 그럴 수 없다면 금지하자

    이펙티브 자바 규칙 17 - 계승을 위한 문서를 갖추거나, 그럴 수 없다면 금지하자

    저번 포스트에서는 계승(상속)의 위험성을 설명하면서 구성의 디자인 패턴을 설명했습니다. 이번엔 EFJ에서는 상속의 위험성을 다루고 있습니다. 저번의 포스트에서 본 바와 같이 상속은 캡슐화를 깨뜨릴 수 있는 위험을 내포하고 있는 기능입니다. 때문에 오버라이드 등을 사용할 때 주의가 필요합니다. 1. 메소드를 재정의 할 때는 무슨 일이 발생하는지 정확하게 문서로 남겨야 한다. /** * {@inheritDoc} * * This implementation iterates over the collection looking for the * specified element. If it finds the element, it removes the element * from the collection using th..