티스토리 뷰
추상클래스 vs 인터페이스
추상클래스 | 인터페이스 |
객체를 생성할 수 없다. (인스턴스화 불가능) | |
상속받은 자식들은 부모의 추상메소드를 반드시 오버라이딩 해야한다. 추상메소드 : 구체적인 내용이 구현되지 않은 메소드 |
|
단일상속만 가능( extends로 상속 ) | 다중상속 가능 ( implements로 상속(구현) , 인터페이스 끼리의 상속가능 (extends) ) |
일반 메소드와 추상 메소드를 같이 사용할 수 있다. | 모든 메소드는 추상메소드 이다.(abstract생략가능) ( 자바 8 부터 default method로 구현이 가능하긴 하지만 일반적으로는 X) |
멤버변수 사용 가능 | 멤버변수는 반드시 public static final(생략가능) 이다. |
여러 클래스들의 공통분모를 뽑아 일반화 시키는 개념 | 상속받은 자식 클래스들이 같은 기능(특정한 메소드)을 가지도록 구현을 강제(설계도) |
상속을 받아 기능을 확장 시키는 관계(부모로부터 유전자를 물려받는다) | 필요에 따라 사교적으로 결합하는 관계 |
💡 추상클래스
세가지 클래스가 있다.
이 클래스들은 공통된 메소드를 가지고 있다.
또한 가족이라는 공통 요소가 있으므로 추상화 시킬 수 있다.
- 공통 요소들을 뽑아내서 Family 클래스를 만들어 상속을 사용했다.
- Family클래스는 직접 사용하기 위해 만든 클래스가 아니고 중복된 코드를 줄이고 다형성을 사용하기 위해 만든 클래스이다.
- say 메소드는 상속받은 각 클래스에서 오버라이딩 하여 사용할 목적이 있는 메소드이기 때문에 사실 Family 클래스의 say 메소드는 실행목적이 없는 코드이다.
- 또한 Brother 클래스를 새로 만들어 상속 받았지만 실수로 say 메소드를 오버라이딩 하지 않았을 경우에 say 메소드를 실행했을 때 원하지 않는 결과가 생길 수 있다.
이럴 때 추상 클래스를 사용할 수 있다.
- say 메소드는 상속 받는 각 클래스가 다르게 구현해야 하므로 추상 메소드로 만든다.
- myFamily 메소드는 공통적으로 사용하므로 일반 메소드로 만든다.
- Family 클래스는 추상클래스 이므로 객체생성이 불가능하다.
-> 상속에 의해서만 사용된다.
- say 메소드는 추상메소드 이므로 상속받은 자식 클래스에서 반드시 오버라이딩 하지 않으면 오류가 난다.
-> 구현하지 않는 실수를 없앤다.
💡 인터페이스
- 어떤 기능을 추가하고 싶다. 여러 사람이 개발을 한다면 사람마다 생각이 달라 구현내용이 다를 수 있다.
- 어떤 기능을 구현하려면 반드시 이 설계도 대로 만들어! 라고 약속하는 것과 같다.
- 이 설계도대로 구현을 하면 누가 구현하더라도 같은 기능을 가지게 된다.
- 학생 인터페이스를 상속받았을 경우에 반드시 study 메소드를 오버라이딩 해야한다. ( 인터페이스의 메소드는 모두 추상메소드 이기 때문에 )
- 즉, 학생 인터페이스를 상속받은 클래스의 경우 설계한대로 study 메소드를 실행할 수 있다는 확신이 있다.
💡 인터페이스는 다중상속이 가능한 이유?
다중상속이 문제가 되는 경우
- 다중 상속을 받았을 때 각 부모클래스에 같은 메소드가 있다.
- 자식클래스에서 오버라이딩 하지 않는다면 컴파일시 어느 부모클래스의 메소드를 사용해야 하는지 알 수 없다.
- 자식클래스에서 오버라이딩 한다면 실행은 자식클래스의 메소드가 실행되므로 문제가 없지만 자바에서는 다중 상속 자체를 못하게 제한되어있다.
추상메소드를 사용하면 반드시 오버라이딩 해야하므로 이 문제를 해결할 수 있다.
- 추상메소드를 사용했지만 여전히 오류가 난다.
- 추상클래스는 일반메소드와 추상메소드를 모두 사용 가능하기 때문에 100% 확신을 할 수 없다.
- 그렇기 때문에 자바에서는 추상클래스도 다중상속이 불가능하다.
- 인터페이스는 부모인터페이스에 같은 메소드가 있더라도 모든 메소드가 추상메소드로 구성되어 있기 때문에 반드시 오버라이딩 해야 하기 때문에 다중 상속이 가능하다.
추상클래스는 여러 클래스의 공통점을 추상화 시켜 상속하여 기능 확장의 목적이 있고 (각 클래스 끼리의 연관성이 높다.)
인터페이스는 상속받은 클래스들이 같은 기능을 하도록 보장하기 위한 설계도의 목적이 있다. ( 각 클래스 끼리의 연관성이 적다 )
참고
'뉴비의 시선' 카테고리의 다른 글
RSA 암호시스템 (0) | 2020.12.17 |
---|---|
REST? REST API? (0) | 2020.12.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- SQL
- mapreduce
- hadoop
- JSON
- I/O Services of OS
- I/O Mechanisms
- gradle
- linux
- RAID Architecture
- springboot
- Java
- 빅데이터 플랫폼
- oracle
- SPARK
- Free space management
- Flume
- maven
- jdbc
- Replacement Strategies
- Disk Scheduling
- Variable allocation
- 빅데이터
- vmware
- Allocation methods
- Spring
- File Protection
- HDFS
- aop
- Disk System
- 하둡
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함