📚 Study/Java
JAVA :: Test115_추상 클래스(abstract)
bono-hye
2023. 9. 14. 23:11
○ 추상 클래스(abstract)
- 선언만 있고 정의가 하나 이상의 메소드(추상 메소드)를 갖는 클래스로 하위 클래스(자식 클래스)에서 오버라이딩(Overriding) 할 것으로 예상되는 메소드에 대해 메모리 낭비 없이 호출 계획을 세워두기 위해 만든다.
○ 형식 및 구조
[접근제어지시자] abstract class 클래스명
{
[접근제어지시자] abstract 자료형 메소드명([매개변수],...);
}
○ 특징
- 클래스가 적어도 하나 이상의 추상 메소드를 포함할 때 그 클래스는 클래스 앞에 『abstract』 키워드를 붙여 추상 클래스로 명시해야 하며, 추상 클래스로 선언한 경우에는 불완전한 형태의 클래스이므로 객체를 생성할 수 없다. 추상 메소드가 존재하지 않는 추상 클래스마저도 객체를 생성할 수 없다.
- 즉, 추상 클래스는 독립적으로 존재할 수 없기 때문에 상속을 위해서만 존재하며 추상 클래스를 상속받은 하위클래스에서는 반드시 추상 메소드를 오버라이딩(Overriding) 해야 한다. → 하위클래스에서 인스턴스 생성을 가능하게 하기 위해
- 『abstract』 키워드는 클래스와 메소드에서만 사용할 수 있으며 멤버 변수나 로컬 변수에서는 사용할 수 없다.
// 추상 클래스
//class SortInt115
abstract class SortInt115
{
private int[] value;
protected void sort(int[] value)
{
this.value = value;
sorting();
}
// 추상 메소드
//protected void sorting();
protected abstract void sorting();
protected int dataLength()
{
return value.length;
}
// 『final』 키워드로 인해
// 이 클래스(SortInt115)를 상속받는 클래스에서
// 이 메소드를 재정의(Method Overriding)할 수 없다.
protected final int compare(int i, int j)
{
int x = value[i];
int y = value[j];
if (x==y)
return 0;
else if (x>y)
return 1;
else
return -1;
}
// 『final』 키워드로 인해
// 이 클래스(SortInt115)를 상속받는 클래스에서
// 이 메소드를 재정의(Method Overriding)할 수 없다.
protected final void swap(int i, int j)
{
int temp = value[i];
value[i] = value[j];
value[j] = temp;
}
}// end SortInt115
//public class Test115
//public class Test115 extends SortInt115
// SortInt115(추상 클래스)를 상속 받은 클래스 → 일단은 추상 클래스
// public abstract class Test115 extends SortInt115
// SortInt115(추상 클래스)를 상속 받은 클래스 → 일단은 추상 클래스 → 추상메소드 재정의 → 일반 정상 클래스
public class Test115 extends SortInt115
{
/*
protected void sort(int[] value)
{
this.vaulue = value;
sorting();
}
// 추상 메소드
protected abstract void sorting();
protected int dataLength()
{
return value.length;
}
protected final int compare(int i, int j)
{
int x = value[i];
int y = value[j];
if (x==y)
return 0;
else if (x>y)
return 1;
else
return -1;
}
protected final void swap(int i, int j)
{
int temp = value[i];
value[i] = value[j];
value[j] = temp;
}
*/
int i, j;
static int[] data = {7, 10, 3, 28, 7};
/* 내가 작성한 코드-------------------------------
@Override
protected void sorting()
{
for (i=0; i<dataLength()-1; i++ )
{
for (j=i+1; j<dataLength(); j++)
{
if (compare(i, j) == 1)
{
swap(i, j);
}
}
}
}
-------------------------------------------------*/
// 같이 작성한 코드
@Override
//protected abstract void sorting()
protected void sorting()
{
// selection sort
for (i=0; i<dataLength()-1; i++)
{
for (j=i+1; j<dataLength(); j++)
{
// 크기 비교
if (compare(i, j) == 1)
{
// 자리 바꿈
swap(i,j);
}
}
}
}
public static void main(String[] args)
{
System.out.print("Source Data : ");
for (int n : data )
System.out.print(n + " ");
System.out.println();
Test115 ob = new Test115();
ob.sort(data);
System.out.print("Sorted Data : ");
for (int n : data)
System.out.print(n + " ");
System.out.println();
}
}
// 실행 결과
/*
Source Data : 7 10 3 28 7
Sorted Data : 3 7 7 10 28
계속하려면 아무 키나 누르십시오 . . .
*/