본문으로 바로가기

1. 추상 클래스

실체 클래스 : 객체를 직접 생성할 수 있는 클래스

추상 클래스 : 클래스들의 공통적인 특성을 추출해서 선언한 클래스 (객체 직접 생성 불가능)

  • 추상은 실체 간에 공통되는 특성을 추출한 것을 뜻 합니다.
  • 추상 클래스와 실체 클래스는 상속의 관계를 가집니다.
  • 추상 클래스 부모 클래스이고 실체 클래스 자식 클래스입니다.
  • 추상 클래스는 new 연산자를 사용해서 인스턴스(객체)를 생성하지 못합니다.

 

2. 추상 클래스의 용도

1. 필드와 메소드 이름 통일

  • 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적으로 사용합니다.
  • 상속을 이용함으로써 공통된 필드와 메소드는 통일

 

2. 시간 절약

  • 실체 클래스를 작성할 때 시간을 절약할 수 있습니다.
  • 공통적인 필드와 메소드는 추상 클래스에 모두 선언해 두고, 실체 클래스마다 다른 점만 실체 클래스에 선언]
  • 설계자가 추상 클래스(규격)를 작성하고, 코더가 실체 클래스를 작성할 때 용이합니다.

 

3. 추상 클래스 선언

public abstract class 클래스 {
	// 필드
    데이터타입 필드;
    
	// 생성자
    public 클래스(데이터타입 매개변수) {
        this.필드 = 매개변수;
    }
    
	// 메소드
    public 데이터타입 get필드() {
        return 필드;
    }
}
  • 일반 클래스와 마찬가지로 필드, 생성자, 메소드를 선언할 수 있습니다.
  • new 생성자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 합니다.

 

예시

추상 클래스 Grade

public abstract class Grade {
    // 필드
    private int grade;
    // 생성자
    public Grade(int grade) {
        this.grade = grade;
    }
    // 메소드
    public int getGrade() {
        return grade;
    }
}

 

실체 클래스 Student

public class Student extends Grade {
    // 필드
    private String name;
    // 생성자
    public Student(int grade, String name) {
        super(grade);
        this.name = name;
    }
    // 메소드
    public String getName() {
        return name;
    }
}

 

실행

// 실체 클래스의 인스턴스(객체) 생성
Student student = new Student(1, "veneas");

int grade = student.getGrade(); // 추상 클래스의 메소드 사용 가능
String name =  student.getName();

System.out.println("Grade: "+ grade); // Grade: 1
System.out.println("Name: "+ name); // Name: veneas

 

4. 추상 메소드

추상 메소드 : 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드

  • 추상 클래스를 설계할 때, 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있을 경우, 해당 메소드를 추상 메소드로 선언합니다.
  • 메소드 명을 통일 할 수 있습니다.

 

추상 메소드 선언

[public | protected] abstract 리턴타입 메소드명(매개변수, ...);

 

예시

추상 클래스 Computer

public abstract class Computer {
    private String modelName;

    public Computer(String modelName) {
        this.modelName = modelName;
    }
    // 추상 메소드
    public abstract void powerOn();
}

 

실체 클래스 SamSungGalaxyBook

public class SamSungGalaxyBook extends Computer {
    public SamSungGalaxyBook(String modelName) {
        super(modelName);
    }

    @Override
    public void powerOn() {
        System.out.println("삼성 갤럭시북 ON");
    }
}

 

실체 클래스 LgGram

public class LgGram extends Computer {
    public LgGram(String modelName) {
        super(modelName);
    }

    @Override
    public void powerOn() {
        System.out.println("엘지 그램 ON");
    }
}

 

실행

// 1. 일반적인 인스턴스 생성
SamSungGalaxyBook samSungGalaxyBook = new SamSungGalaxyBook("NT950XCJ-K78A");
LgGram lgGram = new LgGram("17ZD95P-GX56K");

samSungGalaxyBook.powerOn(); // 삼성 갤럭시북 ON
lgGram.powerOn(); // 엘지 그램 ON

// 2. 자동 타입 변환
Computer computer = samSungGalaxyBook;
computer.powerOn(); // 삼성 갤럭시북 ON

computer = lgGram;
computer.powerOn(); // 엘지 그램 ON​