실무 관점에서 본 인터페이스 vs. 추상 클래스 비교인터페이스와 추상 클래스는 객체지향 설계에서 핵심적인 개념이며, 실무에서는 상황에 따라 적절히 선택해야 합니다. 아래에서는 언제 인터페이스를 사용하고, 언제 추상 클래스를 사용하는지, 그리고 실제로 더 자주 사용하는 개념과 그 이유를 정리해 보겠습니다.🚀 인터페이스 vs. 추상 클래스 실무 비교비교 요소 인터페이스 (Interface) 추상 클래스 (Abstract Class)상속 구조다중 구현 가능 (클래스는 여러 개의 인터페이스를 구현 가능)단일 상속만 가능 (다른 클래스를 동시에 상속받을 수 없음)상태(State) 유지불가능 (멤버 변수 선언 불가, Java 8 이후 default 메서드로 일부 구현 가능)가능 (멤버 변수 선언 및 상태 유지 가..
1. 인터페이스란 무엇인가?인터페이스(Interface)는 자바의 핵심 개념 중 하나로, 클래스가 구현해야 하는 메서드의 명세를 정의하는 추상적인 타입이다. 인터페이스는 다음과 같은 특징을 갖는다.메서드의 시그니처만 정의하고, 구체적인 구현은 제공하지 않는다.메서드의 시그니처 : 메서드의 이름과 그 메서드가 받을 파라미터의 종류 및 개수를 의미다중 구현(multiple inheritance)을 가능하게 한다.다중 구현 : 한 클래스가 두 개 이상의 부모 클래스를 상속받는 개념구현 클래스의 계약(Contract) 역할을 수행하여 코드의 유연성과 확장성을 높인다.계약 : 특정 규칙을 지켜야 한다는 약속을 의미인터페이스를 구현한 클래스는 반드시 메서드들을 구체적으로 구현해야 한다는 규칙(계약)을 지켜야 한다...
앞서 세웠던 리팩토링 방향성에 대해직접 리팩토링하면서 배운 점과 느꼈던 점에 대해 작성해보려고 한다. 리팩토링을 통해 해당 프로젝트에서 얻고자 했던 것들이 몇 가지 있었다. 도메인 계층을 분리하여 비즈니스 로직을 보다 명확히 이동시키기데이터(DB)에 의존적인 코드가 아닌, 비즈니스 로직 중심의 코드로 변경하기의존성 역전 원칙(DIP)을 적용하여, 의존성을 낮추고 테스트에 용이한 코드로 변경하기 왜 리팩토링이 필요한가?이전에 작성했던 글에서는 리팩토링의 방향성만 정의하고,왜 그 방향성을 선택했는지에 대한 설명이 부족했던 것 같다.이번 글에서는 그 이유를 먼저 언급하고자 한다. 의존성 역전 원칙(DIP)을 적용하여, 의존성을 낮추고 테스트에 용이한 코드로 변경하기 리팩토링 방향성을 설정할 때, 가장 먼저 ..
이전 글에서 주저리 주저리 일대기까지 쓰면서마지막에 외주 프로젝트 관련 느꼈던 고민거리나 문제들을 해결하고자,우선 리팩토링부터을 진행하고자 한다. 일단 리팩토링을 하려고 하는 이유현재 구현에 급급해서 객체지향적인 코드보단 절차지향적인 코드로 구현되어있다.(이는 책을 통해서도 많이 깨달았는데.)그 때문인지 테스트 작성를 짜는데에 있어서 의존성 및 여러 역할과 책임이 제대로 분리되지 않아서 어려움이 있다. 테스트 작성 시 의존성 관련해서 어려움을 겪고 있다면,설계에 대한 문제의 가능성이 있다고 알려주는 경우가 많다고 한다. 그렇기에 객체지향적이면서 SOLID한 코드로 이번에 리팩토링하려고 한다. 리팩토링으로 얻고자 하는 것- 객체지향적 + SOLID한 코드를 만들어 유지보수가 수월하도록 하기 위함- 데이..
(복습) 스프링 트랜잭션 전파 - 트랜잭션 (각각) 두 번 사용트랜잭션이 각각 따로 사용되는 경우 :하나의 트랜잭션이 완전히 끝나고 나서 다음 트랜잭션을 수행한다. 예시 코드@Testvoid double_commit() { log.info("트랜잭션1 시작"); TransactionStatus tx1 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션1 커밋"); txManager.commit(tx1); log.info("트랜잭션2 시작"); TransactionStatus tx2 = txManager.getTransaction(newDefaultTransactionAttribute..