[JAVA] abstract

Coastby·2022년 8월 7일
0

JAVA

목록 보기
18/33

abstract

abstract 클래스나 abstract 메소드는 바로 사용할 수 없으며 사용하기 위해서는 반드시 상속을 사용하도록 강제한다.

추상클래스를 인스턴스화할 수 없으며, 상속을 하고 상속한 클래스를 사용해야 한다.

추상메소드는 시그니처만 가지고 본체가 없다. (중괄호 안의 내용이 없다.) 상속을 한 클래스에서 메소드를 오버라이딩하여 구체적인 로직을 만들어줘야 한다.

메소드 중 하나라도 abstract이면 그것을 담고 있는 클래스는 자동으로 abstract가 된다. 추상클래스는 로직을 가지고 있는 메소드 (추상이 아닌 메소드)를 가지고 있을 수도 있다.

abstract class A {
	public abstract int b ();
	public void d () {
		System.out.println ("world");
	}
}

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

public class AbstractDemo {

	public static void main(String[] args) {
		//A obj = new A();
		B obj = new B();

	}

}

○ 상속을 강제하기 위한 규제

부모 클래스에는 메소드의 시그니처만 정의해놓고 그 메소드의 실제 동작 방법은 이 메소드를 상속 받은 하위 클래스의 책임으로 위임하고 있다. 공통적인 로직이외에 사용자가 직접 정의하여 사용하도록 한다. 보통 큰 프로젝트에서 사용된다.

상황에 따라 동작 방법이 달라지는 메소드는 추상 메소드로 만들어서 하위 클래스에서 구현하도록 하고 모든 클래스의 공통적으로 사용하는 메소드의 경우 상위 클래스에 두어서 코드의 중복, 유지보수의 편의성을 높여준다.

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

class CalculatorDecoPlus extends Calculator {
	public void sum() {
		System.out.println ("+ sum :" + _sum());
	}
	
	public void avg() {
		System.out.println ("- avg :"+(this.left+this.right)/2);
	}
}

public class CalculatorDemo {

	public static void main(String[] args) {
		CalculatorDecoPlus c1 = new CalculatorDecoPlus();
		c1.setOprands(10, 100);
		c1.run();
		
	}

}

○ 디자인 패턴

프로그래밍이라는 것은 반복되는 패턴이 있다. 위의 계산기는 template pattern이라고 한다.

이런 패턴을 모아서 정리한 것이 디자인 패턴 (design pattern)이다. 좋은 소프트웨어를 만들기 위한 설계로서 디자인이라는 표현을 쓰고 있는 것이다. 디자인 패턴의 장점은 크게 두 가지이다.

하나는 좋은 설계를 단기간에 학습할 수 있다는 점이다.

다른 하나는 소통에 도움이 된다는 점이다. 설계 방법을 토의하거나 전달할 때 설계 방법에 따라 적절한 이름이 있다면 상호간에 생각을 일치시키는 데 큰 도움이 될 것이다.

profile
훈이야 화이팅

0개의 댓글