본문 바로가기
Programing/JAVA (& 혼공자Java)

자바(Java) - 추상 클래스

by a.k.a DUKI 2020. 11. 9.
728x90
반응형

사전적 의미로 추상(abstract)는 실체 간에 공통되는 특성을 추출한 것을 말한다. 클래스에서도 추상 클래스가 존재한다.

 

추상 클래스

  • 클래스들의 공통적인 특성을 추출해서 선언한 클래스

  • 실체 클래스(객체 생성용 클래스)들의 공통적인 특성(필드, 메소드)을 추출하여 선언한 것이다.

  • 추상클래스와 실체 클래스는 상속의 관계를 갖고 있다. 추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성을 갖을 수 있다.

혼공자 유툽 참고

추상 클래스의 용도

실체 클래스에 반드시 존재해야할 필드와 메소드의 선언(실체 클래스의 설계 규격-객체생성용이 아니다)

실체 클래스에는 공통된 내용은 빠르게 물려받고, 다른 점만 선언하면 되므로 시간 절약을 할 수 있다.

공통된 필드와 메소드의 이름을 통일할 목적

실체 클래스를 설계하는 사람이 여러 사람일 경우 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.  이렇게 코딩하면 이해하기도 어렵고 관리가 어렵게 된다. 추상클래스에 필드와 메소드를 선언하고 실체 클래스에서 상속하여 필드와 메소드 이름을 통일 할 수 있다.

 

실체 클래스를 작성할 때 시간 절약

공통적인 필드와 메소드는 추상적인 클래스에 모두 선언하고, 다른 점만 실체 클래스에 선언하면 실체 클래스를 작성하는데 시간을 절약 할 수 있다.

 

일반적으로 개발 프로젝트에서 설계자와 코더는 다른 일을 수행한다. 설계자는 코더에게 클래스를 어떤 구조로 작성해야 한다는 것을 알려주어야 한다.

 

혼공자 유툽 참고
혼공자 유툽 참고

 

추상 클래스 선언

추상 클래스를 선언할 때는 클래스 선언에 abstract를 붙여야한다.

abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.

public abstract class 클래스{
	//필드
    //생성자
    //메소드
 }

추상 클래스도 일반 클래스와 만찬가지로 필드, 생성자, 메소드 선언 할 수 있다.

직접 객체를 생성할 수 없지만, 자식 객체 생성될 때 객체화 된다.

자식 생성자에서 super(....) 형태로 추상 클래스의 생성자 호출한다.

 

 

예시1) 추상 클래스

추상 클래스

public abstract class Phone { // 추상 클래스
	// 필드
	public String owner;

	// 생성자
	public Phone(String owner) {
		this.owner = owner;
	}

	// 메소드
	public void turnOn() {
		System.out.println("폰 전원을 킨다.");
	}

	public void turnOff() {
		System.out.println("폰 전원을 끈다.");
	}
}

실체 클래스

public class SmartPhone extends Phone {// 추상클래서 Phone을 상속받음
	// 생성자
	public SmartPhone(String owner) {
		super(owner);
	}

	// 메소드
	public void internetSearch() {
		System.out.println("인터넷 검색");
	}
}

실행클래스

public class PhoneEx {

	public static void main(String[] args) {

		// 추상 클래스라 new연산자로 객체를 만들지 못함.
		// Phone phone = new Phone();

		SmartPhone smartPhone = new SmartPhone("홍길동");

		smartPhone.turnOn();
		smartPhone.internetSearch();
		smartPhone.turnOff();
	}

}

추상 메소드와 재정의

추상 메소드

  • 메소드 선언만 통일하고 실행 내용은 실체 클래스마다 달라야하는 경우
  • 추상 메소드는, abstract 키워드로 선언되고 중괄호가 없는 메소드
  • 하위 클래스는 반드시 재정의해서 실행 내용을 채워야 한다.
[public | protected] abstract 리턴타입 메소드이름(매개변수, ...);
public abstract class Animal{
	public abstract void sound();
}

혼공자 유툽 참고

 

 

예시2) 추상 메소드와 재정의

추상 메소드 선언

public abstract class Animal { // 추상 클래스
	public String kind;

	public void breathe() {
		System.out.println("숨을 쉰다.");
	}

	// 추상메소드
	public abstract void sound();
}

추상 메소드 재정의

public class Dog extends Animal {
	public Dog() {
		this.kind = "강아지";
	}

	// sound() 추상 메소드 재정의
	// 재정의 안하면 오류남
	@Override
	public void sound() {
		System.out.println("왈왈");
	}

}

추상 메소드 재정의

 

public class Cat extends Animal {
	public Cat() {
		this.kind = "고양이";
	}

	// sound() 추상 메소드 재정의
	// 재정의 안하면 오류남
	@Override
	public void sound() {
		System.out.println("야옹");
	}
}

실행 클래스

 

public class AnimalEx {

	public static void main(String[] args) {
		Dog dog = new Dog();
		Cat cat = new Cat();

		dog.sound();
		cat.sound();
		System.out.println("--------------");

		// 변수의 자동 타입 변환
		Animal animal = null;
		// 자동 타입 변환 및 재정의된 메소드 호출
		animal = new Dog();
		animal.sound();
		// 자동 타입 변환 및 재정의된 메소드 호출
		animal = new Cat();
		animal.sound();
		System.out.println("-------------");

		// 메소드 다형성
		animalSound(new Dog()); // 자동 타입 변환
		animalSound(new Cat()); // 자동 타입 변환

	}

	public static void animalSound(Animal animal) {
		animal.sound(); // 재정의된 메소드 호출
	}

}

 

 

 


※용어 정리

  • 추상 클래스: 클래스들의 공통적인 필드와 메소드를 추출해서 선언한 클래스를 말한다.

  • 추상 메소드: 추상 클래스에서만 선언할 수 있고, 메소드의 선언부만 있는 메소드를 말한다. 추상 메소드는 자식클래스에서 재정의 되어 실행 내용을 결정해야 한다.

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.

 

728x90
반응형

댓글