
자바에서 인터페이스는 다형성을 구현하고 구현 클래스들 간의 일관된 동작을 보장하기 위한 중요한 개념입니다. 인터페이스는 구현해야 할 동작을 정의하는 계약 역할을 하며, 이를 통해 클래스가 반드시 구현해야 하는 메서드들을 명시합니다. 인터페이스를 사용함으로써, 우리는 클래스의 구체적인 코드를 보지 않고도 어떤 메서드들이 반드시 포함되어야 하는지 파악할 수 있습니다.
인터페이스, 동작을 위한 계약서
따라서, 인터페이스는 구현해야 할 동작을 명시하는 것에 그 목적이 있으며, 구체적인 동작을 정의하는 것이 아니라 동작을 위한 계약을 제시합니다. 이 계약은 구현 클래스들이 반드시 따라야 하는 규칙을 제공하며, 그 내용이 메서드 시그니처에 해당합니다. 즉, 인터페이스는 어떤 메서드들이 존재해야 한다는 것을 정의하는 데 집중합니다.
이처럼 인터페이스는 동작을 규명하는 역할을 하며, 클래스에 있는 변수와는 달리 상수를 정의하는 데 적합합니다. 왜냐하면, 변수는 객체의 상태를 변화시키며, 동적으로 값을 변경하는 특성을 가지고 있기 때문입니다. 반면에, 상수는 불변의 값을 갖기 때문에 여러 클래스가 동일한 값을 공유하면서 일관성을 유지할 수 있도록 해줍니다.
인터페이스에서 상수 필드만을 정의할 수 있도록 제한하는 이유는, 인터페이스의 핵심 역할이 "구현해야 할 동작"을 정의하는 계약이기 때문입니다. 인터페이스는 구현에 대한 구체적인 내용을 다루는 것이 아니라, 어떤 메서드들이 존재해야 한다는 것을 명시하는 역할을 합니다. 이는 인터페이스의 주된 목적이 동작을 정의하는 것이지, 객체 상태를 관리하거나 동적으로 변하는 값을 관리하는 것이 아님을 뜻합니다.
따라서 인터페이스에서 상수만 정의할 수 있도록 하는 이유는 동작의 일관성을 유지하기 위함입니다. 상수는 변경되지 않는 값을 의미하므로, 모든 클래스가 동일한 값을 사용하게 하고, 이 값이 일관되게 유지되도록 보장합니다. 반면, 변수나 동적으로 변하는 값을 관리하는 것은 인터페이스의 목적에 맞지 않기 때문에 허용되지 않습니다
상수 필드의 중요성
public static final이 반드시 붙는 이유
터페이스에서 상수 필드는 반드시 public static final로 정의되며, 이 세 가지 키워드는 인터페이스 내에서 정의된 상수의 특성을 명확히 합니다.
public : 인터페이스는 다양한 클래스에서 구현될 수 있기 때문에, 인터페이스에서 정의된 상수는 어디서나 접근 가능해야 합니다. 즉, 상수는 공용으로 제공되어야 하므로 public으로 정의됩니다. 이를 통해 어떤 클래스에서든 동일한 상수 값을 사용할 수 있도록 합니다.
static: 상수는 클래스 레벨에서 공유되는 값이어야 하므로, static으로 선언됩니다. 즉, 상수 값은 클래스의 인스턴스에 종속되지 않고, 클래스 자체에서 공유되며 모든 객체가 동일한 값을 사용할 수 있도록 해야 합니다.
final: 상수는 불변이어야 합니다. final 키워드를 사용하여 값이 변경되지 않도록 보장합니다. 이로써 상수는 값이 고정되어, 여러 클래스에서 일관되게 사용할 수 있는 값을 제공하도록 보장해야 합니다.
따라서 public static final은 상수가 일관되게 유지되고, 프로그램 전반에서 안전하게 사용할 수 있도록 보장하는 역할을 하게 됩니다.
클래스와 인터페이스는 기능적으로 생각해보면 차이점이 크지만, 개념적으로 생각해보면 둘 다 추상화된 개념을 정의하고 설계하는 기능을 수행합니다. 그러나 둘의 큰 차이점은 목적에 있습니다.
주 목적에 따른 클래스와 인터페이스 비교
결론적으로 인터페이스는 서로 다른 클래스들이 공통된 메서드를 사용하도록 하여 일관성을 유지하게 만들어야 하므로, 변경 불가능한 값을 모든 구현 클래스에서 동일하게 공유하여 일관성을 보장하기 위해 상수 필드만을 정의할 수 있도록 하는 것입니다. 상수는 값이 고정되어야 하며, 모든 클래스에서 동일한 값을 사용할 수 있도록 보장하는 역할을 합니다. 이를 위해 public static final의 키워드를 필수적으로 사용하여, 상수 값의 일관성과 불변성을 유지하게 됩니다.
따라서 인터페이스는 동작의 규칙을 제시하고, 상수는 일관된 값을 공유할 수 있도록 하여, 프로그램의 안정성과 일관성을 유지하는 중요한 역할을 합니다. 클래스와 인터페이스는 각자의 역할에 맞춰 상호보완적으로 사용되며, 이를 통해 효율적이고 확장 가능한 시스템을 설계할 수 있습니다.