추상 : 실체 간의 공통되는 특성을 추출한 것. ex) 고양이, 강아지, 새의 공통되는 특성을 추출할 시 동물이라 공통점이 있음. 여기서 동물이 실체들의 공통되는 특성을 가지고 있는 추상적인 것.
실체클래스 : 객체를 직접 실행할 수 있는 클래스
추상클래스 : 실체클래스들의 공통적인 특성(필드, 메소드)를 추출하여 선언한 것. 추상클래스와 실체클래스는 부모(추상) 자식(실체)클래스로서 상속 관계를 가짐.
추상클래스의 용도 1. 공통된 필드와 메소드의 이름을 통일할 목적 : 데이터와 기능이 동일함에도 불구하고 이름이 다르면 객체마다 사용방법이 달라지므로. 2. 실체 클래스를 작성할 때 시간 절약 : 공통적인 필드와 메소드는 추상클래스에 선언, 다른 점만 실체클래스에 선언 시 실체 클래스 작성 시간 절약 가능
추상클래스의 선언 : 클래스 선언이 abstract를 붙여야한다. abstract를 붙일 시 new연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.(부모로서의 역할만 수행). new연산자로 직접 객체를 생성할 수는 없지만, 자식 객체가 생성될 때 super(...)의 형태로 추상클래스의 객체를 생성할 수 있다. 추상 클래스도 일반 클래스와 마찬가지로 필드, 생성자, 메소드를 선언할 수 있다. ex) public abstract class 클래스{ //필드 //생성자 //메소드 }
추상 메소드와 재정의 : 메소드의 선언만 통일하고, 실행 내용은 실체 클래스마다 달라야하는 경우에 추상 클래스는 추상 메소드를 선언할 수 있다. 추상 메소드는 abstract 키워드로 선언되고 메소드 실행 내용인 중괄호가 없는 메소드이다. 추상 클래스 설계 시 반드시 실행내용을 채우도록 강제하고 싶은 메소드가 있을 경우 해당 메소드를 추상메소드로 선언하고, 하위클래스에서 재정의하여 실행내용을 채워야 컴파일 오류가 발생하지 않는다. ex)[public 또는 protected] abstract 리턴타입 메소드이름(매개변수,...);
ex)동물이 소리를 낸다는 공통적인 특징 규정하기 위한 추상메소드 public abstract class Animal { public abstract void sound(); }
publicclass AnimalEx { publicstaticvoid main(String[] args) { //일반적인 방식으로 Dog와 Cat변수 호출 Dog dog = new Dog(); Cat cat = new Cat(); dog.sound(); cat.sound(); System.out.println("-----");
//변수의 자동 타입 변환 //Animal변수로 타입 변환해서 sound()메소드 호출. 자식은 부모타입으로 자동타입변환 Animal animal = null; animal = new Dog(); animal.sound(); animal = new Cat(); animal.sound(); System.out.println("-----");