평범한 연구소

[JAVA] 추상화 abstract 본문

JAVA/기본 개념

[JAVA] 추상화 abstract

soyeonisgood 2022. 7. 27. 23:07

추상클래스

  • 추상클래스(abstract 클래스)는 선언만 있고 정의가 없는 하나 이상의 추상 메소드를 갖는 클래스.
  • 하위클래스에서 재정의(overriding) 할 것으로 예상되는 메소드에 대해 메모리 낭비 없이 미리 호출 계획을 세워 두기 위해 작성
  • 적어도 하나의 추상메소드를 포함할 때, 해당 클래스명 앞에 abstract 키워드로 명시해야함
  • final, static과 같이 사용 X
  • 추상메소드를 포함 할 수 있으나 반드시 포함하는 것은 아님, 일반 메소드로 정의 가능.
  • 추상메소드가 없는 추상클래스도 객체 생성 X
  • 독립적으로 존재X, 하위클래스를 가지고 하위클래스를 통해서만 객체 생성 가능. 추상클래스 객체 생성 X.
  • 추상클래스를 상속받은 하위클래스는 추상클래스가 아닌 경우, 반드시 모든 추상 메소드 재정의 해야함. 

 

추상클래스 예제

  • 추상클래스를 이용한 선택 정렬과 버블 정렬.
  • - 데이터: int[] data
  • - 기능(함수): 개수확인, 비교, swap, 정렬하는 알고리즘
  • 추상클래스는 추상메소드가 있어야함
  • 추상클래스 SortInt 는 하위클래스인 SelectionSort, bubbleSort 를 통해서만 객체 생성 가능.
  • 반복적인 출력을 해야하므로 static print()를 생성하여 main()단에서 호출.
  • 추상클래스의 하위클래스 SelectionSort, bubbleSort 클래스에서는 추상클래스의 추상메소드 Sorting() 선언해야함. -> 다형성 구현
	public static void main(String[] args) {
		int[] num = new int[] {36, 8, 54,19,62,52};
		
		// SortInt ss = new SortInt(); // 컴파일오류. abstract 클래스는 객체생성불가
		// 추상 클래스는 반드시 하위 클래스가 존재하고, 하위클래스를 통해서만 객체 생성 가능
		
		// SortInt ss = new SelectionSort(); // up-casting
		SortInt ss = new BubbleSort(); // up-casting
		
		System.out.print("Source Date: ");
		print(num);
		
		ss.sort(num);
		
		System.out.print("Sort Date: ");
		print(num);
	}
	
	public static void print(int[] value) { // 출력 계속 해야하므로 static메소드로 만들면 static 메소드에서 계속 부를 수 있음
		for(int i=0; i<value.length; i++) {
			System.out.print(value[i] + "  ");
		}
		System.out.println();
	}
}


abstract class SortInt { // 추상화는 객체 만들 수 없음.
	private int[] value;
	
	// 추상메소드
	protected abstract void sorting(); 
	
	public void sort(int[] value) {
		this.value = value;
		
		sorting();
	}
	
	// 배열의 길이
	// final 메소드: 하위클래스에서 재정의 불가.
	protected final int length() {
		int n = -1;
		
		if(value != null)
			n = value.length;
		
		return n;
	}
	
	// 배열의 두 요소 값 비교
	protected final int compare(int i, int j) {
		return value[i] - value[j];
	}
	
	// 배열의 두 요소 값 서로 바꾸기
	protected final void swap(int i, int j) {
		int t = value[i];
		value[i] = value[j];
		value[j] = t;
	}
	
}

class SelectionSort extends SortInt {
	@Override
	protected void sorting() {
		for(int i=0; i<length(); i++) {
			for(int j=i+1; j<length(); j++) {
				if(compare(i,j) > 0) {
					swap(i, j);
				}
			}
		}
		
	}
	
}

class BubbleSort extends SortInt {
	
	@Override
	protected void sorting() {
		boolean flag = true;
		
		for(int i=1; flag; i++) {
			flag = false;
			for(int j=0; j<length()-i; j++) {
				if(compare(j, j+1) > 0) {
					swap(j,j+1);
					flag = true;
				}
			}
		}
	}
}

 

 

'JAVA > 기본 개념' 카테고리의 다른 글

[JAVA] 제네릭 generic  (0) 2022.08.03
[JAVA] 인터페이스  (0) 2022.07.27
[JAVA] 상속 | 오버라이딩 | 캐스팅  (0) 2022.07.25
[JAVA] StringBuilder, StringBuffer  (0) 2022.07.23
[JAVA] 기본 API | String 클래스 관련 함수  (0) 2022.07.23