Back/JAVA

상속 - 추상클래스(abstract class)

시월해 2021. 3. 12. 09:54

 * 추상클래스(abstract class)?
 1. 추상메서드를 포함하는 클래스.
 2. 추상메서드는 본체(body)가 없는 메서드.
     예) void display();   // {   }가 없다.
 3. 클래스 앞에 abstract 키워드가 온다.
 4. 추상메서드를 재정의하지 않으면 error 발생.
     ==> 추상메서드 재정의 강제성.
  5. 추상클래스는 객체 생성이 불가능.
     ==> 자식클래스를 대상으로 객체 생성.
  6. 추상클래스는 추상메서드를 가진 클래스를 말함.
  7. 물론 일반 멤버(멤버변수, 멤버메서드)를 가질 수 있음.
  8. 그러나 한 개 이상의 추상메서드는 반드시 존재해야 함.
     형식)
      [접근제한] abstract class 클래스명 {    }
  9. 용도 : 응용프로그램에서 설계와 구현 부분을 분리해서 작업 시 사용됨. 



  추상클래스에서 error 발생 ==> 해결방법 2가지
  1. 자식클래스에서 추상메서드를 재정의(O).
  2. 자식클래스에서 재정의하지 않는 경우
     ==> 자식클래스 이름 앞에 abstract 키워드를 붙여야 함. 

 


기본예제)

public abstract class Super {   // 부모 클래스 - 추상클래스

	int num1;          // 인스턴스 멤버변수
	
	int calc() {       // 인스턴스 멤버메서드
		int sum = num1 + 150;
		return sum;
	}
	
	abstract void output();   // 추상메서드
	

}
public class Sub extends Super {

	@Override
	void output() {
		System.out.println("추상메서드 재정의 했어요~~~");
	}
	

}
public class Ex01_Super {

	public static void main(String[] args) {
		
		// 추상클래스이기 때문에 객체 생성이 불가능.
		// Super super = new Super();
		
		// 자식클래스로 객체 생성
		Sub sub = new Sub();
		sub.num1 = 133;
		System.out.println("calc() 메서드 호출 >>> " + sub.calc());
		
		sub.output();   // 추상메서드에서 재정의된 메서드 호출

	}

}


예제1)

public abstract class Animal {

	abstract void sound();  // 추상메서드
	
}
public class Cat extends Animal {

	@Override
	void sound() {
		System.out.println("야옹야옹~~~");
	}

}
public class Dog extends Animal {

	@Override
	void sound() {
		System.out.println("멍멍멍~~~");
	}

}
public class Tiger extends Animal {

	@Override
	void sound() {
		System.out.println("어흥어흥~~~");
	}

}
public class Ex02_Animal {

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

	}

}


예제2)

public abstract class SmartPhone {

	// 공통적인 기능
	String call = "전화";
	String sns = "SNS";
	String search = "인터넷 검색";
	String game = "게임";
	
	// 각각의 기계(단말기)들의 특성
	String company, name, color, size, weight, price;
	
	void purpose() {
		System.out.println
		 ("사용목적 : "+call+" / "+sns+" / "+search+" / "+game);
	}
	
	// 각각의 단말기(기계)들의 spec
	abstract void spec();    // 추상메서드
}
public class Galaxy extends SmartPhone {

	@Override
	void spec() {
		company = "삼성"; name = "Galaxy Note 20"; color = "화이트";
		size = "20cm"; weight = "350g"; price = "150만원";
		
		System.out.println
		 (company+" / "+name+" / "+color+" / "+size+" / "+weight+" / "+price);
	}

}
public class IPhone extends SmartPhone {

	@Override
	void spec() {
		company = "애플"; name = "IPhone 11"; color = "화이트";
		size = "15cm"; weight = "200g"; price = "150만원";
		
		System.out.println
		 (company+" / "+name+" / "+color+" / "+size+" / "+weight+" / "+price);
		
	}

}
public class Ex03_SmartPhone {

	public static void main(String[] args) {
		
		Galaxy galaxy = new Galaxy();
		galaxy.purpose();
		galaxy.spec();    // 추상메서드 재정의한 메서드를 호출
		System.out.println();
		
		IPhone iPhone = new IPhone();
		iPhone.purpose();
		iPhone.spec();    // 추상메서드 재정의한 메서드를 호출

	}

}