상세 컨텐츠

본문 제목

JAVA 추상 메서드와 클래스 Abstract method, class

BackEnd/JAVA

by H_Develop 2022. 7. 28. 16:34

본문

메서드에서 수행할 작업을 완성시키지 않은 미완성으로 두고,

나중에 다른 클래스에서 이 메서드를 호출해서 재정의(Method Overriding)하여 사용하게 만드는 것으로,

전체 프로그래밍에서 일관성을 줄 수 있다.

추상클레스의 추상 메서드는 body가 없고, abstract로 시작한다.

 

추상 메서드는 작업을 구현하는 body가 없기 때문에 이를 "미완성적 개념"이라 한다.

그러므로 이 미완성적 메서드를 자식이 상속받아서 완성 시켜야한다는 것이 조건이다.

재지정해서 사용하지 않아도 무조건 자식은 상속받아서 객체로 가지고 있어야 한다.

 

abstract class AbsEx {
	int value = 100;
    final int VALUE2 = 1000; // 상수 이름은 보통 대문자로 정의
    
    public int getValue() {
    	return value;
    }
    abstract public void setValue(int n); // 추상 메서드, { } 속(body)에 하는 일이 없다.
}
class AbsChild extends AbsEx {
	int age = 10;
    @Override
    public void setValue(int n) {	// 부모 추상 클래스의 메서드를 호출해서 재지정
    	age += n;
    }
    public int getValue() {
		return age;
	}
}
class ex {
	public static void main(String[] args) {
    	// AbsEx a = new AbsEx();	추상클래스 객체 생성 불가.
        AbsChild a1 = new AbsChild();
        a1.setValue(20);
        System.out.println(a1.getValue());
    }
}

30 출력

 

 

 

abstract class AbsClass {	// 추상 클래스
	int value = 100;
    public int getValue() {
    	return value;
    }
    public abstract int changeValue();	// 추상 메서드
}
class AbsChild1 extends AbsClass {
	public int changeValue() {
    	return value += 10;
    }
}
class AbsChild2 extends AbsClass {
	public int changeValue() {
    	return value -= 3;
    }
}

class df {
	public void test(AbsClass n) {
    // 부모 클래스를 메서드의 인자로 사용, 모든 맴버들이 같이 사용될 수 있다.
    	System.out.println(n.changeValue());
    // 부모 클래스, AbsClass 의 changeValue() 메서드를 부름
    }
    public void test1 (AbsChild1 n) {
	System.out.println(n.changeValue());
	}
    
    public static void main(String[] args) {
    	AbsChild1 a1 = new AbsChild1();
        AbsChild2 a2 = new AbsChild2();
    	
        System.out.println(a1.changeValue());
		System.out.println(a2.changeValue());
		System.out.println();
		System.out.println(a1.getValue());	// a1.changeValue() 저장된 값 출력
		System.out.println(a2.getValue());	// a2.changeValue() 저장된 값 출력
		System.out.println();
        
        df t = new df();
        t.test(a1);
		// a1객체에 정의된 값에서 객체 생성 시, 
		// 정의된 Class인 AbsChild1 Class의 함수인 changeValue()를 실행시켜 값을 얻는다.
		t.test(a2);
		// a2객체에 정의된 값에서 객체 생성 시, 
		// 정의된 Class인 AbsChild2 Class의 함수인 changeValue()를 실행시켜 값을 얻는다.
		df t1 = new df();
		t1.test1(a1);
		// 똑같이 자식 클래스로 method를 생성해서 사용할 수 있으며,
		// a1.changeValue() 이렇게 미리 값을 넣어주지 않은 상태에서는 사용이 불가하다.
    }
}

관련글 더보기