728x90
728x90
배열게 제니릭 타입에는 두 가지 차이가 있다. 1. 배열은 공변(covariant)이다. 어려워 보이는 단어지만 뜻은 간단하다. Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위타입이 된다(공변, 즉 함께 변한다는 뜻이다). 반면, 제네릭은 불공변(invariant)이다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. 이것만 보면 제네릭에 문제가 있다고 생각할 수 있지만, 문제가 있는 쪽은 리스트가 아니라 오히려 배열 쪽이다. 다음은 문법상 허용되는 코드다. Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // Array..
제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것이다. 비검사 형변환 경고, 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등이다. 제네릭에 익숙해질수록 마주치는 경고 수는 줄겠지만 새로 작성한 코드가 한번에 깨끗하게 컴파일되리라 기대하지는 말자. 대부분의 비검사 경고는 쉽게 제거할 수 있다. 코드를 다음처럼 잘못 작성했다고 해보자. Set exaltation = new HashSet(); 그러면 컴파일러는 무엇이 잘못됐는지 친절하게 알려줄 것이다. (javac 명령줄인수에 -Xlint:uncheck 옵션을 추가해야 한다). 컴파일러가 알려준대로 수정하면 경고가 사라진다. 사실 컴파일러가 알려준 타입 매개변수를 명시하지 않고, 자바 7부터는 지원하는 다이아몬드 ..
클래스와 인터페이스 선언에 타입 매개변수(type parameter)가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. List 인터페이스는 원소의 타입을 나타내는 타입 매개변수 E를 받는다. 그래서 이 인터페이스의 완전한 이름은 List 지만, 짧게 그냥 List라고도 자주 쓰인다. 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입(generic type)이라 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입(parameterized type)을 정의한다. 먼저 클래스 이름이 나오고, 이어서 꺾쇠괄호 안에 실제 타입 매개변수들을 나열한다. 마지막으로, 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀..
필자는 백기선님의 '스프링 기반 REST API 개발' 강의를 들으면서 실습을 진행하던 중에 문제가 발생하였고 실습과 동일하게 설정하는 방법에 대해 기록한 내용입니다. 문제 발생 원인 실제 인프런 강의는 Maven Build Tool 환경에서 진행했으나, 필자는 철저한 Gradle 파이기 때문에, Gradle로 실습을 진행하였습니다. 문제는 Spring REST Docs 문서를 빌드할 때 발생했습니다. Maven의 경우 플러그인 설정을 추가하고 Spring REST Docs 공식 레퍼런스에 따라서 설정을 진행하고 IntelliJ IDE의 Build Tool 메뉴에서 package를 더블클릭하면, 설정했던 plugin들에 의해서 test에 설정했던 snippsets 들을 생성하여 문서를 만들..
소스 파일 하나에 톱레벨 클래스를 여러개 선언하더라도 자바 컴파일은 작동한다. 하지만 별다른 이득을 취할 수 없을 뿐더러 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문이다. 다음 소스 파일은 Main 클래스 하나를 담고 있고, Main 클래스는 다른 톱레벨 클래스 2개(Utensil과 Dessert)를 참조한다. public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } } 집기(Utensil)와 디저트(Dessert) 클래스가 Uten..
중첩 클래스란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 중첩 클래스의 종류는 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스 이렇게 네 가지다. 이 중 첫번째를 제외한 나머지는 내부 클래스(inner class)에 해당한다. 이번 아이템에서는 각각의 중첩 클래스를 언제 그리고 왜 사용해야 하는지를 이야기한다. 정적 멤버 클래스 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고는 일반 클래스와 똑같다. 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 규칙을 적용받는다. 예컨대 private으로 선언하면 바깥 클래스에서..