Wanna be Brilliant Full-Stack Developer

자바 객체지향 프로그래밍 인터페이스와 추상클래스의 차이 본문

Some Memos/Java

자바 객체지향 프로그래밍 인터페이스와 추상클래스의 차이

Flashpacker 2023. 3. 12. 23:13


@Overrid라고 붙어있는것은 주석과 비슷한건데 이거를 어노테이션이라고 부른다.

어노테이션은 JVM이 실행시에 분석해서 확인이라고 할 수 있는데

실행시에 분석시에 무엇을 확인하는가? 원숭이 클래스가 new가 되든지 메모리에 뜨면

그때에 Overrrid가 붙어있네? JVM이 실행시에 분석을 하여 부모에 채집이라는 메서드를 가지고 있는지

안있는지 확인을하고 안들고 있으면 오류가 뜬다.

어노테이션이 JVM의이 볼 수 있는 힌트같은 역할이라고 보면된다.

 

이 상태에서 모든 동물들에게 행위의 제약을 주고싶으면?

인터페이스라는걸 만들어보자! 

주위해야할것은 public,이나 abstract라는것을 안적어도 생략이 되어있다.

제약을 Implements를 받을 수 있다. 

implements를 받기위해서는 class 앞에 abstract가 없으면 안된다.

없으면 오류가 뜨는데? MoveAble이 추상메서드를 4개 들고 있으니까 자식도 무조건 구현을 해줘야하는데

abstract가 붙어있으면 이 자식이 추상 클래스니까 추상메서드를 구현하지 않아도 된다.

 

온순한 동물과 사나운동물이 구현하지 않았으니 구현은 자식클래스로 위임이 된다.

 

이렇게 하나하나 다 구현하기 에는 너무 표현해야할것이 많다.

그래서 이렇게 안하고 사나운 동물에서 구현을 해주면 된다.

컨트롤 스페이스를 하여 

4가지를 다 구현을 하고 행동에 제약을 걸어준것이다.

이렇게 구현을 하면 사나운동물의 자식들은 다 오류가 뜬다.

근데 온순한 동물은 이 행위에 대한 제약을 다르게 주고 싶은것이다.

이 온순한동물은 사나운동물과 다르게 땅바닥숨기도 추가해보자!

그리고 온순한 동물이 다 구현을 하나 하나 하는것이 귀찮을 수 있다.

Tool이 지원을 해주는데 

저걸 클릭을하면 

이렇게 다 체크가 되어있는 화면이 뜬다.

OK하면 한번에 다 받을 수 있다.

이렇게 온순한도물은 행위의 제약이 5개 사나운동물은 4개가 있는데

이렇게 조이스틱으로 매개변수를 설정하여 구현을 해도 한번에 실행이 다 될 수 있다.

하지만 이렇게는 안된다. 

왜냐하면 조이스틱의 타입이 소로 되어있기 떄문이다.

그래서 여기다가 온순한동물이라고 넣으면 둘다 가능하다.

이거는 안된다. 호랑이는 온순한동물이 아니라 사나운동물이기 떄문이다!

이떄 오버로딩을 하면 된다.

오버로딩은 경우의 수가 많지 않은 경우에만 사용할 수 있다.

지금은 온순한 동물과 사나운동물 2가지의 케이스밖에 없다.

경우의수가 많을 수가 없다.

그러면 오버로딩을 하면 된다.

 

그런데 조이스틱의 타입을 원숭이라고 만 해놓으면 여러가지가 생기면 

아주 복잡해질 수 있기 떄문에 우리는 다형성을 이용해서 

타입을 일치시켜서 동적바인딩을 한것이다!

그러면 공격도 해보자!

이렇게 프로그램을 짜는것이 좋다!

이렇게 짜지 않으면 프로그램이 나중에 굉장히 복잡해질 수 있다.

이런 인터페이스를 행동의 제약이아로 한다.

 

자 내가 말을 한마리 만들어보라고 신입에게 시켰다.

말은 온순한동물이니까 애를 상속해서 만들어라고 하면

이렇게 쉽게 만들 수 있고 마우스 우클릭 하면 

이렇게 하면 끝이다.

이렇게 해주면 오버로딩 되었으니까 u5는 

애를 호출을 하고 채집이 실행되면 

애가 실행되었다가? 동적바인딩이 되어서 자식이 채집메서드를 똑같이 가지고 있으니까

부모의 메서드가 무효화가 되서 실행이 된다.

이렇게 편안하게 유지보수가 쉽도록 프로그램을 구현할 수 있다.

 

사나운동물에게 냄새맡기라는 행위를 하나 더주 고싶다면?

자식 클래스에게 직접 구현을 해버리면?!

자식에게는 구현이 되는데 신입이 사나운동물을 나중에 하나 더 구현을 하게될때 

냄새맡기가 뜨지를 않는다.

냄새맡기를 왜 뜨지 않는가? 부모 사나운동물이 냄새맡기를 가지고 있지 않기 떄문이다.

 

두번째 문제는 이렇게 구현을 해버리면 신입한테 사나운동물 중에 하이에나를 하나 만들어볼래?

상속은 사나운동물을 해 라고 해버리면? 

이렇게 해버리면 이 하이에나는 냄새맡기를 가지고 있지 않기 떄문에 저렇게 만들면 안된다.

그래서 행위에 대한 제약을 사나운동물을 인터페이스에 추가해서 행동을 추가 제약할 수 있다.

 

근데 자식이 다 추가해야할때 각자 다른방식으로 냄새를 맡는다고 하면? 

냄새 맡을때에 대한 자식들이 각자 다르니까 사나운동물이 미리 구현을 못한다.


그리하여 정리를 하면! 추상클래스는 미완성된 설계도이다.

그래서 행위는 미완성된 설계도에대해서 구체적인 행위는 자식들이 정한다.

어떤 행위에대한 제약을 주고 싶으면? 

그 행위대한 제약은 인터페이스가 한다!

인터페이스는 무엇인가? 행동에 대한 제약이고

추상클래스는 미완성된 설계도이다!