인터페이스랑 클래스 겁나 헷갈리네..

김성수·2023년 4월 25일
0

자바

목록 보기
5/5

나는 어차피 잘 될 사람이다.

어차피 잘 될 것이고, 지금도 잘 되고있고, 과거도 잘 되어왔기에,,,


그냥 호기심에 겁나 찾고 찾고 찾다보니깐 나름 내린 결론이 있다.

인터페이스가 클래스로 볼 수 있는가 없는가...

결론 : 둘은 엄연히 다르다.

함 드가보자..

package hello;

public interface I {

}
package hello;

public class A implements I {

    public static void nullll() {
        System.out.println("..");
    }
}

위에처럼 아무것도 없는 인터페이스 I를 구현한 A 클래스가 있다고 가정해보자... 처음에 인터페이스를 클래스로 봐도되는지 아닌지 의문이었다....

멀지않은 최근에 인터페이스_타입 참조변수 = null; 을 주고, 그 참조변수에 .을 찍고 인텔리제이가 알려주는 호출 가능 메서드들을 봤는데, 죄다 Object 클래스의 메서드들이었다.

I i = null;
i.

이런 식으로 나오는데, 죄다 Object의 클래스이다.

그래서 인터페이스가 Object를 상속받는 줄 알았다...

근데 개뿔이었다...

null 값을 넣고, Object의 클래스의 메서드를 호출할 수 있는 거 보고, "인터페이스가 Object를 상속받구나~" 하고 있었는데,,, 개뿔이다....

null값을 주고 i.을 하고 Object 클래스의 메서드들을 호출하는 코드를 작성할 수 있는 이유는 이 글에서 알 수 있는데 참조형의 기본 값null때문이다.

그리고 끄적이면서 당장 말하고 싶었지만 할 말이 많아서 지금하는데;; 메서드의 호출결과는 당연히 NPE(NullPointerException)이다.

사실 이거 "인터페이스가 Object를 상속받구나~" 하고 넘겼다가, 스프링을 학습하면서 Bean을 getBean()메서드로 받아올 때,

ApplicationContext ac = new ~~~(AppConfig.class);
ac.getBean("memberService", MemberService.class);

뭐 여튼 이래 요래 받아올긴데, 여기 MemberService가 인터페이스이다. 근데 참 내가 착각했다.. MemberService.class로 되어있다고, 클래스로 본것이다..;;;

그리고 저번에 질문을 제기했다가 다른 분과 인터페이스에 대해서 대화를 살짝 나누게 되었다. 그리고 시간이 흘러 지금 느낀 개인적인 생각을 말하게 되었는데, 그 분이 나한테

"인터페이스타입 빈이 있는게 인터페이스를 클래스로 볼 수 있다는거랑 무슨 상관인가요….?"

이렇게 물어봤다..

그래서 null에 대해서 조금 조사해봤다.

생각해보니.... 맞네.. 뭔 상관이지...;;;

뭐 그러다가 ChatGpt한테 물어보려했는데, 갑자기 얘 먹통이길레;;;
BIng한테 물어봤다. 근데 Bing이 갑자기 null을 얘기하던 것이다.

물어본 내용은 대략 이런의미였다.
그냥 인터페이스 타입의 참조변수에 null을 줬는데, 어떻게 Object 클래스의 메서드를 호출하는 코드를 작성할 수 있냐고.. 그러니깐 null과 관련된 키워드를 줬다..
엥..? null을 왜..? 하면서 null에 대해 찾아보니 null은 참조형의 기본값이고, 키워드인데 얘는 원시타입의 값도 아니고, 그렇다고 객체도 아니다. 얘는 그냥 원시타입 빼고는 그냥 깡패다...

여기 보면, 모든 레퍼런스에 할당할 수 있다고한다.

그러니깐 인터페이스 타입의 참조변수에도 당연히 할당되었던것..
자바는 뭐 기본형 8개(boolean, char, byte, short, int, long, float, double) 빼고는 다 참조형이니께네...

심지어 형변환도 가능하다고 한다.

그리고 이 부분때문에, i.했을 때, Object의 메서드를 작성할 수 있었던 거 같다. 당연히 뭐.. 실행하면 NullPointerException은 당연히 봐야하고요~

여튼... 아 그래서 null 때문에 Object 클래스의 호출 메서드를 코드로 작성할 수 있던 거구나...

그러면, ac.getBean()에 들어가는 인터페이스 MemberService가 있다고 가정했을 때, MemberService.class에서 .class의 의미는 뭘까..? 하고 GPT한테 물어봤다.

확장자라도 하던데 그냥 해당 인터페이스 타입(클래스)를 나타낸다고 한다.

그냥 어떤 메서드를 작성할 때, 메서드의 반환타입으로 인터페이스를 주면 다형성에 의해서 그 인터페이스를 구현한 클래스를 반환타입으로 반환하는 것과 비슷(?) 아니 그냥 똑같다.

즉, MemberService.class 인터페이스를 구현한 클래스를 반환한다는 의미이다. (뭐 이게 싱글톤이고 어쩌고 저쩌고겠지만..)

그리고 결정적인 것은... 타입.class를 하면 실제 클래스 정보가 나온다. 그래서 아까 만들었다고 했던 인터페이스 I, 그 인터페이스를 구현한 A를 각각 아래와 같이 확인해봤다.

        System.out.println("I.class = " + I.class); // I는 인터페이스
        System.out.println("A.class = " + A.class); // A는 인터페이스 I를 구현한 구현체

이 코드를 실행하고, 그리고 인터페이스와 클래스가 다르다는 것을 알려주는 결정적인 결과가 나왔다.

I(인터페이스)는 인터페이스라고 나오고,
클래스는 클래스라고 딱 나온다..

여하튼 뭐 좀 어째저쨰 얘기를 풀어해봤는데,
다시 하지만,

결론

클래스와 인터페이스는 그냥 다른 거다.

하... 할거 많은데 갑자기 여기에 꽂혀버렸네...;;;
할 게 수두루한데...;;

여튼..


-끝-


<참고 블로그>
자바 Optional: 1. null은 무엇인가?
[Java] null 에 관한 9 가지 사실

profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

1개의 댓글

comment-user-thumbnail
2023년 5월 3일

너무 잘봤습니다. 인터페이스와 클래스의 차이에 대해 명확히 알게 되었어요! 정말 좋은 정보 감사합니다

답글 달기