2 minute read

추상클래스가 무엇이고, 왜 사용하는지에 대해 알아보도록 하자

0. 들어가기전에

여러 클래스의 공통된 특성(필드, 메서드)를 추출해서 선언한 것을 추상클래스 라고 한다.

추상 클래스 :

  • 실체 클래스 (객체 생성용 클래스)들의 공톡적인 특성 ( 필드, 메서드 ) 을 추출하여 선언함
  • 추상 클래스와 실체 클래스는 부모, 자식 클래스로서 상속 관계를 갖는다.
  • 실체 클래스는 실제 객체를 생성할 정도의 구체성을 가진 반면, 추상 클래스는 아직 메서드와 내용이 추상적이기 때문에 객체를 생성할 수 없다

ex) Bird.class, Fish.class, Cat.class 이러한 실체 클래스마다 공통된 특성(필드, 메서드)이 존재 한다. 이러한 특성을 Animal.class 라는곳에 추출하여 선언하면된다. 그러면 이 실체들은 Animal 클래스를 상속 받으므로써 그 기능들을 고스란히 다시 사용할 수 있게 된다.

음 위만 보면 일반 클래스 상속과 다를것이 없어 보이는데 왜 사용 할까??.

1. 추상 클래스의 용도

  • 실체 클래스에서 반드시 존재해야 할 필드와 메서드의 선언(실체 클래스의 설계 규격!!(규칙) - 객체 생성은 불가)
  • 실체 클래스에는 공통된 내용은 빠르게 물려 받고, 다른 점만 선언 하면 되므로 시간이 절약된다.

이정도로는 난 잘 이해가 안갔다. 개인적으로 내가 몸으로 깨닫지 못하면 습관을 버리지 않는 타입이라,, 그래서 아래 블로그를 참고 하였다.

위의 블로그 대로 라면, 추상클래스는 __규격__을 설정하여 협업의 소통의 용이성을 위한 목적이 큰 클래스인것 같다.

2. 추상 클래스 선언

abstract 키워드 상속을 통해 자식 클래스만 만들 수 있게 만든다. 부모로서의 역할만 수행 ( = __new 연산자 __) 사용 불가

public abstract class 클래스 {
	// 필드
	// 생성자 : 생성자는 new로 쓰는거 아닌가??? 아래 설명
	// 메서드
}
  • 추상 클래스도 일반 클래스와 마찬가지로 멤버들을 선언할 수 있다.
  • 직접 객체를 생성할 수 없지만 자식 객체 생성될 때 객체화가 된다. 즉,( 자식 클래스에서 추상클래스에 super(..)를 통해 생성자를 호출할 수 있다.)

아래 예제를 통해 사용법을 조금더 알아보자

추상클래스 Phone.class

public abstract class Phone {
	public String owner;

	public Phone(String owner){
		this.owner = owner;
	}

	public void turnOn(){
		System.out.println("폰 전원 on");
	}
	
	
	public void turnOff(){
		System.out.println("폰 전원 off");
	}
}

Ipone.class

public class Ipone extends Phone{
	// 부모의 Phone의 생성자를 호출해줘야 한다.
	public Ipone(String owner){
		super(owner);
	}

	public void faceTime(){
		System.out.println("페이스 타임을 시작합니다.");
	}
}

PhoneExample.class

public class PhoneExample{
	public static void main(String[] args){
		//Phone phone = new Phone(); 사용 불가
		Ipone ipone12 = new Ipone("한승우");
		ipone12.turnOn();
		ipone12.faceTime();
		ipone12.turnOff();
	}
}

3. 추상 메소드와 재정의

  • 메서드 선언만 통일하고 실행 내용은 실제 클래스마다 달라야 할때 사용 ( 메서드에 중괄호를 사용 안함 )
    • ( 구체적으로 어떤 내용을 작성해야 될지 결정할 수 없기 때문에 요런식으로 씀 )
  • abstract 키워드로 선언되고 중괄호가 없는 메서드
  • 하위 클래스는 반드시 재정의 해서 실행 내용을 채워야 한다.

모든 포유류는 운다 맞나? 그렇다고 가정하고 아래예제를 만들어 보자

Mammals 클래스

public abstract class Mammals{
	// 울긴 우는데 소는 음메 개는 멍멍 하고 운다 그렇기 떄문에 아래와 같이 사용한다.
	public abstract void sound(); 
}

Dog 클래스

public class Dog extends Mammals {
	// sound 를 재정의 안하면 컴파일 에러 발생
	@Override
	public void sound(){
		System.out.println("멍멍");
	}
}

지금까지 추상 클래스를 알아봤다. 추상 클래스 또한 위처럼 사용될때 다형성을 위해 사용되는것을 확인할 수 있었다. 이번 포스트에선 사실 개념보다 왜 abstract class를 사용하는지 그 이유에 대해 이해하는것이 중요한 포스팅이라고 생각된다.

Categories:

Updated: