이번에는 공변과 불공변에 대해서 먼저 알아보고, 이후에 제네릭과 와일드카드에 대해 알아보도록 하겠습니다. 많은 분들이 어려워하는 제네릭인 만큼 쉽게 풀어서 설명하려고 노력했는데, 많은 도움이 되기를 바라겠습니다. 1. 공변과 불공변 [ 공변과 불공변 ] 제네릭과 와일드카드에 대해 이해하기 위해서 우리는 먼저 공변과 불공변에 대해 알아야 한다. 공변과 불공변은 각각 다음과 같다. 공변(covariant) : A가 B의 하위 타입일 때, T 가 T의 하위 타입이면 T는 공변 불공변(invariant) : A가 B의 하위 타입일 때, T 가 T의 하위 타입이 아니면 T는 불공변 대표적으로 배열은 공변이며, 제네릭은 불공변인데 이를 코드로 살펴보도록 하자. 예를 들어 배열의 요소들을 출력하는 메소드가 있다고 하..

최근에 Spring이 제공하는 유틸성 클래스는 모두 abstract로 선언되어 있는 것을 볼 수 있습니다. 아마 객체의 생성을 방지하기 위한 의도였을 것 같은데, 과연 추상 클래스나 인터페이스는 실제로 객체를 생성하는 것이 불가능한지 살펴보도록 하겠습니다. 1. 인터페이스와 추상 클래스는 진짜 객체 생성이 불가능한가? 익명 객체(Anonymous Object)로 객체 생성하기 [ 인터페이스와 추상 클래스는 진짜 객체 생성이 불가능한가? ] 예를 들어 다음과 같은 Animal 추상 클래스가 있다고 가정을 하자. public abstract class Animal { abstract void bark(); } 우리는 추상클래스에 대해 평소처럼 객체를 생성하려고 하면 에러가 발생하게 된다. 에러 내용을 분석해..

이번에는 private 메소드를 테스트하는 방법에 대해 알아보도록 하겠습니다. 미리 이 글의 결론을 말씀드리면 private 메소드를 테스트하면 안된다는 것입니다. private 메소드를 테스트하는 코드를 작성하는 것은 뭔가 좋지 못한 신호이므로 private 메소드의 테스트 코드를 작성하기 보다는 현재 코드 구조나 상태 등을 확인해볼 필요가 있습니다. 1. Private 메소드를 테스트하는 방법과 이를 지양해야 하는 이유 [ Private 메소드를 테스트하는 방법 ] 문제 코드 소개 예를 들어 이미 정의된 이름 목록이 있을 때, 이를 대문자로 변환하여 해당 입력값과 일치하면 그대로 값을 반환하고 일치하지 않으면 UUID를 생성하여 반환하는 다음과 같은 코드가 있다고 하자. @Service public ..

이번에는 자바 언어에서 부모 클래스의 메소드를 오버라이딩 할 때 더 큰 범위의 접근 제어자만 가능한 이유 또는 더 좁은 범위로 변경할 수 없는 이유에 대해 알아보도록 하겠습니다. 기본적이지만 상당히 중요한 내용인만큼 꼭 이해를 하고 넘어가면 좋을 것 같습니다! 1. 부모 클래스의 메소드 오버라이딩이 더 큰 범위의 접근 제어자만 가능한 이유 or 더 좁은 범위로 변경할 수 없는 이유 [ 예시 코드로 상황 소개 ] 예를 들어 다음과 같은 Animal 클래스와 protected로 선언된 bark 메소드가 있다고 하자. public class Animal { public void bark() { System.out.println("동물이 짖는다."); } } 그리고 Animal 클래스를 상속받는 Dog 클래스가..

이번에는 오랜만에 자바 문법을 살펴보고자 합니다. Java7부터는 기존의 try-catch를 개선한 try-with-resources가 도입되었는데, 왜 try-catch가 아닌 try-with-resources를 사용해야 하는지, 어떻게 사용하는지 알아보도록 하겠습니다. 1. try-with-resources란? try-with-resources 사용법 예시 [ try-with-resources란? try-with-resources 사용법 예시 ] try-with-resources를 살펴보기 전에 try-catch-finally로 자원을 반납하는 경우를 먼저 살펴보도록 하자. 두 가지를 모두 보고 비교함으로써 왜 try-with-resources를 사용해야 하는지 더욱 납득할 수 있을 것이다. Java..