스프링으로 공부를 하던 중, implements로 서비스나 DAO,Mapper(interface) 등을 상속해서 사용하다가
클래스를 상속해야하는 상황이 생겨서 extends를 사용하게 됐다.
이 차이에 대해 궁금해졌다.
객체지향 프로그래밍의 특징으로는
1. 상속과 인터페이스 (계층성)
2. 다형성,사용편의성(모듈화)
3.캡슐화,정보은닉
4.자료 추상화(모델링)
5.동적바인딩
이 있다.
상속이란 무엇인가?
상자 하나하나는 모두 객체이고 , 객체는 class이다.
계층을 표현하기 위해 만들어 진 것이 상속이고,
하위 객체는 상위 객체의 특징을 물려받는다.
식물class는 stand() , 동물class는 move()라는 메소드가 있으면
동물class 아래의 포유류,조류,파충류 class는 move()라는 메소드를 모두 사용할 수 있어
move()라는 메소드로 움직일 수 가 있다.
같은 맥락으로 생물은 live()와 같은 메소드를 가지고 있다고 생각 할 수 있겠다.
이 메소드나 변수는 구현하는 것인지, 그대로 사용하는 것인지에 따라 형태가 갈리게 된다.
- extends
- 부모에서 선언 / 정의를 모두하며 자식은 메소드 / 변수를 그대로 사용할 수 있음
- implements (interface 구현)
- 부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩 (재정의) 해서 사용해야함
- abstract
- extends와 interface 혼합. extends하되 몇 개는 추상 메소드로 구현되어 있음
extends가 대표적인 상속의 형태인데, 부모의 메소드를 그대로 사용할 수 있고, 따로 오버라이딩 할 필요 없이 부모에 구현되어있는 것을 직접 사용이 가능하다.
그럼 implements는 무엇이냐?
자바는 다중상속을 지원하지 않는다고 한다.
그래서 implments가 다중상속을 대신해준다.
예를들어, 스프링에서 게시판을 구현할때 게시판의 기능은 목록,상세보기,수정,삭제 등등등 여러가지가 있다.
보통 Service 패키지가 implements로 만들어지고 그 아래 로직을 구현하는 ServiceImpl을 사용하는데
이 것이 바로 다중상속이다.
public interface BoardService {
public boolean registerBoard(BoardDTO params);
public BoardDTO getBoardDetail(Long idx);
public boolean deleteBoard(Long idx);
public List<BoardDTO> getBoardList();
}
@Service
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardMapper boardMapper;
@Override
public boolean registerBoard(BoardDTO params) {
int queryResult = 0;
if (params.getIdx() == null) {
queryResult = boardMapper.insertBoard(params);
} else {
queryResult = boardMapper.updateBoard(params);
}
return (queryResult == 1) ? true : false;
}
@Override
public BoardDTO getBoardDetail(Long idx) {
return boardMapper.selectBoardDetail(idx);
}
@Override
public boolean deleteBoard(Long idx) {
int queryResult = 0;
BoardDTO board = boardMapper.selectBoardDetail(idx);
if (board != null && "N".equals(board.getDeleteYn())) {
queryResult = boardMapper.deleteBoard(idx);
}
return (queryResult == 1) ? true : false;
}
@Override
public List<BoardDTO> getBoardList() {
List<BoardDTO> boardList = Collections.emptyList();
int boardTotalCount = boardMapper.selectBoardTotalCount();
if (boardTotalCount > 0) {
boardList = boardMapper.selectBoardList();
}
return boardList;
}
부모의 메소드가 오버라이딩(재정의) 되어있다.
이것이 다중상속이다.
이렇게 다중상속으로 묶인 service라는 객체는 controller에서 의존성주입을 통해 사용,
개발과 유지보수에 생산성을 더 해줄 수 있다.
간단 정리
- extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface 상속에 사용된다.
- class가 class를 상속받을 땐 extends를 사용하고, interface가 interface를 상속 받을 땐 extends를 사용한다.
- class가 interface를 사용할 땐 implements를 써야하고
- interface가 class를 사용할 땐 implements를 쓸수 없다.
- extends는 클래스 한 개만 상속 받을 수 있다.
- extends 자신 클래스는 부모 클래스의 기능을 사용한다.
- implements는 여러개 사용 가능하다.
- implements는 설계 목적으로 구현 가능하다.
- implements한 클래스는 implements의 내용을 다 사용해야 한다.
결론은 클래스를 상속할땐 extends, 인터페이스를 상속할때엔 implements라고 쉽게 생각하면 되겠다.
클래스 확장 extends, 클래스 구현 implements
참조 사이트
자바 extends, implements 차이 (velog.io)
'JAVA > 자바' 카테고리의 다른 글
Java 배열 정렬하기 (0) | 2021.12.11 |
---|---|
Java 입력 받은 값을 배열에 저장 (0) | 2021.12.11 |
Iterator와 map의 반복문 (0) | 2021.08.06 |
indexOf() , lastindexOf- 특정 문자 인덱스 위치 찾기 (0) | 2021.08.06 |
isEmpty와 ==null - 객체가 비어있는지 확인하는 방법 (2) | 2021.08.06 |