2025.01.14(화) 22일차 / instanceof 와 interface
1. instanceof
Java에서 instanceof 연산자는 객체가 특정 클래스의 인스턴스인지, 또는 특정 클래스를 상속받거나 구현했는지 여부를 확인할 때 사용됩니다. 이 연산자는 boolean 값을 반환하며, 객체의 타입을 비교할 때 유용합니다.
1-1 . 특징
- 객체 타입 확인 : 객체가 지정된 클래스의 인스턴스인지 확인합니다.
- 상속 관계 확인 : 객체가 지정된 클래스의 하위 클래스인지 확인할 수 있습니다.
- 인터페이스 구현 확인 : 객체가 특정 인터페이스를 구현했는지 확인할 수 있습니다.
-> 지금까지 학원에서 배웠던 개념들은 instanceof 를 통해 확인 가능합니다.
1-2. 예시
예시를 보시면 Animal 이라는 클래스가 생성됐고, 그 아래에 Dog라는 클래스를 생성하는데 이때 Animal 이라는 클래스를 상속받습니다. main 함수에서는 animal 이라는 객체를 만들었고, 이 animal 이라는 객체는 Animal 이라는 클래스를 참조변수로 정했고, 메모리의 값은 Dog의 메모리 값을 반환받았습니다. 이 구문은 어제 우리가 공부했던 "다형성" 의 예시입니다.
이제 instanceof 구문을 확인해보겠습니다. 위에 적었던 것 처럼 instanceof 는 boolean 으로, true 와 false 를 반환한다고 했죠? 첫번째 출력문을 확인해보면 앞에 있는 animal 이라는 객체가 뒤에 있는 Dog 라는 클래스의 인스턴스인지 확인하는 출력문입니다. 예시 처럼 instanceof 앞에는 궁금한 객체를 적고, 연산자 뒤에는 비교하고자 하는 클래스명을 적습니다.
이후에는 연산자가 두개의 값들을 비교해서 인스턴스가 맞다면 true 를 반환하고, 아니라면 false를 반환하게 됩니다.
아래의 두 출력문은 animal 이 Dog 의 객체가 맞기 때문에 true 가 반환되고, Dog 는 Animal 을 상속 받았기 때문에 아래 출력문 또한 true 가 반환되게 됩니다.
2. interface
자바의 interface는 클래스가 반드시 구현해야 할 메소드의 청사진을 정의하는데 사용되는 특별한 타입입니다. 객체의 행동, 메소드를 지정하기 위해 사용되며, 이를 통해 다형성과 코드의 유연성을 높일 수 있습니다. 자꾸 다형성이 나옵니다..
2-1. 특징
- 인터페이스는 추상 메소드(구현되지 않은 메소드)만 포함 됩니다.
- 인터페이스 내의 변수는 자동으로 public static false(상수)로 간주됩니다. (해당 부분 생략 가능합니다.)
- 클래스는 implements 키워드를 사용하여 인터페이스를 구현합니다.
- 한 클래스가 여러 인터페이스를 구현할 수 있습니다.
- 클래스는 다중 상속이 불가능 하지만, 인터페이스는 다중 상속이 가능합니다.
- 인터페이스를 통해 클래스의 동작을 통일하고 다형성을 구현할 수 있습니다.
2-2 정의 및 구현
인터페이스의 기본적인 예시입니다. 위에서 적은 것 처럼 추상 메소드를 적었습니다. 메소드인데 안에 내용이 하나도 없죠? 우리는 이 메소드를 다른 클래스에서 호출받아서 직접 수정해볼겁니다.
Dog와 Cat 클래스를 Animal 이라는 인터페이스에 구현시킨 모습입니다. 위에 sound() 메소드는 추상 메소드이기 때문에, 안에 기능이 아무것도 없죠? 그래서 우리는 가져온 메소드에 출력문이라는 기능을 추가했습니다.
이제 해당 메소드를 불러올 차례입니다. 마찬가지로 dog 라는 객체를 Dog 메모리에서 불러왔습니다. 각 객체는 위에 올려놓은 Animal 이라는 인터페이스를 구현하기 때문에, Animal 안에 있는 sound 와 eat 메소드를 사용할 수 있게 되는 것 입니다.
그렇다면 상속이 있는데 굳이 인터페이스를 사용해야 할까요?
실제로 인터페이스와 상속은 몇가지 유사한 점이 있지만, 용도와 목적에서 큰 차이가 있습니다.
1. 행동의 표준화와 강제
- 인터페이스는 여러 클래스가 동일한 행동을 공유하도록 강제할 수 있습니다.
2. 다중 상속
- 자바는 단일상속만 가능하지만, 인터페이스는 여러개를 구현할 수 있습니다.
3. 유연한 설계
- 인터페이스를 사용하면 코드의 유연성이 증가하고, 의존성을 줄일 수 있습니다.
extends(상속)은 속성과 메소드의 공유를 위한 방법이고, implememts (인터페이스 구현)은 구체적인 행동을 강제하게 하는 방식입니다.