본문 바로가기

Programming/자바

생활코딩 자바 - abstract

: 상속 클래스를 만들어, 그 클래스를 사용하도록 강제함

 

문법

 

  • 상속 클래스 없을 때 오류

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

public class AbstractDemo {

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

}

}

 

 

  • 상속 but 메소드 오버라이딩 x

abstract class A{
public abstract int b();    => 메소드의 구체적 로직을 담는 본체 없고, 메소드에 대한 시그니처만 갖고 있는 추상적인 모습     => 반드시 메소드를 오버라이딩해야 함
public void d() {
System.out.println("world");
}
}

class B extends A {}

public class AbstractDemo {

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

}

}

 

 

  • abstract 메소드 오버라이딩

abstract class A{    //메소드 중 하나라도 abstract면 그 클래스는 abstract 클래스
public abstract int b();    //본체 있는 메소드는 abstract 키워드 사용 불가 ex. public abstract int c(){System.out.println("hi")}
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) {
B obj = new B();

}

}

 

 

=> 구체적인 구현은 사용자에게 넘기는 것

 

 

사용 이유

 

부모 클래스 내 메소드의 시그니처만 정의하고, 그 메소드의 실제 동작 방법은 하위 클래스의 책임으로 위임함

=> 큰 프로젝트에서 사용됨

 

  • 계산기 예제 활용
abstract class Calculator{
int left, right;
public void setOprands(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 {
public void sum(){
System.out.println("+ sum :"+(this.left+this.right));
}
public void avg(){
System.out.println("+ avg :"+(this.left+this.right)/2);
}
}
class CalculatorDecoMinus extends Calculator {
public void sum(){
System.out.println("- sum :"+(this.left+this.right));
}
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, 20);
c1.run();
 
CalculatorDecoMinus c2 = new CalculatorDecoMinus();
c2.setOprands(10, 20);
c2.run();
}
 
}

 

  • 중복 제거
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);
}
}
class CalculatorDecoMinus 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, 20);
c1.run();
 
CalculatorDecoMinus c2 = new CalculatorDecoMinus();
c2.setOprands(10, 20);
c2.run();
}
 
}

 

디자인 패턴

template method pattern

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

생활코딩 자바 - 인터페이스  (0) 2022.04.08
생활코딩 자바 - final  (0) 2022.04.08
생활코딩 자바 - 접근제어자  (0) 2022.04.07
생활코딩 자바 - API  (0) 2022.04.07
생활코딩 자바 - 패키지 ??  (0) 2022.04.07