java/객체지향

[객체지향] 추상 클래스

2021. 7. 16. 19:21
목차
  1. ●추상 클래스(abstract class)
  2. ●추상 메서드(abstract method)
  3.  ●추상클래스의 작성

●추상 클래스(abstract class)

  Tv 설계도를 만든다고 가정해보자. Tv를 만들 때 맨 땅에 헤딩하듯 만들려고하면 설계부터 힘들 것이다. Tv모델들은 외양은 모두 제 각각 이지만 기능에서는 90%설계가 동일할거다. 서로 다른 세 개의 설계도를 따로 그리는 것보다는 이들의 공통부분만을 그린 미완성 설계도를 만들어 놓고, 이 미완성 설계도를 이용해서 각각의 설계도를 완성하는 것이 훨씬 효율적이다. 자바의 객체지향에서는 미완성 설계도에 해당하는 클래스를 제공한다. 이를 추상클래스라하고 미완성 메서드를 포함하고 있다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다.

 

추상 클래스 

미완성 설계도. 인스턴스 생성불가.

미완성 메서드(추상 메서드)를 포함하고 있는 클래스

 

추상 클래스는 키워드 'abstract'를 붙이기만 하면 된다. 클래스 선언부의 abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 쉽게 알 수 있다. 추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다. 추상 클래스에도 생성자가 있으며, 멤버변수와 메서드도 가질 수 있다.

 

abstract class 클래스이름 {
       ...
}

 

 

●추상 메서드(abstract method)

 메서드는 선언부와 구성부(몸통)으로 구성되어 있다고 했다. 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드이다. 즉, 설계만 해 놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것이다. 메서드를 미완성으로 남겨두면 상속 받은 클래스에 따라 메서드의 내용이 달라진다. 이를 통해 메서드를 보다 손쉽게 작성할 수 있다.

 

 

abstract 리턴타입 메서드이름();

 

 

 추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야한다. 

 

abstract class Player {    // 추상 클래스
      abstract void play(int pos);       //추상메서드
      abstract void stop();              //추상메서드
}

class AudioPlayer extends Player {
    void play(int pos) { /* 내용 생략 */ } //추상메서드를 구현
    void stop() { /* 내용 생략 */ }   //추상메서드를 구현
}

abstract class AbstractPlayer extends Player {
      void play(int pos) { /* 내용 생략 */ }       //추상메서드를 구현

 

 

 ●추상클래스의 작성

 상속이 자손 클래스를 만드는데 조상클래스를 사용하는 것이라면, 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상클래스를 만드는 것이라고 할 수 있다. 추상화는 구체화의 반대개념이다. 상속계층도를 따라 내려갈수록 기능이 추가되어 구체화 정도가 심해지며, 상속계층도를 따라 올라갈수록 클래스는 추상화 정도가 심해진다. 즉, 상속계층도를 따라 내려 갈수록 세분화되며, 올라갈수록 공통요소만 남게된다. 스타크래프의 유닛을 예시로 코드를 짜보자.

 

 

class Marine {
    int x, y;   //현재 위치
    void move(int x, int y) { /* 지정된 위치로 이동 */ }
    void stop()             { /* 현재 위치에 정지 */  }
    void stimPack()         { /* 스팀팩을 사용한다. */ }
}

class Tank {
    int x, y;   //현재 위치
    void move(int x, int y) { /* 지정된 위치로 이동 */ }
    void stop()             { /* 현재 위치에 정지 */  }
    void changeMode()       { /* 공격모드를 변환한다. */ }
}

class Dropship {
    int x, y;   //현재 위치
    void move(int x, int y) { /* 지정된 위치로 이동 */ }
    void stop()             { /* 현재 위치에 정지 */  }
    void load().            { /* 선택된 대상을 태운다. */ }
    void unload()           { /* 선택된 대상을 내린다. */ }
}

 

 

 각 클래스 마다 멤버변수와 메서드가 정의되어있다. 그런데 '현재위치', 'move' ,' stop' 메서드는 모든 클래스에 공통적으로 있다. 이를 뽑아 추상화 한다면 코드를 더욱 깔끔하고 직관적으로 만들 수 있을거다.

 

 

abstract class Unit {
     int x, y;
     abstract void move(int x, int y);
     void stop() { /* 현재위치에 정지 */ }
}

class Marine extends Unit {
     void move(int x, int y) { /* 지정된 위치로 이동 */ }
     void stimPack()         { /* 스팀팩을 사용한다. */ }
}

class Tank extends Unit {
     void move(int x, int y) { /* 지정된 위치로 이동 */ }
     void changeMode()       { /* 공격모드를 변환한다. */ }
}

class Dropship extends Unit {
     void move(int x, int y) { /* 지정된 위치로 이동 */ }
     void load()             { /* 선택된 대상을 태운다. */ }
     void unload()           { /* 선택된 대상을 내린다. */ }
}

 

 

 공통된 멤버변수와 메서드는 모두 추상화를 하고 클래스 마다 개별적으로 가지고 있는 메서드 'stimpack', 'change', 'load', 'unload', 'move'을 각 클래스에 정의했다. 그런데 앞에서 move도 공통 메서드라고 했는데 왜 개별 메서드로 적용되는 추상메서드로 정의했을까? Marine, Tank는 지상유닛이고 Dropship은 공중유닛이기 때문에 이동하는 방법이 서로 달라 move메서드가 실제로 구현하는 내용이 다르다. 그래서 move메서드를 개별 메서드로 판단하고 추상메서드로 정의했다. move가 추상메서드로 선언된 것에는, 앞으로 Unit클래스를 상속받아서 작성되는 클래스는 move메서드를 자신의 클래스에 알맞게 구현해야 한다느느 의미가 담겨있다.

 

출처: 자바의정석 기초편(저자: 남궁성, 출판사: 도우출판)

 

 

'java > 객체지향' 카테고리의 다른 글

[JAVA/객체지향] 내부 클래스  (1) 2023.01.27
[객체지향] 인터페이스  (0) 2021.07.19
[객체지향]여러 종류의 객체를 배열로 다루기  (0) 2021.07.16
[객체지향] 다형성(polymorphism)  (0) 2021.07.15
[객체지향] 제어자  (0) 2021.07.14
  1. ●추상 클래스(abstract class)
  2. ●추상 메서드(abstract method)
  3.  ●추상클래스의 작성
'java/객체지향' 카테고리의 다른 글
  • [JAVA/객체지향] 내부 클래스
  • [객체지향] 인터페이스
  • [객체지향]여러 종류의 객체를 배열로 다루기
  • [객체지향] 다형성(polymorphism)
각시탈코더
각시탈코더
각시탈코더
각시탈코더
각시탈코더
전체
오늘
어제
  • 분류 전체보기 (203)
    • java (46)
      • 객체지향 (20)
      • 기본문법 (8)
      • 자바의 정석 연습문제 오답노트 (9)
      • 백준 알고리즘 (9)
    • Spring (17)
      • SpringMVC (8)
      • Spring DI와 AOP (5)
      • REST API와 Ajax (1)
      • Spring 프로젝트 (1)
      • Spring Security (0)
    • DB (47)
      • Oracle (15)
      • SQL오답노트 (25)
      • 튜닝 (0)
      • ERD (1)
      • DB 모델링 (5)
    • Servlet & JSP (3)
    • JDBC (2)
      • 기본 (1)
      • 스프링JDBC (1)
    • MyBatis (2)
    • JavaScript (2)
      • 코딩애플 (0)
      • 문법 (1)
    • React (0)
      • 코딩애플 (0)
    • HTML (0)
      • 모던 웹을 위한 HTML5+CSS3 바이블 (0)
    • CSS (0)
      • 모던 웹을 위한 HTML5+CSS3 바이블 (0)
    • Linux (0)
    • Git & GitHub (2)
      • Git (1)
    • CS (19)
      • 네트워크 (6)
      • HTTP (7)
      • 컴퓨터구조 (0)
      • 자료구조와 알고리즘 (2)
      • 기타 (4)
    • 개발설정 (2)
    • 기술면접 (0)
      • JAVA (0)
      • Spring (0)
      • DB (0)
      • 네트워크 (0)
      • 공통 (0)
    • 프로젝트 (2)
      • 게시판만들기 (2)
    • 기혁씨의 삽질표류기 (28)
    • 참고자료 (2)
      • 국비수업 (0)
      • 당당 프로젝트 (1)
    • 뉴렉처 (17)
      • 자바 (11)
      • 자바스크립트 (3)
      • 키워드 (0)
      • 숙제 (0)
      • CSS (0)
      • DB (3)
      • 서블릿 (0)
      • 스프링 (0)
      • DOM (0)
    • 내가 만든 학습그림 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 국비수업
  • SQL
  • It
  • 자바
  • 코딩
  • 백준
  • 프로그래머스
  • 서브쿼리
  • 연습문제
  • 백엔드
  • 쿼리
  • 배열
  • 객체지향
  • 자바의정석기초편
  • 스프링
  • 공부
  • 네트워크
  • 알고리즘
  • 오류
  • Oracle
  • 개발자
  • 오라클
  • 모두의네트워크
  • 웹프로그래밍
  • 자바의정석
  • 에러
  • spring
  • Java
  • db
  • 뉴렉처

최근 댓글

최근 글

hELLO · Designed By 정상우.
각시탈코더
[객체지향] 추상 클래스
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.