목록java (78)
초보개발자 긍.응.성

열거 타입 (Enum type) 자바 언어의 열거 타입 (enum type)은 Java 1.5 부터 등장하였다. 이전까지는 상수 선언 시 static final을 붙여 사용했었다. 정수 열거 패턴 혹은 문자열 열거 패턴은 타입 안전을 보장할 수 있는 방법이 없으며 표현력도 좋지 않다. 상수의 값이 바뀌면 클라이언트도 반드시 다시 컴파일해야 한다. 디버깅 시에도 의미를 파악하기 힘들며 상수의 개수가 몇개가 존재하는지도 알 수 없다. 열거 타입은 클래스이며 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다. 그렇기에 열거 타입 선언으로 만들어진 인스턴스들은 딱 하나씩만 존재하며 불변이다. 클래스이기에 타입 인전성을 제공한다. 열거 타입에는 각자의 이름공간(Nam..

제네릭이 자바 8 이후부터등장했다. 제네릭 등장 이전에는 로 타입을 이용하였으며 이는 타입 안전하지 못했다. 특징 제네릭은 컴파일 타임에 타입에 대하여 체크를 한다. 또한 컴파일 타임에 타입에 대한 검증하기에 런타임에는 타입이 소거된다. 제네릭 클래스와 제네릭 메서드 제네릭을 사용한다면 타입에 사용할 여러 타입에 대하여 별도의 클래스 또는 메서드를 만들어 줄 필요 없다. 제네릭 클래스 또는 제네릭 메서드를 이용하여 한번에 처리할 수 있기 때문이다. 비검사 경고 제네릭을 사용하기 시작하면 수많은 unchecked 경고를 볼 수 있다. 사용한 제네릭에 타입 안전성이 보장되지 않다면 이러한 경고들이 발생한다. 될 수 있는 한 모든 unchecked 경고를 없애자. 없앨 수 없지만 타입 안전하다 확신할 수 있다..

배열과 제네릭 타입의 차이 배열 공변(covariant)이다 (Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다) 런타임에도 자신이 담기로 한 원소 타입을 인지하고 확인한다. 제네릭 불공변(invariant)이다 타입 정보가 런타임에는 소거(erasure)된다. 원소타입을 컴파일 타임에만 검사하며 런타임에는 알 수 없다. 이러한 차이로 배열과 제네릭은 잘 어우러지지 못한다. 제네릭 배열은 만들 수 없는데 타입 안전하지 않기 때문이다. 실체화 불가 타입 (non-reifiable type) 실체화되지 않아서 런타임에는 컴파일타임보다 타입 정보를 적게 가지는 타입이다. E, List, List 같은 타입이 실체화 불가 타입에 해당된다. 제네릭 타입과 가변 인수 메..

할 수 있는 한 모든 비검사 경고를 제거하라 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 된다. 비검사 형변환 경고 비검사 메서드 호출 경고 비검사 매개변수화 가변인수 타입 경고 비검사 변환 경고 할 수 있는 한 모든 비검사 경고를 제거하라. 모두 제거한다면 그 코드는 타입 안전성이 보장된다. 즉, 런타임에 ClassCastException이 발생할 일이 없으며, 의도한 대로 잘 동작한다. @SuppressWarning 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWaring("unchecked") 애너테이션을 달아 경고를 숨기자. Type Safety를 검증하지 않은 채 경고를 숨기면 스스로에게 잘못된 보안 인식을 심어주게 된다. 코드는 경고 없이 컴파일되겠지..

용어 제네릭 클래스 : 클래스의 선언에 타입 매개변수가 쓰인 클래스 제네릭 인터페이스 : 인터페이스의 선언에 타입 매개변수가 쓰인 인터페이스 제네릭 타입 : 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭이라고 부른다 매개변수화 타입 (parameterized type) : 제네릭 타입에 실제 매개변수가 함께 선언된 타입 로 타입 (raw type) : 제네릭 타입에서 타입 매개변수를 사용하지 않을 때의 타입 예를 들어 매개변수화 타입이 List 이라면 실제 타입 매개변수는 String이며 로 타입은 List이다. 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 로 타입의 사용 제네릭 대신 로 타입을 사용해도 동작을 하지만 좋은 예가 아니다 (하위 호환성을 위해 지원..

톱 레벨 클래스 톱레벨톱 레벨 클래스는 소스파일에서 가장 바깥에 존재하는 클래스를 말한다. 일반적으로 하나의 소스파일에서는 하나의 톱 레벨 클래스를 가진다. 예로 파일 이름이 SimpleService.java라면 클래스 이름도 SimpleService로 하나의 톱 레벨 클래스를 갖는다. 사실 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러의 동작에는 아무런 문제가 없다. 단 이런 사용은 아무런 득이 없을뿐더러 심각한 위험을 감수해야 하는 행위다. 다수의 톱레벨 클래스 정의의 문제점 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라진다. public class Main { public static void main(S..