수를 요소로 갖는 배열을 입력받아 각 요소들이 그 이전의 요소들의 합보다 큰지 boolean 타입으로 리턴하라.
package CodeStatesAlgorithms;
public class SuperIncreasing {
public boolean superIncreasing(int[] arr) {
int sum =arr[0];
for(int i=1; i<arr.length; i++){
if(arr[i]<=sum) return false;
sum += arr[i];
}
return true;
}
}
//입력
superIncreasing.superIncreasing(new int[] {1, 2, 4, 8, 15})
//출력
false
/, % 연산자 사용하지 않고 num1을 num2로 나눈 나머지 구하기
public class Division {
public Integer modulo(int num1, int num2) { // 연산자 /, %를 사용하지 않고 num1을 num2로 나눈 나머지 구하기
if(num2 == 0) return null;
int result = num1;
while(result>=num2){
result -= num2;
}
return result;
}
}
소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것
(프로그래밍을 하기 위한 틀이나 구조를 제공하는 것)
ex. 인터페이스(Interface), 추상클래스, Collections Framework
장점
단점
애플리케이션을 개발하는 데 사용되는 일련의 데이터 및 프로그래밍 코드
(애플리케이션을 개발할 때 필요한 기능을 미리 구현해놓은 집합체)
한번 정해진 Framework를 교체하는일은 어렵지만, Library는 쉽게 교체가 가능하며 필요한 Library들을 선택적으로 사용할 수 있다.
=> 애플리케이션에 대한 제어권의 차이가 있다.
미리 작성해둔 것을 사용하는 점에서 Framework와 Library가 비슷한 것이 아닌가 하는 의문이 생길 수 있지만 Framework(틀)에 사용자가 코드를 작성하는 것(미리 짜둔 틀에 맞춰 살을 붙여 완성 시키는 것)과 코드를 작성하기 위해 Library(미리 만들어 둔 도구)를 사용하는 것은 다른 것 이다.
웹 애플리케이션을 개발하기 위한 여러 Framework들 중에 하나
1,2,3번 장점의 경우 링크 참조(아래서 추가 설명)
객체 지향 설계 원칙에 잘 맞는 스킬을 향상시킬 수 있다.
보다 나은 성능과 서비스의 안전성이 필요한 복잡한 기업용 엔터프라이즈 시스템을 제대로 구축하기 위한 능력을 기를 수 있다.
POJO라는 것을 IoC/DI, AOP, PSA를 통해서 달성할 수 있다는 것을 의미
Java로 생성하는 순수한 객체를 의미
[ JO(Java Object) = 객체지향이라는 의미 ]
POJO 프로그래밍 = 순수 Java 객체가 다른 기술이나 환경에 종속되지 않도록 하기 위한 프로그래밍 기법
Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
특정 환경에 종속적이지 않아야 한다.
- Spring은 POJO 프로그래밍을 지향하는 Framework다.
- IoC/DI, AOP, PSA는 다른 환경이나 기술에 종속적이지 않도록 하기 위한 기술이다.
애플리케이션 흐름의 주도권이 뒤바뀐 것
- 애플리케이션 흐름의 주도권이 사용자에게 있지 않고, Framework이나 서블릿 컨테이너 등 외부에 있는 것
의존성 주입
(IoC 개념을 조금 구체화 시킨 것)
- 객체 간의 관계를 느슨하게 해준다.
클래스 내부에서 다른 클래스의 객체를 생성하게 되면 두 클래스 간에 의존 관계가 성립한다.
클래스 내부에서 new를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달 받고 있다면 의존성 주입이 이루어 지고 있는 것이다.
public static void main(String[] args) { MenuService AAA = new MenuService(); MenuControl menuControl = new MenuControl(AAA); } // MenuControl class가 MenuService class에 의존하도록 함.
클래스의 생성자로 객체를 전달 받는 코드가 있다면
=> 객체를 외부에서 주입 받고 있다.
=> 의존성 주입이 이루어 지고 있다.
위와 같이 new 키워드를 사용하여 객체를 생성할 때, 클래스 간에 강하게 결합(Tight Coupling)되어 있다고 한다.
어떤 클래스가 인터페이스 같이 일반화 된 구성 요소에 의존하고 있을 때, 클래스들 간에 느슨하게 결합(Loose Coupling)되어 있다고 한다.
여기까지 java만으로도 가능
객체들 간의 느슨한 결합은 요구 사항의 변경에 유연하게 대처할 수 있도록 해준다.
애플리케이션 코드 내부에서 직접적으로
new
키워드를 사용할 경우 객체지향 설계의 관점에서 문제가 발생할 수 있기 때문에new
키워드 사용하지 않으며 의존성 주입을 하도록 지양해야 한다.
(cf. spring 기능 중 하나인Config
클래스를 이용해 위 조건을 만족하며 DI 가능.)
의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다.
Q: 학습자료 내용 중 의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다.
가 이해가 되지 않습니다. 강한 결합 상태로도 의존성 주입이 가능하지 않나요?
(ex. new 두번 써서 클래스에 클래스 넣기)
new를 사용하는 등 방법으로 강한 결합 상태로도 의존성 주입이 가능하지만 애플리케이션 코드 내부에서 직접적으로 new 키워드를 사용할 경우 객체지향 설계의 관점에서 문제가 발생할 수 있기 때문에 new 키워드를 사용하지 않으며 느슨한 결합 상태로 의존성 주입을 하도록 지향해야 한다.
라고 이해 했는데 잘못된 이해일까요?
A: 이해한게 맞다. 그런데 아래 내용을 추가해주면 더 좋은 정리가 될 것 같다.
[ 관심 지향 프로그래밍 ]
애플리케이션의 핵심 업무 로직과 공통 기능 로직들을 분리하는 기능
- 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것
- 클라이언트가 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것
건축 분야에서 유래된 용어로써 요구 사항을 만족하는 건축물을 짓는데 있어 청사진 같은 역할
- 컨셉 잡기 정도
- 너무 복잡하면 안됨 (최대한 심플함을 유지)
하드웨어와 소프트웨어를 모두 포함하는 어떤 시스템의 전체적인 구성을 큰그림으로 표현한 것
API 계층(API Layer)
서비스 계층(Service Layer)
데이터 액세스 계층(Data Access Layer)
Spring Framework에서는 약 20여개의 모듈을 통해 다양한 기능들을 제공한다.
Spring 설정의 복잡함이라는 문제점을 해결하기 위해 생겨난 Spring Project 중 하나
XML 기반의 복잡한 설계 방식을 지양한다.
starter 모듈 구성 기능을 통해 의존 라이브러리를 자동으로 구성해준다.
애플리케이션 설정의 자동 구성
프로덕션급 애플리케이션의 빌드를 손쉽게 할 수 있다.
내장된 WAS를 사용가능하기 때문에 배포가 용이하다.