Wanna be Brilliant Full-Stack Developer

자바 객체지향프로그래밍 추상 클래스 본문

Some Memos/Java

자바 객체지향프로그래밍 추상 클래스

Flashpacker 2023. 3. 6. 23:02


추상클래스란? 추상적인 클래스라는것이다.

특징이 하나있다. new 할 수 없다, 메모리에 띄울수 없다.

예를 들어 의자와 침대가 있는데 의자와 침대는 이세상에 존재할 수 있고

이 두개를 묶어서 가구가 있는데 가구는 이세상에 존재할 수 없다. 

의자와 침대는 New해서 세상에 던져질 수 있는데 가구는 New를 못한다.

왜냐하면 가구는 이세상에 존재하지 않기 때문이다. 

 

이렇게 만들면 부모가 가지고 있는 메서드를 자식이 있는데 또 만들었으면 오버라이드라고 했다.

Animal의 speak()가 무효화가 된다.

 

강아지와 고양이가 있는데 Animal로 추상화를 했다.

그리고나서 Animal이 speak를 가지고 있고 고양이도 강아지도 speak()를 가지고 있으면

Animal이 가지고 있는 speak()가 무효화가 된다. 

new Dog()를 하면 메모리에 두개가 뜬다. Animal과 Dog가 뜬다.

Animal가 Dog를 둘다 하나씩 바라보게 할 수 있다. 다형성이기 떄문이다. 

둘다 speak()를 가지고 있으면 부모의 speak()가 무효화가 된다. 

그래서 a.speak()를 호출을 하면 animal의 speak를 갔다가 무효화를 했으니까 

Dog의 speak()가 떄려지는데 이것을 동적바인딩이라고 한다!

동적바인딩은 Animal speak을 찾아갔다가 Dog가 때려지는것을 동적바인딩이라고한다. 

 

\

근데 이렇게 부모클래스의 메서드를 주석시키면 

둘다 오류가 생긴다. 왜냐하면 Animal자체가 speak()를 안들고 있으니까 오버라이드가 안되고

동적바인딩이 안되기 떄문이다.

 

Animal의 speak()는 { } 가 비워있어도 상관없다. 어차피 동적바인딩을 하여 자식의 메서드가

실행이 될것이기 떄문이다.

이럴때는 abstract 을 앞에 붙일 수 있는데? 추상클래스라는뜻이다.

그대신 이걸 붙이면 

여기서 추상적인 존재로 Animal을 만들 수 없다고 오류가 나온다. 

이 메서드도 이렇게 만드는것이 아니라 

이렇게 되면 메서드가 추상메서드가 된다. 몸체가 없다. 몸체가 없다는것은

중괄호{ }  부분이 없다는 것이다. 

어차피 중괄호부분은 필요없다 실행될 일이 없으니까!

 

이렇게 하고 신입한테 일을 시켜보자!

신입아 Bird를 만들어!! , Animal을 상속해서 만들어!!

그리고 애는 sysout해서 쨲쨲!! 하게만들라고 하면 

이렇게하면 오류가 나온다. Bird라는 애는 무조건 부모의 speak라는 메서드를 구현하라는 뜻이 가지고 있다.

강제성이 있다! 구현하지 않으면 오류가 뜬다! 

자세히 보면 밑에 Add unImplemented methods가 나온다. 신입 입장에서 보면 

이렇게 튀어나오니까 speak() 여기에다가 sysout을 적으면 되겠다라는 생각이 든다! 

그러면 한번 해보자! 

팀장에게 질문할필요도 없이 자동으로 구현하게 되니까!

추상메서드를 부모가 만들게 되면 자식은 이 추상메서드를 반드시 구현해야하는 강제성이 생긴다!

이렇게 하면 함수 이름을 맘대로 바꿀수 없게 된다.

이떄 사용하는게 추상 클래스이다! 

추상적인것이다. Dog랑 Cat을 묶어주는 추상적인것이다.

추상 메서드는 추상적인 동물은 speak()를 볼떄 Animal의 입장에서 보면 speak()라고 할때

멍멍, 야옹, 쨱짹을 해야할지 동물 입장에서는 모른다.

그래서 speak()를 추상메서드로 만들어서 나는 모르겠으니까 자식들이 직접 내부를 구현하라고 말할 수 있는데

이것이 추상 클래스이다.

 

추상클래스로 만들면 훨씬 프로그램이 좋아진다!

 

추상클래스는 하나의 특징을 가지고 있는데 몸체를 가지고 있는 어떤 메서드도 만들 수 있다.

그대신 추상메서드로 만든것은 무조건 자식들이 구현을 해야한다.

근데 만약에 저기 앞에도 추상메서드를 붙이게 되면 오류가 나온다.

왜냐하면 추상메서드는 내부가 있으면 안되기 떄문이다.

만약에 추상메서드를 또 붙이게 되면 자식들이 오류가 난다.

왜냐하면 추상메서드를 가지고 있다는것은
자식 클래스 애들도 그 메서드를 가지고 있어야 된다는 뜻이기 떄문이다! 

 


추상클래스에 대해 조금더 깊게 공부를 해보자!

추상클래스는 미완성 설계도이다! 이게 도대체 무슨 뜻일까?

 

예를 들어 육식동물이 있다고 하면 이건 추상적이다.

육식동물중에 뱀이 있고 사자가 있다. 그리고 상속을 한다 그러면 타입이 일치가 된다.

뱀도 육식동물이고 사자도 육식동물이기 떄문이다.

그래서 육식동물 입장에서 공격이라는 메서드를 하나 만들것이다.

근데 애 입장에서는 공격이라는 메소드를 만들때 내부를 정의하기에는 조금 어렵다.

육식동물 중에 뱀은 공격을 독으로 하고,사자는 이빨로 한다.

공격하는 방식이 조금 다르기때문에 육식동물 입장에서는 공격을 구현할 수 없고 추상적으로밖에 만들수밖에 없다. 

그래서 미완성 설계도이다. 타입을 일치 시키고 미완성 설계도를 만든것이다.

둘다 뱀이라는 사자는 둘다 걸을 수 있다. 그래서 걷기라는 메서드를 만들었다. 

걷기는 둘다 완성 할 수 있다. 그래서 sysout해서 걷다 라고 정의 할 수 있다. 왜냐하면 둘다 걸으니까 

 

미완성 설계도란 무엇인가?

완성을 못하는것이다. 추상적인애가 있다는것이다.

추상 메서드가 있으면 미완성 설계도라는 것이다.

자식이 완성해야되는 공격이라는게 생겼기 때문이다.

추상클래스는 이런것이다.

걷기는 둘다 가능하지만 공격은 둘다 방식이 다르기떄문에 void로 만들어야한다.

그래서 미완성 설계도 이다.

누구한테 위임하는가? 자식한테 위임이다. 너희 둘다 공격의 방식이 다르니까

자식이 직접 만들라는것이다. 

마우스 올려서 오버라이드 해서 오버라이드 했으니까 부모의 메서드는 무효가 되고

뱀은 독으로 공격 

사자는 이빨로 공격

공격하는 부분만 다르니까 그부분만 미완성(추상) 으로 만들고 

자식한테 위임을 하는것이다.

그래서 실제로 u1.공격을 하면 u1은 육식동물이니까 부모의 공격 추상 메서드에 갔다가 

애가 자식이 들고 있으니까 무효화가 되고 자식 메서드가 실행 되는것이

동적 바인딩이다.