추상 클래스와 추상 메소드

2023. 5. 11. 00:02· Java/객체 지향
목차
  1. 추상 클래스(abstract class)
  2.  
  3. 추상 클래스의 작성
  4.  
  5. 추상 메소드(abstract method)

추상 클래스(abstract class)

  • 미완성 설계도, 미완성 메소드를 갖고 있는 클래스
abstract class Player {
    abstract void play(int pos);
    abstract void stop();
}
추상 메소드가 클래스내에 존재한다면 그것은 추상 클래스이다. 그리고 abstract를 붙여주어야한다.
  • 다른 클래스 작성에 도움을 주기 위한것. 인스턴스 생성 불가
Player p = new Player();    //에러
이것은 추상 클래스이기 때문에 인스턴스를 생성할 수 없다
  • 그래서 상속을 통해 추상 메소드를 완성시켜야 인스턴스 생성이 가능하다
class AudioPlayer extends Player {
    void play(int pos) { // ... }
    void stop() { // ... }
}
현재 완성된 설계도 AudioPlayer에 추상적인 Player클래스를 상속시키고 안에있는 추상 메소드를 완성시켰다.

그러면
AudioPlayer ap = new AudioPlayer(); 가 가능한것이다. 그럼 여기서 질문

Player ap = new AudioPlayer(); 가 가능할까??
가능하다 왜냐하면 결정적으로 참조하고 있는 객체 AudioPlayer는 완성된 객체이기 때문이다.

 

추상 클래스의 작성

  • 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
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()           { //선택 대상 내리기 }
}

이처럼 같은 메소드가 반복된다면 추상클래스로 만들어 단순 중복 코드를 없앤다.

abstract class Unit {
    int x, y;
    abstract void move(int x, int y);
    void stop() { //현재 위치에 정지 }
}
그리고 Unit을 상속시켜 move의 구현화부분을 작성해서 완성시킨다.

여기서 다형성의 2번째 장점(여러배열에 한번에 값넣기)까지 적용시킨다면

Unit[] group = new Unit[3];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();

for(int i = 0; i< group.length; i++) {
    group[i].move(100, 200);
}
으로 하여 모든 클래스에 move값을 한번에 넣어줄수 있다.
  • 추상화 ↔ 구체화
    • 추상화된 코드는 구체화된 코드보다 유연하다. 변경에 유리하다는 것이다. 이것은 굉장히 큰 장점이다.
      이것은 후에 코드를 작성할때 크게 느낄수 있다.

 

추상 메소드(abstract method)

  • 미완성 메소드, 구현부(몸통 {})가 없는 메소드
추상 메소드 작성 방법
abstract 리턴타입 메소드이름();
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
abstract class Player {
    abstract void play(int pos);
    abstract void stop();
}
추상 클래스 안에 2개의 추상메소드가 들어있다

class AudioPlayer extends Player {
    void play(int pos) { // 내용 생략 }
    void stop() { // 내용 생략 }
}
추상 클래스인 Player를 상속받아 추상 메소드를 구현했다

abstract class AbstractPlayer extends Player {
    void play(int pos) { // 내용 생략 }
}
추상 클래스인 Player를 상속받았는데 2개의 추상메소드에서 한개만 구현했다면 여전히 추상메소드가 존재한다
아까 말했지만 클래스 안에 있는 메소드중 하나라도 추상 메소드가 있다면 그건 abstract 클래스가 되어야한다.
  • 조금 신기하겠지만 추상 메소드는 호출이 가능하다(호출할때는 선언부만 필요하기 때문이다.)
abstract class Player {
    boolean pause;
    int currentPos;
    
    Player() {               // 추상 클래스도 생성자를 만들어줘야 한다.
        pause = false;
        currentPos = 0;
    }
    
    abstract void play(int pos);
    abstract void stop();
    
    void play() {
        play(currentPos);    // 추상 메소드를 사용하는 부분이다.
    }
}
하지만 보이는것처럼 play()의 메소드가 완성되지 않았기때문에 상속을 통해 메소드가 완성되면
그때 객체 생성을 하여 play()가 호출되고 상속을 통해 완성된 메소드 내용이 구현될것이다.

 

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

인터페이스(ft. static, default 메소드)  (0) 2023.05.12
제어자와 캡슐화  (0) 2023.05.09
생성자(ft. this, super)  (0) 2023.05.08
오버로딩(Overloading) & 오버라이딩(Overriding)  (0) 2023.05.08
호출 스택(call stack)  (0) 2023.05.08
  1. 추상 클래스(abstract class)
  2.  
  3. 추상 클래스의 작성
  4.  
  5. 추상 메소드(abstract method)
'Java/객체 지향' 카테고리의 다른 글
  • 인터페이스(ft. static, default 메소드)
  • 제어자와 캡슐화
  • 생성자(ft. this, super)
  • 오버로딩(Overloading) & 오버라이딩(Overriding)
늦은산책
늦은산책
늦은산책
중얼중얼블로그
늦은산책
전체
오늘
어제
  • 분류 전체보기
    • 오류 모음집
    • CS
      • 💾 자료구조
      • 👫🏼 정렬
      • 🖥 네트워크
      • 💻 운영체제
      • 💾 DB
      • 🌌 알고리즘
      • 📝 언어
    • 테스트
    • Git 초보에게 필요한 Git bash사용법
    • 프로젝트
      • 팀 프로젝트
      • 개인 프로젝트
      • 항해99 개인 프로젝트
      • 스위프 프로젝트(Lit Map)
    • Java
      • 객체 지향
    • Spring
      • 🌲 Spring
      • 👨‍💻 SpringSecurity
      • 🌵 JPA
    • MSA
      • MSA 강좌 - 이도원 강사님
    • Docker(도커)
    • 코딩테스트
      • 🧮 프로그래머스
      • 🎲 백준
    • 항해99
      • 🕛 1주차
      • 🕐 2주차
      • 🕑 3주차
      • 🕒 4주차
    • AWS
    • CI와CD

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 카우치코딩_팀프로젝트
  • 취업리부트코스
  • 코딩테스트
  • 취리코
  • 카우치코딩_포트폴리오_멘토링
  • 항해99
  • 개발자이력서
  • couchcoding
  • 개발자취준
  • 개발자포토폴리오
  • 개발자취업
  • 개발자포트폴리오
  • 카우치코딩

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
늦은산책
추상 클래스와 추상 메소드
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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