Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

115 - Java 추상 클래스(abstract) : 추상 클래스를 자식 클래스에서 상속 받아 추상 메소드를 Overriding 함으로써 제대로된 클래스로서(설계도) 동작할 수 있도록 하는 프로그램 본문

[Java]/Program source (java)

115 - Java 추상 클래스(abstract) : 추상 클래스를 자식 클래스에서 상속 받아 추상 메소드를 Overriding 함으로써 제대로된 클래스로서(설계도) 동작할 수 있도록 하는 프로그램

Jelly-fish 2023. 9. 13. 16:15
/*===========================
  ■■■ 클래스 고급 ■■■
  - 추상 클래스(abstract)
=============================*/


/*
○ 추상 클래스(abstract)는

	선언만 있고 정의가 없는 하나 이상의 메소드(추상 메소드)를 갖는 클래스로
	하위 클래스(자식 클래스)에서 오버라이딩(Overriding)할 것으로 예상되는 메소드에 대해
	메모리 낭비 없이 미리 호출 계획을 세워두기 위해 만든다.


○ 형식 및 구조

	[접근제어지시자] abstract class 클래스명
	{
	   [접근제어지시자] abstract 자료형 메소드명([매개변수], ...);
	}


○ 특징

	클래스가 적어도 하나 이상의 추상 메소드를 포함할 때
	그 클래스는 클래스 앞에 『abstract』 키워드를 붙여 
	추상 클래스로 명시해야 하며,
	추상 클래스로 선언한 경우에는
	불완전한 형태의 클래스이므로 객체를 생성할 수 없다.
	추상 메소드가 존재하지 않는 추상 클래스마저도
	객체를 생성할 수 없는 것이다.

	즉, 추상 클래스는 독립적으로 존재할 수 없기 때문에
	상속을 위해서만 존재하며
	추상 클래스를 상속받은 하위 클래스에서는
	반드시 추상 메소드를 오버라이딩(Overriding)해야 한다.


※ 『abstract』 키워드는
	클래스와 메소드에서만 사용할 수 있으며
	멤버 변수나 로컬 변수에서는 사용할 수 없다.



*/


// 클래스 내부에서 필요한 메소드를, 설계 없이 선언만 함...  → 객체 생성(인스턴스) 불가.
// public 『 abstract 』 class Test105(추상 메소드를 포함하므로, 클래스의 접근제어지시자 뒤에 abstract 표시! 
//	{
//		『 abstract 』 + 접근제어지시자 리턴자료형 메소드명(); : 추상 메소드 표시!
//	}

// 추상 클래스 - 미완성된 설계도 = 부품이 들어갈 곳을 비워둔다! → 자식클래스가 오버라이딩! 미리 호출 계획...
// 메소드 100개 중에 추상 메소드 하나만 갖고 있어도... 추상 클래스!!

// 추상클래스인 부모를 extends 해서 상속받으면, 자식 클래스도 추상 클래스가 된다! abstract!
// 자식 클래스가 다시 독립적으로 인스턴스 생성 가능하게 하려면, 부모 클래스로부터 물려받은 추상 클래스를
// Method Overring 하여 제대로 동작할 수 있도록 해야 한다!!
// 부모로부터 물려받은 abstract 메소드3();
//				↓
// @Override
//	메소드3()
//  {
//     메소드3 Overriding!!
//  }

// 추상 클래스 
//class SortInt115
abstract class SortInt115
{
	private int[] value;

	protected void sort(int[] value)
	{
		// 매개변수로 입력받은 정수형 배열을
		// private value 배열에 저장하고
		// sorting 메소드를 실행하는 메소드...
		this.value = value;
		sorting();	// ← 원래 abstract였던 메소드를 작동할 수 있도록 구성한 후
					//    sort(int[] value) 메소드 내부에서 정렬하여
					//    value[] 배열에 오름차순으로 정리할 수 있도록 하는 것!!!
	}

	// 추상 메소드
	//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)
	{
		// 입력받은 i, j를 인덱스로 사용하여
		// value[i]와 value[j]의 대소비교를 한뒤
		// 같으면 0, value[i]가 크면 1, value[j]가 크면 -1을
		// 반환하는 메소드
		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)
	{
		// 입력받은 i, j를 인덱스로 사용하여
		// value 배열의 요소를 서로 자리바꿈 하는 메소드
		int temp = value[i];
		value[i] = value[j];
		value[j] = temp;
	
	}


}//end SortInt115


//public class Test115 
//public class Test115 extends SortInt115

// SortInt115(추상 클래스)를 상속받은 클래스 → 일단은 추상 클래스 → 추상메소드 재정의 → 일반 정상 클래스
public class Test115 extends SortInt115
{
	/*


	protected void sort(int[] value)
	{
		this.value = 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};

	// 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
	// 부모 클래스에서 물려받은 abstract method(추상 메소드)를
	// 메소드 오버라이딩(Method Overriding)을 통해 제대로 동작하도록 구성!
	// 더 이상 Test115는 추상 클래스가 아니므로, abstract를 제거해 준다~~~
	// 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓


	@Override
	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);
				}
			}
		}
	}

	/* [내가 한 풀이]===================
	@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);
				}
			
			}//end for j
		
		}//end for i
	


	}//end sorting()
	====================================*/
	


	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
계속하려면 아무 키나 누르십시오 . . .
*/