본문 바로가기
나만의 정리

자바 상속(extends), 추상클래스(abstract), 인터페이스(implements) 개념정리

by 코리늬 2018. 7. 12.

상속, 추상클래스, 인터페이스는 객체 지향 프로그래밍을 하는데 있어서 중요한 개념이다.


1. 상속 (extends)

- 부모 클래스를 extends로 상속받아 자식 클래스에서 사용할 수 있다. (소프트웨어의 재사용성이 높아진다)

- 시스템을 설계하다보면 공통된 부분이 생기기 마련인데, 상속을 이용해 비슷한 객체끼리 하나의 묶음으로 묶어주고, 공통된 부분을 뽑아 상위 개념의 부모 클래스를 생성한다. 그리고 이 객체들이 부모 객체를 상속하면 중복이 제거되어 공통된 방식으로 설계할 수 있다.

- 오버로딩과 오버라이딩을 사용해 자식 클래스에서 자유자재로 필요한 클래스를 구현할 수 있다.

  • protected : 객체를 캡슐화하기 위해 변수 접근지정자를 private로 설정하면, 이 객체를 상속받은 자식 클래스에서는 접근을 할 수가 없다. 외부에서의 변수 접근은 막고 싶고, 자식 클래스에는 접근을 허용하고 싶을 때 protected를 사용한다. 외부의 접근은 제한하지만, 같은 패키지와 하위 클래스의 접근은 허용한다.

  • super 참조 : 예약어 super는 그 부모 클래스를 참조하는데 사용한다. 생성자인 super()를 호출하면, 부모 클래스의 생성자를 호출하게 된다. 상위 클래스의 생성자를 호출하는 super()는 반드시 해당 클래스의 생성자 첫 번째 라인에 위치해야 한다. 이것은 상위 클래스의 생성자가 항상 하위 클래스의 생성자보다 먼저 수행되어야 하기 때문이다.

  • 단일 상속 : 자바에서는 다중 상속을 지원하지 않는다. 따라서 extends를 통해 하나의 부모만을 가질 수 있는 단일 상속만을 사용할 수 있다.

  • 오버라이딩 : 상위 클래스의 메소드를 하위 클래스가 재정의해서 사용

  • 상속의 제약 : 상수 final 선언시, 다른 클래스에서 해당 클래스를 상속할 수 없다. final을 메소드에서 사용할 경우 하위 클래스에서 오버라이딩이 불가능하다. final은 최종 클래스에서 사용 가능하며, 더 이상 확장할 수 없다.

2. 추상 클래스 (abstract)

- abstract는 추상 클래스를 선언할 때 사용하는 접근지정자이다.

- 클래스 선언부에 abstract를 사용하면 추상 클래스를 메소드에 사용시 추상 메소드를 의미한다.

- 추상 클래스는 추상적인 내용만 정의하고 있는 클래스로 구체적인 내용은 하위 클래스에서 구현되도록 해놓은 클래스이다.

  반드시 추상 메소드를 가지고 있어야 된다는 제약은 없지만 일반적으로 하나 이상의 추상 메소드를 가지고 있다.

- 추상 클래스를 상속하면 하위 클래스에서는 추상 클래스에 선언되어 있는 추상 메소드를 구현해야 한다.

  어떤 면에서 추상 클래스는 인터페이스와 유사해보이나, 추상 클래스는 추상 메소드가 아닌 메소드를 포함할 수도 있고

  상수 이외의 데이터 선언도 포함할 수 있다.

- 추상 클래스의 자식 클래스는 부모로부터 상속받은 모든 추상 메소드들을 정희해야 한다. 그렇지 않으면 자식 역시 추상 클래스가 된다.

- 추상 클래스의 자식 클래스는 부모로부터 상속받은 모든 추상 메소드들을 정의해야 한다.


3. 인터페이스 (implements)

- 상속의 개념은 클래스뿐 아니라, 인터페이스에도 적용될 수 있다. 즉, 하나의 인터페이스는 다른 인터페이스로부터 파생 될 수 있다.

- 인터페이스는 다중상속을 지원하지 않는 자바에서 다중상속과 유사한 기능을 구현할 수 있게 한다.

  (여러 개의 인터페이스로부터 상속 받을 수 있다.)

- 인터페이스는 멤버변수와 메소드로 구성되는데 멤버변수는 모두 상수형으로 선언되고 메소드는 모두 추상 메소드로 선언된다.

- 인터페이스를 구현하고자 하는 클래스를 선언할 때 implements를 이용해 인터페이스를 지정하고, 지정된 인터페이스가

  가지고 있는 추상 메소드를 오버라이딩해야 한다.




'나만의 정리' 카테고리의 다른 글

[Intellij] 인텔리제이 단위 테스트 해보기 (JUnit)  (0) 2018.09.13
자바 Comparable, Comparator  (0) 2018.07.16
자바 접근 지정자  (0) 2018.07.11
StringBuffer를 사용하는 이유  (0) 2018.06.29
foreach문  (0) 2018.06.21

댓글