카테고리 없음

(3/20) [좌표계산기]: abstract class, interface 연습

지기_ 2021. 12. 1. 12:11

훈련 목표:  상속과 인터페이스를 연습한다. 리펙터링.

 


 

[ 규칙 ]

- 한 줄에 점을 하나만 찍는다

( 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다. 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다 )

디미터의 법칙 어김
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

- 엔티티를 작게 유지한다

- 클래스 변수는 2개(이하)로 유지

- Getter, Setter, Property를 쓰지 않는다.

 

자료 전달 객체(DTO) java에서는 자바빈이 일반적이며  함수 없이 공개 변수만 있다.

 

- 클래스를 만들 때 첫 번째 규칙은 크기다. 클래스는 작아야 한다. 

- 단일 책임 원칙(Single Responsibility Principle, SRP)은 클래스나 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙

- 응집도(cohesion) - 클래스는 인스턴스 변수 수가 작아야 한다.

- 큰 함수를 작은 함수 여럿으로 쪼개다 보면 종종 작은 클래스 여럿으로 쪼갤 기회가 생긴다. 그러면서 프로그램에 체계가 더 잡히고 구조가 더 투명해진다.

 

- 요구사항은 변화기 마련이다. 따라서 코드도 변하기 마련이다.

- 변화에 따르게 대응하려면 DIP 원칙을 지키는 습관

- DIP(Dependency Inversion Principle) 원칙은 클래스가 상세한 구현이 아니라 추상화(인터페이스)에 의존해야 한다는 원칙

- 테스트가 가능할 정도로 시스템 결합도를 낮추면 유연성과 재사용성도 더 높아진다.

 

 


자바상속

 

추상화:

중복되는 코드를 별도의 클래스로 분리해서 개별 클래스가 extends로 상속받게 한다.

 

abstract
추상 클래스.

new keyword를 통해 객체를 직접 생성할 수 없다.
메소드에 abstract를 사용할 경우 interface의 메소드와 같이 구현 부분은 없다.
abstract로 선언한 메소드를 자식 클래스에서 반드시 구현해야 한다.

public abstract class CaffeineBeverage {
    abstract void brew();
    
    abstract void addCondiments();
    
    void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
    
    protected void boilWater() {
        System.out.println("물을 끓인다.");
    }

    protected void pourInCup() {
        System.out.println("컵에 붓는다.");
    }
}

 

public class Coffee extends CaffeineBeverage {
    public void brew() {
        System.out.println("필터를 활용해 커피를 내린다.");
    }

    public void addCondiments() {
        System.out.println("설탕과 우유를 추가한다.");
    }
}

 

public class Coffee extends CaffeineBeverage {
    public void brew() {
        System.out.println("필터를 활용해 커피를 내린다.");
    }

    public void addCondiments() {
        System.out.println("설탕과 우유를 추가한다.");
    }
}

 


자바 Interface

자바를 기반으로 하는 소프트웨어는 DB 종류는 고려하지 않고 인터페이스만 지키면서 구현을 하면 추후 DB가 변경되더라도 소스 코드를 수정하지 않아도 된다. ==> JDBC 덕분에!

 

인터페이스(interface)
interface는 자바에서 한 단계 더 높은 추상화를 하기 위해 사용된다.
interface는 구현 로직은 존재하지 않으며 메소드에 대한 입력(input), 출력(output)만 정의하고 있다.
interface를 활용해 추상화를 하는 이유는 소프트웨어에 변경이 발생할 경우 소스 코드에 변경을 최소화함으로써 유지보수 비용을 줄이고, 변화에 빠르게 대응하기 위함이다.
추상화를 함으로써 미래의 변화에 빠르게 대응할 수 있지만 추상화를 하려면 추상화에 따른 개발 비용이 발생한다.

** 이해 더 필요..

 


연료주입 과제 github: https://github.com/erie0210/java-coordinate-playground