오늘은 extends와 implements에 대해 공부해 보았다.
두 개의 역할이 정확히 어떤지 몰랐는데 이번의 계기로 인해 알게 되었다.
일단
extends는 상속시키는 것인데,
대충 A extends B를 하면 A는 B를 상속해 +a 하는 것이다.
(extends는 일반 클래스와 abstract 클래스 상속)
즉 B에 있는 모든 것을 사용할 필요는 없다는 것.
하지만 implements는 B에 있는 기능을 모두 사용해야 한다.
(implement는 interface 상속)
예를 들어 보자
extends:
public class test {
public static void main(String[] args) {
testpaper sc = new testpaper();
System.out.println(sc.math);
System.out.println(sc.eng);
System.out.println(sc.kor);
sc.test_result();
}
}
class score{
protected int math = 60;
protected int kor = 21;
protected int eng = 100;
protected int result = math + kor + eng;
public int test_result(){
return result;
}
}
class testpaper extends score{
public void print(){
System.out.println(result);
}
}
일단 extends는 오버 라이딩을 할 필요가 없다.
위의 작성한 코드를 보면 testpaper가 score를 extends를 이용해 상속을 받았지만, result만 사용하였다.
그리고 main을 보면 testpaper가 score상속을 받았기에 score에 있는 test_result의 메서드를 접근할 수 있는 걸 볼 수 있다.
또 자바에서는 다중 상속을 지원하지 않는다고 한다. 대충
public class A extends B, C {...}
이런 식으로 짜는 것이 안된다는 것이다.
대신 인터페이스인 implements가 나온 것이라고 한다.
implements:
public class Interface {
public static void main(String[] args) {
ExampleInterface in = new ExampleInterface();
in.num1();
in.num2();
}
}
interface testInterface{
public static int num = 12;
public void num1();
public void num2();
}
class ExampleInterface implements testInterface{
@Override
public void num1() {
System.out.println(num);
}
@Override
public void num2() {
System.out.println(num + 2);
}
}
위의 코드를 보면 ExampleInterface에서 interface인 testInterface를 implements 해 재정의를 하였다.
이렇게 implements는 무조건 부모의 메서드를 재정의(오버 라이딩)을 해야 한다.
물론
@Override
public void num2() {
}
이렇게 비워놔도 된다.
또 implements는 다중 상속을 지원한다.
public class A implement B, C {...}
이 코드를 지원한다는 뜻이다.
근데 "이러한 구현은 메서드를 어차피 재정의해야 되니 '상속'의 의미가 아니지 않냐?" 이런 질문이 생기는 사람도 있다고 한다. (물론 전 아닙니다.)
이 질문의 답으로는
Java와 C#의 인터페이스 상속은 계약 및 분류의 의미가 강하다고 하는데,
사실 그냥 자바가 상속이라 하니 상속인 것이라고 한다.
음 뭐 그렇다고 한다.
정리하자면
extends는 class + a(알파)이고
implements는 인터페이스 구현이다.
'언어 공부 > Java' 카테고리의 다른 글
[JAVA] 람다식의 개념과 사용법 (0) | 2021.10.07 |
---|---|
[JAVA] Replace(문자열 치환) 에 대하여 (0) | 2021.10.05 |
객체지향 프로그래밍 (0) | 2021.09.16 |
JAVA 메소드의 개념 (0) | 2021.09.14 |
JAVA 클래스의 개념 (0) | 2021.09.01 |