⭐추상 클래스

abstract class

추상 메서드를 포함한 클래스

상속에서 사용되는 개념으로

객체로 만들기는 좀 애매할때 사용한다.

class 앞에 abstract가 붙으면 된다.


⭐추상 메서드

선언부만 있고 바디가 없는 형태

예 int add(int x, int y);

void 앞에 abstract가 붙으면 된다.

 

추상클래스를 (동물 - 인간, 호랑이) 관계를 통해 이해해봤다.

package com.abstract_.animal;
/**
 * 4.22 5교시 추상클래스
 * <p>
 * 추상클래스
 * abstract class
 * <p>
 * 하나 이상의 추상 메서드를 포함한 클래스
 * class 앞에 abstract가 뭍으면 추상클래스다.
 *
 * 강제적으로 타입으로만 설계하는 기법이다.
 *
 * abstract - 강제성
 */
public abstract class Animal { //추상클래스로 선언됐다.

    String name;

    public void move() {
        System.out.println("동물이 이동한다");
    }

    //추상메서드를 만들어보자
    public abstract void hunt();
    /*
    클래스 안에
    단 하나라도 추상 메서드를 가지고 있다면
    그 클래스는 반드시 추상 클래스가 돼야 한다.
     */

}//end of Animal

 

2. 자식클래스 호랑이

추상클래스를 상속받으면, 이렇게 오류가 발생한다. 해결방법은 1.자식클래스도 추상클래스로 변경 2.추상메서드를 구현메서드로 오버라이드 하는 방법이다.

package com.abstract_.animal;
/**
 * 4.22 5교시 추상클래스
 *
 * 추상클래스를 사용하는 이유
 *
 * 단 하나라도 추상메서드가 있으면 추상클래스다.
 */
public class Tiger extends Animal {

    @Override //오버라이드 하자 오류가 없어졌다
    public void hunt() {
        System.out.println("호랑이가 사냥을 한다");
    }

    @Override
    public void move() {
        System.out.println("호랑이가 살금살금 이동한다");
    }

}//end of Tiger

 

3.자식클래스이자 추상클래스인 인간을 설계해봤다.

package com.abstract_.animal;
/**
 * 4.22 5교시 추상클래스
 */
public abstract class Human extends Animal{


    @Override
    public void move() {
        System.out.println("사람이 두 발로 걷는다");
    }
}//end of Human

 

4. 인간 클래스의 자식클래스인 사람 클래스를 설계했다.

package com.abstract_.animal;
/**
 * 4.22 5교시 추상클래스
 */
public class Person extends Human{

    //구현 메서드로 만들어주면 된다.
    @Override
    public void hunt() {
        System.out.println("총으로 동물을 사냥한다");
    }
}//end of Person

 

5. 코드 실행부

추상클래스인 Animal, Human을 인스턴스화 하려고 하자 오류가 발생했다.

추상클래스를 객체 선언할 수 없다.

package com.abstract_.animal;
/**
 * 4.22 5교시 추상클래스
 */
public class MainTest1 {
    //main
    public static void main(String[] args) {
        /*
        객체지향 개념으로
        Animal이라는 클래스를 인스턴스화하면 좀 이상하다
         */
//        animal = new Animal(); // 오류발생

        /*
        Animal 클래스는
        abstract 키워드를 사용해
        추상 클래스로 설계됐다.

        추상 클래스는
        new 키워드 생성자를 활용해서
        독립적으로 메모리에 올릴 수 없다.

        개발자가 객체를 생성시킬 때
        다른 사용자가 마음대로 객체를 생성시키지 못하도록
        강제성을 줄 수 있다.
         */
//        Human human = new Human(); //오류 발생

    }//end of main
}//end of class

 

 

예제)

컴퓨터 - 데스크탑, 노트북 - 내노트북

상속관계와 추상클래스 처리 방법을 연습했다. 

 

1. 컴퓨터 클래스

package com.abstract_.computer;
/**
 * 4.22 5_1교시 추상클래스
 *
 * 추상클래스 상속
 * 메서드 오버라이드
 *
 * Computer
 * 부모클래스
 * 추상클래스
 */
public abstract class Computer {

    abstract void display();
    abstract void typing();

    void turnOn() { System.out.println("컴퓨터를 켭니다"); }
    void turnOff() { System.out.println("컴퓨터를 끕니다"); }

}//end of Computer

 

2-1. 데스크탑 클래스

구현클래스로 설계했다(완)

package com.abstract_.computer;
/**
 * 4.22 5_1교시 추상클래스
 * 구현클래스
 * Computer의 자식클래스
 */
public class DeskTop extends Computer {

    void display() { System.out.println("데스크탑 화면을 띄웁니다"); }
    void typing() { System.out.println("데스크탑에 문자를 입력합니다"); }

}//end of DeskTop

 

2-2. 노트북 클래스

추상클래스로 설계했다.

package com.abstract_.computer;
/**
 * 4.22 5_1교시 추상클래스
 * 추상클래스
 * Computer의 자식클래스
 */
public abstract class NoteBook extends Computer {

    void typing() { System.out.println("노트북에 글자를 입력합니다"); }

}//end of NoteBook

 

3. 내노트북 클래스

구현클래스로 설계했다(완)

package com.abstract_.computer;
/**
 * 4.22 5_1교시 추상클래스
 * 구현클래스
 * NoteBook의 자식클래스
 */
public class MyNoteBook extends NoteBook {

    void display() { System.out.println("내 노트북 화면을 띄웁니다"); }

}//end of MyNoteBook

 

4. 코드 실행부

데스크탑과 내노트북 클래스로 객체선언이 정상적으로 되는 것을 확인했다.

package com.abstract_.computer;
/**
 * 4.22 5_1교시 추상클래스
 * 코드 실행부
 */
public class ComperMainTest1 {
    //main
    public static void main(String[] args) {

        Computer computer1 = new DeskTop(); //다형성
        Computer computer2 = new MyNoteBook();

    }//end of main
}//end of class

 

+ Recent posts