IllegalArgumentException 가장 많이 사용되는 예외 중 하나로 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외이다. 예를 들어 정수 파라미터를 받고 양수만 들어와야 한다고 할 때 음수가 들어오면 사용할 수 있다. public void onlyPlus(int number) { if (number
이펙티브자바
열거 타입의 확장은 불가능? 열거 타입은 활용하기 좋지만 확장할 수 없다는 단점이 있다. 쉽게 말해서 Enum 타입은 상속이 불가능하다. 사실 대부분의 상황에서 열거 타입을 확장하는 것은 좋지 않은 생각이다. 열거 타입은 원소들을 순회할 수 있는데 기반 타입과 확장 타입을 모두 순회하는 방법도 마땅치 않다. 열거 타입은 인터페이스를 구현할 수 있다. 열거 타입을 상속받는 것은 불가능하다. 하지만 열거 타입이 인터페이스를 구현하는 것은 가능하다. 상위 인터페이스를 정의하고 이를 확장한 여러 열거 타입으로 유연하게 여러 열거 타입 구현체를 사용할 수 있다. 아래는 체스 미션에서 사용한 인터페이스와 열거 타입을 사용한 예시이다. 체스 미션에서 활용한 방향 열거 타입 체스 기물인 킹, 퀸, 폰, 룩, 비숍, 나..
용어 정리 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. public interface List extends Collection { List 인터페이스는 E라는 원소 타입 매개변수를 받고 이러한 제네릭 클래스와 인터페이스를 통틀어 제네릭 타입이라 한다. 제네릭 타입은 매개변수화 타입을 정의한다. 예를 들어 List라고 했을 때 Integer가 리스트가 받을 수 있는 타입을 정의한 매개변수화 타입이다. 제네릭 타입에는 로 타입이라는 것도 있다. 로 타입이란 타입 매개변수를 사용하지 않은 제네릭 타입을 의미한다. List list; 그렇다면 이 로 타입을 사용하지 말아야 하는 이유는 무엇일까? 로 타입은 타입 안정하지 않다. List rawList ..
자바가 열거 타입을 지원하기 전 로또의 등수를 표현한다고 가정해보자. 열거 타입을 쓸 수 없다면 다음과 같이 표현할 수 있을 것이다. public static final int LOTTO_RANK_FIRST = 1; public static final int LOTTO_RANK_SECOND = 2; public static final int LOTTO_RANK_THRID = 3; public static final int LOTTO_RANK_FOURTH = 4; public static final int LOTTO_RANK_FIFTH = 5; public static final int LOTTO_RANK_NOTHING = 0; 1등은 정수 1로, 5등은 5로, 꽝은 0으로 정수를 열거하여 작성했다. 이렇..
똑같은 객체를 매번 생성하기보다 하나를 재사용하는 편이 나을 때가 많다. 특히 불변 객체는 생성할 필요 없이 언제든 재사용할 수 있다. 예시1. String String newString = new String("string"); String string1 = "string"; String string2 = "string"; 첫 줄처럼 문자열을 생성하는 사람은 없을 것이나 예시를 들기 위해 가져왔다. 문자열(String)은 프로그램이 실행되는 동안 엄청 많이 생성되는 객체이다. String은 String pool에서 관리되기 때문에 단순히 2,3번째 줄처럼 생성하면 String pool에서 인스턴스를 가져오기 때문에 불필요한 생성은 하지 않는다. 하지만 new로 생성하게 되면 새로운 인스턴스로 생성하기 ..
중첩 클래스 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 메서드 밖에서 사용해야 하거나 메서드 안에 정의하기에 너무 길 때 만든다. public class OuterClass { // ... class InnerClass { // ... } } 정적 멤버 클래스 static이 붙어 정적으로 선언된 중첩 클래스를 정적 멤버 클래스라고 한다. 바깥 클래스의 private 멤버 변수에도 접근할 수 있다는 점만 제외하고 일반 클래스와 똑같다. 멤버 클래스일 뿐 다른 정적 멤버 변수와 같은 규칙을 적용받는다. 바깥 클래스가 생성되는 것과 상관없이 독립적으로 생성할 수 있다. public class OuterClass { static class StaticInnerClass {..
일반적으로 객체를 생성할 때 생성자를 통해 생성한다. CustomClass customClass = new CustomClass(); 정적 팩터리 메서드는 객체를 생성할 때 클래스 내부에 구현된 클래스 메서드로 자기 자신 객체를 반환하는 메서드이다. LocalDateTime을 예시로 살펴보자. LocalDateTime localDateTime = LocalDateTime.of(2022, 2, 24, 10, 26); 이처럼 객체를 생성할 때 of와 같은 이름을 가진 메서드로 클래스 메서드로 객체를 생성하는 것을 정적 팩터리 메서드라고 한다. 정적 팩터리 메서드를 사용하면 얻을 수 있는 이점은 다음과 같다. 1. 이름을 가질 수 있다. 단순히 매개변수나 생성자 자체만으로 반환된다면 객체의 특성을 제대로 설명..