본문 바로가기

자바

Abstract

1. 추상클래스의 문법

abstract class A {
	// 이렇게 메소드 표준만 구현하고 그 구체적인 내용은 요 메소드를 포함하는 클래스를 상속하는 클래스가 작성!
	public abstract int alpah();
	
	// 다음은 틀린 문법!
	/*
	 * public abstract void beta() { System.out.println("hello"); }
	 */
	
	// 추상 클래스내 일반 메소드 작성 가능!
	public void gamma() {
		System.out.println("안녕");
	}
}

 

이렇게 작성한 A를 구현하는 B는 반드시 구체적인 내용을 작성해야 한다.

class B extends A {
	public int alpah() {
		return 1;
	}
}

 

main 메소드에서는 추상 클래스인 A 클래스를 인스턴스화 할 수 없다.

public class AbstractDemo {
	public static void main(String[] args) {
		// 에러가 뜬다!
        A obj = new A();
	}
}

 

2. 추상 클래스를 사용하는 이유

상속을 강제한다.

하위클래스를 강제로 사용하게 함으로써, 공통된 로직은 중복이 안되게, 공통이 안 되는(개별적인) 로직만 따로 작성하기 위해서

 

예시

package org.opentutorials.javatutorials.abstractclass.example3;

public class CalculatorDemo {
	public static void main(String[] args) {
		CalculatorDecoPlus c1 = new CalculatorDecoPlus();
		c1.setOperands(10, 20);
		c1.run();
		
		CalculatorDecoMinus c2 = new CalculatorDecoMinus();
		c2.setOperands(10, 20);
		c2.run();
	}
}

abstract class Calculator {
	int left, right;
	
	public void setOperands(int left, int right) {
		this.left = left;
		this.right = right;
	}
	
	public abstract void sum();
	public abstract void avg();
	
	public void run() {
		sum();
		avg();
	}
}

class CalculatorDecoPlus extends Calculator {

	@Override
	public void sum() {
		System.out.println("+ sum :" + (this.left + this.right));
	}

	@Override
	public void avg() {
		System.out.println("+ avg :" + (this.left + this.right) / 2);
	}
	
}

class CalculatorDecoMinus extends Calculator {

	@Override
	public void sum() {
		System.out.println("- sum :" + (this.left + this.right));
	}

	@Override
	public void avg() {
		System.out.println("- avg :" + (this.left + this.right) / 2);
	}
	
}

 

일단 결과

+ sum :30
+ avg :15
- sum :30
- avg :15

 

설명

run() 메소드와 setOperands()를 추상클래스에 작성함으로써, Calculator를 상속하는 모든 클래스에 대해 공통적인 로직을 제공

 

그런데 예제를 보니 공통된 것이 보이지 않는가?

요것도 상위클래스로 올려버리자

 

 

소스출처 : 생활코딩

참고 : 생활코딩

'자바' 카테고리의 다른 글

출력 스트림  (0) 2020.09.06
입력 스트림  (0) 2020.09.06
인터페이스  (0) 2020.08.29
final  (0) 2020.08.28
접근 제어자  (0) 2020.08.28