추상화 클래스(abstract class)
- 불완전한 클래스로 완성되지 못한 메소드(abstract method)를 하나 이상 갖고 있는 클래스를 abstract class라고 합니다.
- abstract method : 메소드의 선언부만 있고, 정의되지 못한 메소드를 의미합니다.
ex) public abstract 리턴타입 메소드명(); -> 몸통(중괄호 부분)이 없습니다.
- 사용하는 이유 : 상속의 관계를 형성시키기 위한 상위클래스로 사용됩니다.
- 클래스이나 인스턴스를 생성할 수는 없습니다.
abstract class를 사용하려면 반드시 상속을 받아야 합니다.
- abstract class를 상속받은 클래스는 무조건 abstract class의 abstract method를 오버라이딩해서 구현해야 합니다.
구현하지 못하면 상속받은 하위클래스도 abstract class로 선언해야합니다.
- 문법
abstract class 클래스명 {하나 이상의 abstract 메소드, ...}
.
.
추상화 클래스에서 가장 중요한 것은 상속받은 클래스에는 무조건 abstract method를 사용하지 않더라도 오버라이딩해서 구현해야한다는 것이다.
하나라도 오버라이딩 하지 않는다면 abstract로 선언해야한다.
.
.
예제
abstract class PersonaleNumberStorage
{
public abstract void addPersonalInfo(String name, String perNum);
public abstract String searchName(String perNum);
}
class PersonalNumInfo
{
String name, number;
PersonalNumInfo(String name, String number){
this.name = name;
this.number = number;
}
String getName(){ return name; }
String getNumber(){ return number; }
}
class PersonaleNumberStorageImpl extends PersonaleNumberStorage
{
// PersonaleNumberStorage클래스를 상속받음
// 단, PersonaleNumberStorage클래스가 abstract클래스이므로 반드시 PersonaleNumberStorage클래스 내의 abstract메소드들을 모두 오버라이딩 해야함
// 하나라도 오버라이딩을 안하면 PersonaleNumberStorageImpl클래스도 abstract로 선언해야 함.
PersonalNumInfo[] perArr;
int numOfPerInfo;
public PersonaleNumberStorageImpl(int sz){
perArr = new PersonalNumInfo[sz];
numOfPerInfo = 0;
}
public void addPersonalInfo(String name, String perNum){
// abstract클래스인 personaleNumberStorage의 의 abstract메소드였던 addPersonalInfo를 오버라이딩 함.
perArr[numOfPerInfo] = new PersonalNumInfo(name, perNum);
numOfPerInfo++;
}
public String searchName(String perNum){
for (int i = 0; i < numOfPerInfo ; i++)
{
if (perNum.equals(perArr[i].getNumber()))
{
return perArr[i].getName();
}
}
return null;
}
}
class AbstractInterface
{
public static void main(String[] args)
{
PersonaleNumberStorage storage = new PersonaleNumberStorageImpl(100);
// PersonaleNumberStorage는 abstract클래스이므로 인스턴스의 생성은 personalNumberStorageImpl 클래스로 함
storage.addPersonalInfo("홍길동", "950000-1122333");
storage.addPersonalInfo("전우치", "970000-1122333");
System.out.println(storage.searchName("950000-1122333"));
System.out.println(storage.searchName("970000-1122333"));
}
}
728x90
반응형
'Java > 본격 Java 인터페이스' 카테고리의 다른 글
[Java] throw 예외처리 (0) | 2020.07.01 |
---|---|
[Java] 자주사용되는 예외 (0) | 2020.07.01 |
[Java] 예외처리 (0) | 2020.07.01 |
[Java] 인터페이스(interface) 다중 상속 (0) | 2020.07.01 |
[Java] Interface(인터페이스) (0) | 2020.07.01 |