[자바의 정석] - 추상 클래스와 추상메서드

2023. 9. 25. 01:13·📝 끄적끄적/🖥️ 자바의 정석

추상클래스, 추상 메서드

  • 미완성(부족한) 설계도
  • 미완성 메서드를 갖고 있는 클래스
abstract class Player { //추상클래스(미완성 클래스)
	abstract void play(int pos); //추상메서드(몸통{}이 없는 미완성 메서드)
	abstract void stop(); //추상메서드
}
  • 다른 클래스 작성에 도움을 주기 위한 것이다. 인스턴스 생성이 불가능하다.
Player p = new Player(); //에러. 추상 클래스의 인스턴스 생성 불가
  • 상속을 통해 추상 메서드를 완성해야 인스턴스 생성이 가능하다.
class AudioPlayer extends Player {
	void play(int pos); { /* 생략 */}
	void stop(); { /* 생략 */}
}

AudioPlayer a = new AudioPlayer (); //가능

추상 메서드(abstract method)

  • 미완성 메서드. 구현부( {} )가 없는 메서드

❓어떨 때 쓰는가?

→ 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우

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) { /* 생략 */} //추상메서드 구현
}

AbstractPlayer는 메서드 2개 중 1개만 구현했다.

그럼 미완성이기 때문에 abstract를 붙여줘야 한다.

안 붙이면 컴파일에러 발생!

 

추상 클래스 + 다형성 예제

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

class AudioPlayer extends Player {
    void play(int pos) {
        System.out.println(pos);
    }

    void stop() {
        System.out.println("stop()");
    }
}

public class AbstractTest {
    public static void main(String[] args) {
//        Player p = new Player(); //에러. 추상 클래스의 객체를 생성할 수 없음.
        Player p = new AudioPlayer(); //다형성
        p.play(1000);
        p.stop();
    }
}

`Player p = new Player();` 는 불가능하다.

→ 추상 클래스의 인스턴스는 생성할 수 없다.

 

`Player p = new AudioPlayer();` 는 가능하다.

→ 실제 객체는 AudioPlayer 클래스기 때문에!

 

예제코드

추상 클래스라고 꼭 추상 메서드만 존재해야 되는 것은 아니다.

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

class AudioPlayer extends Player {
    void play(int pos) {
        System.out.println(pos);
    }
}

public class AbstractTest {
    public static void main(String[] args) {
//        Player p = new Player(); //에러. 추상 클래스의 객체를 생성할 수 없음.
        Player p = new AudioPlayer(); //다형성
        AudioPlayer a = new AudioPlayer();
        p.play(1000);
        p.stop();
        a.play(2000);
        a.stop();
    }
}

결과

추상클래스의 장점

  • 관리가 용이하다.

→ 추상 클래스라는 설계도를 기반으로 구현하기 때문에

  • 변경에 유연하다.

→ 설계도를 수정해주면 된다.

  • 중복코드를 방지한다.

→ 클래스를 만들어 다 구현하지 않고 그저 상속받으면 된다.

abstract class Person{
        void eat() { System.out.println("eat1()"); }
        abstract void sleep();
        abstract void talk();
    }

    class Park extends Person{
        void sleep() { System.out.println("sleep1()"); }
        void talk() { System.out.println("talk1()"); }
    }

    class Lee extends Person{
        void sleep() { System.out.println("sleep2()"); }
        void talk() { System.out.println("talk2()"); }
    }

    class Kim extends Person{
        void sleep() { System.out.println("sleep3()"); }
        void talk() { System.out.println("talk3()"); }
    }
저작자표시 비영리 (새창열림)

'📝 끄적끄적 > 🖥️ 자바의 정석' 카테고리의 다른 글

[자바의 정석] - 인터페이스(interface)  (1) 2023.09.26
[자바의 정석] - 다형성  (0) 2023.09.25
[자바의 정석] 참조변수의 형변환, instanceof 연산자  (0) 2023.09.24
[자바의 정석] 제어자, 캡슐화  (0) 2023.09.24
[자바의 정석] 상속, 참조변수 super, 생성자 super()  (0) 2023.09.23
[자바의 정석] 생성자, 변수/멤버 변수의 초기화  (0) 2023.09.22
'📝 끄적끄적/🖥️ 자바의 정석' 카테고리의 다른 글
  • [자바의 정석] - 인터페이스(interface)
  • [자바의 정석] - 다형성
  • [자바의 정석] 참조변수의 형변환, instanceof 연산자
  • [자바의 정석] 제어자, 캡슐화
현주먹
현주먹
끄적끄적 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (162)
      • 👶🏻 CS (15)
        • Operating System (8)
        • Database (4)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • JPA (5)
        • Test Code (1)
        • Database (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (57)
        • 후기 및 회고 (5)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL
  • 인기 글

  • 태그

    F-Lab
    TDD 클린 코드 with Java
    백준
    객체지향
    에프랩 후기
    오블완
    인프런 단어뒤집기
    자바의신절판
    jsp
    개발자멘토링
    f-lab 후기
    C
    항해99
    자바의정석
    ==와 equals()
    티스토리챌린지
    인프런 특정문자뒤집기
    til
    코테스터디
    개발자취업
    99클럽
    JPA
    에프랩
    데브클럽
    오라클
    NextSTEP
    PostGreSQL함수
    백준10250
    로또 미션
    코딩테스트준비
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
현주먹
[자바의 정석] - 추상 클래스와 추상메서드
상단으로

티스토리툴바