-
내가 생각하는 추상클래스와 인터페이스의 차이PROGRAMMING/JAVA 2022. 12. 12. 03:22
1. 객체지향 프로그래밍
객체란 존재하는 모든 것. 핸드폰이라고 한다면 액정, 스피커, 케이스, 색상 등의 상태가 있고, 켠다(); 끈다(); 캡쳐한다(); 등의 행동을 가진다. 객체지향 프로그래밍이란 이 객체들의 관계를 통해 프로그래밍(설계) 하는 것이다. 여러 포스팅을 찾아보면서 실생활과 밀접한 프로그래밍이라고 느꼈다.
2. 추상화
2-1. 기능 추상화
사용자에게 내부 로직을 숨기는 것이다. 예를 들어, 핸드폰에서 어플을 사용한다면 우리는 어플이 어떻게 작동하는지에 대해 관심이 없다. 알람 기능을 누르면 알람이 생성되지만 어떤 로직으로 이루어지는지는 알 수 없다. 프로그래밍 역시 마찬가지이다. Map, List 등을 사용할 때 뒤의 로직이 어떻게 돌아가는지는 알지 않는다. 기능을 사용할 뿐이다. 이처럼 사용자에게 내부 로직을 숨기고 생각없이 사용하게 만들어 결과값만 받고 끝내는 것을 기능 추상화라고 한다.
2-1. 데이터 추상화
공통 속성을 묶는 것이다. 갤럭시 Z플립은 스마트폰에 속하고, 스마트폰은 이동기기에 속하고, 이동기기는 전자기기에 속한다. 카테고리도 어떻게 보면 추상화가 아닐까?
3. 상속
일반 클래스를 상속받으면 부모클래스 메소드 구현이 필수가 아니다.
추상클래스 인터페이스 extends implements 클래스이다. 클래스가 아니다. 부모 자식 관계이다.
스마트폰 - 이동기기 - 전자기기형제 관계이다. 자유로운 추상화?
기타, 축구 - play();공통된 속성을 가진다. 공통된 기능을 가진다. is a 관계이다.
human is a animalhas a / able 관계이다.
human has a swim ability
human is swimable자식 클래스의 구현 부담을 줄이기 위해 사용한다.
어느 정도 구현이 되어있다(?).
자신의 기능을 하위 클래스로 확장시킨다.해당 인터페이스를 사용하는 클래스들에게 기능의 사용법을 통일하기 위해 사용한다.
정의된 메소드들을 각 클래스의 기능에 맞게 사용한다.한 클래스에 하나의 상속만 가능하다. 한 클래스에 여러 확장(implement)가 가능하다. 미리 논리적인 클래스 상속 구조를 만들어 놓고 사용하겠다! 그때 그때 필요에 따라 구현해서 자유롭게 사용하겠다! 인스턴스를 만들 수 없다.
생성된 메소드를 반드시 자식 클래스가 정의해야 한다.예시:
추상클래스 - 동물은 움직이고 먹고 숨쉰다.
인터페이스 - 수영이 가능한
고릴라는 움직이고 먹고 숨쉬고 우우 하고 운다.
거북이는 움직이고 먹고 숨쉬고 헤엄친다.
인간은 움직이고 먹고 숨쉬고 헤엄치고 글을 적는다.
고릴라, 거북이, 인간 is a animal
거북이, 인간 has a swim ability추상클래스 운동 {
}
추상클래스 악기 {
}
인터페이스 play {
play();
}
수영 추상클래스 운동 {
play(수영하기);
}
피아노 추상클래스 악기 {
play(연주하기);
}
남은 궁금증
그래서 실제 현업에서는(현업이 아니더라도 이걸 사용하는 프로젝트에서는) 어떻게 사용할까?
둘 중 권장되거나 지양되는 게 있을까?
그래서 이걸 어떻게 써야 잘 쓰는 걸까?
[ 유데미 - 초보자를 위한 자바 프로그래밍 강의에서 요약한 것 ]
추상클래스 인터페이스 abstract라는 키워드로 시작한다. 콘솔이 있다고 할 때, 버튼들은 인터페이스이다. 버튼에 기능을 적용하는 것은 게임들의 몫이다. 정의나 형태가 없다. 호출 가능한 문법만 가지고 있다. 사용자가 추상메소드를 정의해야 한다. 추상메소드가 없더라도 추상클래스를 만들 수는 있다. (굳이?) 추상클래스를 연장하려면 추상메소드를 정의하거나, 상속한 클래스를 추상클래스로 변경해야 한다. 비추상형 메소드를 추상 클래스 안에 가질 수 있다.
오키의 설명
- 자바의 컬렉션 프레임워크를 보자. Map이라는 자료구조가 있다. 이 클래스는 Map의 일종이다(이 클래스의 특징은 Map 타입이라는 거다)라는 것을 나타내기 위해 Map interface가 있다. Map은 key, value를 put하거나 get하는 행위가 있으므로, 이 동작을 구현해야 한다고 Map interface에 정의되어 있다.
- Map마다 항상 동일한 동작을 하는 경우가 있을 것이다. 예를 들어, Map이 비어있는지 확인하는 법은 size == 0 이라고 하면 된다. 이런 공통된 작업을 미리 구현해서 추상 클래스로 만들고, 이 추상클래스를 상속받아 구현 클래스를 만들고, 꼭 구현해야 하는 클래스를 구현 클래스에서 구현한다. 추상클래스에서 구현되지 않은 걸 구현하는 건, 클래스를 확장해서(extends) 구현하는 것으로 볼 수 있다.
-HashMap 클래스를 살펴보면, 공통 코딩을 피하기 위해 AbstractMap을 상속받아서 구현하며, AbstractMap 안에는 isEmpty() 메서드가 이미 구현되어 있다. AbstractMap는 Map 인터페이스를 구현하고 있기에, AbstractMap을 확장한 클래스는 결국 Map이라는 특징을 가지게 되는 것이다.
!!! AbstractMap을 확장한 클래스는 결국 Map이라는 특징을 가지게 되는 것이다. !!!
이 부분이 댓작성자님의 추상과 인터에 대한 생각이 드러나는 부분이다. 추상클래스를 '확장 extends' 하고, Map이라는 '특징 (interface)'을 가지게 된다. 이런 거구만 ...
맨 자식 클래스 HashMap은 추상map을 extends하고 Map, cloneable, Serializable을 implements한다. 
중간 자식 추상 클래스 AbstractMap 
대장 Map interface
출처
[JAVA] ☕ 인터페이스 vs 추상클래스 차이점 - 완벽 이해하기
인터페이스 vs 추상클래스 비교 이 글을 찾아보는 독자분들은 아마도 이미 인터페이스와 추상클래스 개념을 학습한 뒤에 이 둘에 대하여 차이의 모호함 때문에 방문 했겠지만, 그래도 다시한번
inpa.tistory.com
https://okky.kr/articles/651923
OKKY - 인터페이스랑 추상클래스의 차이점이 뭔가요..?????
1. 일단 인터페이스랑 추상클래스의 개념자체가 잘 안와요ㅠㅠ추상클래스랑 인터페이스 둘 다 '바디'라고 하는 내용이 없고, extends하든 implements를 하든 다른 클래스에서 바디 내용을 넣어줘야
okky.kr
를 보고 정리한 생각입니다!
'PROGRAMMING > JAVA' 카테고리의 다른 글
그러니까 ... bean이 ... jsp 빈이 ... spring 빈이 ... dto가 ... 뭐? (0) 2023.01.10 그래서 Servlet은 html페이지를 반환하는 건가? (0) 2023.01.05 Optional<T>란? (0) 2023.01.01 extends와 implements의 차이 : 인터페이스가 인터페이스를 extends하는 이유 (0) 2022.12.29 [ JAVA ] 내가 생각하는 직렬화. 왜 직렬화를 사용하는 걸까? (1) 2022.12.22