객체는 인터페이스를 사용해서 참조하자. & 리플렉션?

객체는 인터페이스를 사용해서 참조하자.

인터페이스를 구현하고 인터페이스를 타입으로 사용할 수 있다. 이렇게 인터페이스를 타입으로 사용하면 매개변수로서, 반환 값으로서, 변수, 필드로서 유연성을 갖게 된다. 단, 인터페이스 규약 이외 기능을 제공하고, 코드가 이에 기대서 작동한다면 일관성이 무너져 코드가 실패할 가능성이 있다. 그럴 경우 해당 기능을 인터페이스에 기입하여, 필수 구현 항목으로 지정하는 것이 나을 수 있다.

물론 적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다. 혹은 클래스 기반으로 작성됐다면 어쩔 수 없다. 마지막으로 특정 클래스에 국한되어 특별한 기능을 제공한다면 인터페이스 타입을 포기할 수밖에 없다. 적합한 인터페이스가 없다면 클래스 계층 구조 중 필요한 기능을 만족하는 가장 덜 구체적인 클래스를 타입으로 사용하는게 좋다.

리플렉션?

리플렉션을 이용하면 컴파일 당시에 존재하지 않던 클래스도 이용할 수 있는데, 물론 단점이 있다.

  1. 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없다.
  2. 리플렉션을 이용하면 코드가 지저분하고 장황해진다.
  3. 성능이 떨어진다. (처음에만 느리다고들 한다.)

물론 리플렉션을 아주 제한된 형태로만 사용해야 장점만 취할 수 있다. 리플렉션은 인스턴스 생성에만 쓰고, 이렇게 만든 인스턴스는 인터페이스나 상위 클래스로 참조해서 사용하자.