만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/JAVA

[Java] abstract class 추상클래스란?

D36choi 2020. 10. 22. 15:55
728x90

추상클래스에서 추상이란?

 

추상은 실체의 공통 특성을 추출하는 것을 의미한다.

예를 들어, 트럭과 승용차는 모두 자동차라는 공통점이 있고 '주행한다' 라는 공통된 행위도 묶을 수 잇다.

이처럼 구체적인 실체라기보다는 공통적인 특성을 추상적으로 묶은 것이라 할 수 있다.

그럼 추상 클래스는?

 

실체 클래스들의 공통 특성을 묶어 분리 선언한 클래스를 추상클래스라고 한다.

말하자면 추상클래스와 실체클래스는 상속의 관계를 지닌다.

추상클래스 특징은?


* 추상클래스만으로 인스턴스를 생성할 수 없다. 즉 new 연산자 통해 객체 생성이 불가. * 추상 클래스는 extends 키워드 뒤에만 올 수 있다. 자식클래스로는 사용할 수 없다.

그럼 왜 쓰는 것인가?

1. 클래스들의 공통적인 필드와 메소드의 이름을 통일해 협업시에도 일관성 있는 개발 가능.

만약 여러명이 협업하는데, Suv 클래스의 운전은 Ride(), Truck 클래스의 운전은 Drive() 라고 한다면, 동일 기능임에도 이름이 달라 중구난방이 될 수 있다. 추상클래스의 메서드를 상속해 사용하면 직관적이다.

 

2. 코드의 재사용성으로 시간을 절약한다.
만약 추상클래스를 상속하는 자식 클래스의 경우, 자신의 메서드만 추가로 만들어주면 되고 이미 선언된 클래스들을 상속해 정의하면 되기때문에 일일이 새롭게 메소드를 선언할 필요가 없다. 정의만 해주면 된다.

 

3. 개발의 설계 규격의 역할을 해준다.

여러명이 비슷한 속성의 자식클래스들을 각자 만드는 경우, 1에서 이야기한 것처럼 추상클래스의 메서드에 맞춰 각 클래스들을 만들으라는 일종의 지시역할을 할 수 있다.

 

사용법

// Phone.java
public abstract class Phone {
// field
	public String owner;
    public Phone(String owner) {
    	this.owner = owner;
    }
	public void turnOn() {
    	System.out.println("전원을 켭니다.");
    }
}

// Iphone.java
public class Iphone extends Phone {
	public Iphone(String owner) {
    	super(owner);
    }
	public void enterAppStore() {
    	System.out.println("앱스토어를 켭니다.");
    }
}

// Main.java
class Main {
  public static void main(String[] args) {
    
    Iphone iPhone1 = new Iphone("choi");
    iPhone1.turnOn();
    iPhone1.enterAppStore();
  }
}

 

'extends' 키워드를 통해 추상클래스를 상속하면, 내부 정의된 메소드들을 이어받아 사용할 수 있다.

 

생성자는 super(arg); 키워드를 통해 추상클래스 객체 또한 자식 객체 생성시 생성하므로 반드시 추상클래스도 생성자가 존재해야 한다.

 

추상메소드

 

public abstract class Animal {
    public abstract void sound();
}

추상메소드는 위처럼 추상 클래스내에서 선언만 있고 정의가 없는 메소드를 의미 한다.

이 추상 메소드는 무조건 오버라이딩을 통해 내용을 재정의해야 한다.

 

그렇지 않으면 컴파일 에러가 발생한다.