package ex0726;

public class Ex01_abstract {
	public static void main(String[] args) {
		// SortInt si = new SortInt(); // 컴파일 오류. 추상 클래스는 객체 생성 불가.
		// 추상 클래스는 반드시 하위 클래스가 존재하고 하위 클래스를 통해서만 객체를 생성
		
		int[] data = new int[] {40,50,30,35,25};
		// SortInt si = new BubbleSort(); // 업캐스팅
		SortInt si = new SelectionSort();
		
		print("source data : ", data);
		
		si.sort(data);
		
		print("sort data : ", data);
		
	}
	
	public static void print(String title, int[] value) {
		System.out.print(title);
		for(int n : value) {
			System.out.print(n+" ");
		}
		System.out.println();
	}
}

추상 클래스 (abstract class)

  • 선언만 있고 정의가 없는 하나 이상의 추상 메소드를 갖는 클래스. 
  • 추상 메소드가 하나 이상 존재하는 경우 반드시 추상 클래스로 선언 해야 한다.
  • 하위 클래스에서 overriding할 것으로 예상되는 메소드를 메모리 낭비 없이 미리 호출 계획을 세워 두기 위해 작성한다.
  • 추상 클래스는 객체를 생성할 수 없다.
  • 추상 클래스를 상속 받은 하위 클래스는 추상 클래스가 아닌 경우 상위 클래스의 추상 메소드를 재정의 해야한다.
  • 추상 메소드가 없어도 추상 클래스로 작성할 수 있다. 
abstract class SortInt {
	private int[] value;
    
    protected abstract void sorting(); // 추상 메소드
    
    public void sort(int[] value) {
    	this.value = value;
        sorting();
    }
    
    // 배열의 길이
    protected int length() {
    	int n = -1;
        if(value != null) {
        	n = value.length;
        }
        return n;
    }
    
    // 두 정수 비교. final 메소드 - 하위클래스에서 재정의 불가
    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() - 1 ; 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 = 1; j < length() - i; j++) {
				if(compare(j, j + 1) > 0) {
					swap(j, j+1);
					flag = true;
				}
			}
		}
		
	}
}

+ Recent posts