Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 가변인수와 제네릭 가변인수(varargs) 메소드와 제네릭은 JDK 5에서 함께 추가되었으니 잘 어우러지리라 기대하겠지만, 그렇지 않다. 가변인수는 메소드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해준다. public class VarargsTest { @Test void argsTest() { printArgs(1, 2, 3, 4, 5); } public void printArgs(int... args) { for (int arg : args) { System.out.printf("%d ", arg); } } } 가변인수 메소드를 호출하면 해당 인수들을 ..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 상위 타입과 하위 타입의 호환 매개변수화 타입은 불공변(invariant)이다. 서로 다른 Type1, Type2가 있다고 가정해보자. List은 List의 하위 타입도, 상위 타입도 아니다. 이 말은 즉, List은 List의 하위 타입이 아니라는 뜻과 동일한 것이다. public class ListTest { @Test void listTest() { List objList = new ArrayList(); List strList = new ArrayList(); objList.add(strList); } } 위 코드를 보면 objList는 어떤 객체든 넣을 수 ..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 타입 차이 배열과 제네릭 타입에는 중요한 차이가 두 가지 있다. 공변과 불공변 실체화(reify) 공변과 불공변 배열은 공변;함께 변한다(covariant)이다. Sub가 Super의 하위 타입이라면, Sub[]는 Super[]의 하위 타입이 된다. Long은 Object의 하위에 속해있기 때문에 Object[]와 Long[]은 함께 사용이 가능하다. @Test void objArrTest() { Object[] objectArr = new Long[1]; // 런타임 에러 발생 : java.lang.ArrayStoreException: java.lang.String..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 제네릭 제네릭(generic)은 자바 5부터 사용할 수 있으며, 안정적인 형변환을 할 수 있도록 지원하는 타입이다. 제네릭은 클래스 혹은 인터페이스에 타입 매개변수를 통해 붙여 사용할 수 있다. public class ArrayList {...} public interface List {...} 이러한 형태를 제네릭 클래스 혹은 제네릭 인터페이스라고 부르며, 이를 통 틀어서 제네릭 타입이라고도 부른다. 매개변수화 타입 각각의 제네릭 타입은 일련의 매개변수화 타입(Parameterized type)을 정의한다. public class ArrayList {...} 위 코..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 태그 클래스 태그 달린 클래스란, 현재 상태에 대한 필드가 존재하는 클래스를 의미한다. 아래 클래스에 대한 코드를 확인해보면 shape라는 변수가 현재 Figure가 RECTANGLE인지 CIRCLE인지에 대한 상태를 반환하므로, 태그로 볼 수 있다. public class Figure { enum Shape {RECTANGLE, CIRCLE}; final Shape shape; // 사각형(RECTANGLE)일 경우 사용 double length, width; // 원(CIRCLE)일 경우 사용 double radius; public Figure(double rad..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 상수 인터페이스 상수 인터페이스란, 상수를 뜻하는 static final 필드로 가득찬 인터페이스를 의미한다. 이 상수들을 사용하려는 클래스에서는 정규화된 이름을 쓰는걸 피하고자 그 인터페이스를 구현하곤 한다. public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = ...; // 볼츠만 상수 (J/K) static final double BOL..