https://programmers.co.kr/learn/courses/30/lessons/12905

 

코딩테스트 연습 - 가장 큰 정사각형 찾기

[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9

programmers.co.kr

문제 설명
1로 구성된 가장 큰 정사각형의 넓이를 구하는 문제이다.
위와 같은 경우 답은 9이다.
문제풀이 방법
***DP문제****
우측 맨밑 좌표를 기준으로 넓혀가는 느낌...!
  1. 0이면 패스한다.
  2. 1이 나오면 왼쪽, 위, 왼쪽 대각선의 요소들을 검사한다.
Step1
- 1이 나오면 왼쪽, 위, 왼쪽 대각선의 요소들을 검사한다.
- 왼쪽, 위, 왼쪽 위 대각선에 값이 없으면 pass
- 0이 나오면 X
- 왼쪽, 위, 왼쪽 위 대각선에 값이 1이면 검사했던 값의 최소 값에서 +1 해준다.
0 1(pass)  1(pass) 1(pass)
1(pass) 1 1(->2) 1(->2)
1(pass) 1(->2) 1(->2) 1(->3)
0(pass) 1 1 0(pass)
Step2
- 해당 값은 정사각형의 한 번의 길이가 된다. 따라서 제곱을 하면 닶.
점화식
board[i][j] = min(board[i-1][j],board[i[[j-1],board[i-1][j-1]) +1;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int map[1001][1001] = {0,};
int solution(vector<vector<int>> board)
{
    int answer=board[0][0];
    int max = -987654321;
    for(int i = 1 ; i < board.size() ; i++){
        for(int j = 1 ; j < board[i].size() ; j++){
            if(board[i][j]==0)
                continue;
            if(board[i][j]==1){
                board[i][j] = min({board[i-1][j],board[i-1][j-1],board[i][j-1]})+1;
            }
            
            if(board[i][j] > max) {
                max = board[i][j];
            }
        }
    }
    if(max==-987654321){
        answer = board[0][0];
    }else{
        answer = max*max;
    }
    
    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    //cout << "Hello Cpp" << endl;

    return answer;
}

XML을 이용한 스프링 설정파일 제작을 Java 파일로 제작할 수 있는 방법에 대해서 학습

12-1-1 XML 파일을 Java 파일로 변경하기
기존방법 java 파일로 변경(어노테이션이용)

java config로 쓰는 방법
Annotation활용한다.

1) @Configuration
2) @bean

설정하기
AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(MemberConfig.class);
xml->java
  xml java
config


new

Java 파일 분리
여러 java로 config를 분리하여 유지보수를 쉽게 한다.
*일반적으로 기능에 따라서 분리한다. (Dao, Service, DB, Utills)
xml java
한개의 Config파일 다수의 Config파일
@Import 어노테이션
각각의 java config를 파일을 하나의 main에서 import 한다. 배열로 넣지않고 각각을 설정해주는 방식

config에서 import 해준다.
설정해준다.

 

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

스프링 MVC 웹서비스  (0) 2021.12.29
웹 프로그래밍 설계 모델(MVC)  (0) 2021.12.28
생명주기(Life Cycle)  (0) 2021.12.24
의존객체 선택  (0) 2021.12.24
의존객체 자동 주입  (0) 2021.12.23

스프링 컨테이너와 빈(Bean) 객체의 생명주기(Life Cycle)에 대해서 학습합니다. 

 

11-1 스프링 컨테이너 생명주기
스프링 컨테이너 생명주기 설명
생성 단계 : 스프링 컨테이너 생성, bean 의존성 주입 되어짐 따라서 스프링 컨테이너 생성과 bean객체 생성 시점은 동일하다.

getBean 단계 : 

소멸 : ctx.close(); 스프링 컨테이너, bean 객체의 메모리가 소멸된다. -> 자원을 해제 한다.

위와 같은 말
11-2 빈(Bean) 객체 생명주기
구현가능 설명
스프링 컨테이너는 2가지 (추상)인터페이스를 제공한다. (명시만 되어 있지 구현부는 없다)
1. InitializingBean
2. DisposalbleBean

그 이후 빈 객체에서 메서드 사용 가능
1. afterPropertiesSet
2. destory
11-3 init-method, destory-method 속성
설정 구현 설명
xml 설정에서 method를 만들어주고 service에서 구현하며 bean객체 생성 시점 소멸시점에 특정한 작업을 한다.
특정한 작업이 db연동 등이 있다.
xml이 아닌 implement를 해준다. 그리고 overide하여 해당 메서드에 특정한 작업을 수행한다.

 

다수의 빈(Bean)객체의존 객체의 대상이 되는 객체를 선택하는 방법에 대해서 학습한다.

  • 다수의 빈(Bean)이라서 모호한 것을 "어떤 것"을 @Autowired 할지를 명확하게 해주는 것을 의미한다.
10-1 의존객체 선택
Exception 상황 이유
동일한 객체가 2개 이상인 경우 스프링 컨테이너는 자동 주입 대상 객체를 판단하지 못해서 Exception을 발생시킨다.
해결방법
- @Qualifier : 우선자 어노테이션
10-2 의존객체 자동 주입 체크
의존객체가 없는 경우 Exception을 발생하지 않게 하는 방법
상황 solution
@Autowired(requried = false)
bean이 등록되어 있지 않아도 Exception을 발생시키지 않는다. 거의 이런 경우는 없을 것이다.
10-3 @Injection
Autowired 속성과 아예 똑같지만 requried를 제공하지 않는다. 왜 Autowired가 많이 쓰이는지 모르겠으나 아무튼 그렇다...

 

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27
생명주기(Life Cycle)  (0) 2021.12.24
의존객체 자동 주입  (0) 2021.12.23
스프링 설정 파일 분리  (0) 2021.12.23
스프링 강의노트  (0) 2021.10.22

의존객체를 자동으로 주입하는 방법에 대해서 학습합니다.

9-1 의존객체 자동 주입이란?
스프링 설정 파일에서 의존 객체를 주입할 때 <constructor-org> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능이다. 구현 방법은 @Autowired와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.
스프링 컨테이너 방법
@Autowired
@Resource

 

9-2 @Autowired
주입하려는 객체의 타이비 일치하는 객체를 자동으로 주입한다.
@Autowired사용시 주의할 점
생성자에는 Autowired 주는 것은 상관없는데 프로퍼티 또는 메서드에 @Autowired를 줄 때에는 반드시 기본 생성자(디폴트 생성자)를 명시해주고 사용한다. 이유는 간단하다. 다음과 같이 WordDao를 필요로하는 메서드인데 해당 객체가 없으면 의존성 주입이 어렵다. 
9-3 @Resource
주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입한다.
  • @Autowired랑 비슷하다.
  • 생성자에 쓰지 못한다.
  • 프로퍼티, 메서드에 쓸 수있다.
  • 기본생성자 필수이다.

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27
생명주기(Life Cycle)  (0) 2021.12.24
의존객체 선택  (0) 2021.12.24
스프링 설정 파일 분리  (0) 2021.12.23
스프링 강의노트  (0) 2021.10.22

목차로 돌아가기

스프링 설정파일 효율적으로 관리하기 위해서 설정 파일을 분리하는 방법에 대해 학습한다.

 

8-1 스프링 설정 파일 분리

파일 분리

appilcationContext를 appCtx1,2,3.xml로 분리했다. 

8-2 빈(Bean)의 범위

싱글톤(Singleton)
스프링 컨테이너에서 생성된 빈 (Bean) 객체의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성이 되며, getBean() 메소드로 호출될 때 동일한 객체가 반환된다.
  Spring Java
생성
new ClassName();
new ClassName();
new ClassName();
차이점 Spring Container는 처음 생성될 때 객체를 미리 생성한다. 따라서 getBean을 호출1, 호출2에서 각각 호출할 때 같이 "A" 객체를 바라본다. 기존 자바 코드에서 new를 할 때, 각각은 다른 메모리를 사용하여 객체를 생성한다. 
프로토타입(ProtoType)
싱글톤 범위와 반대의 개념, 프로토타입의 경우 개발자는 별도로 설정을 해줘야 하는데 스프링 설정 파일에서 빈(Bean) 객체를 정의할 때 scope속성을 명시해 주면 된다. scope="prototype"을 해주면 Spring Container의 객체를 참조하는 것 아닌 새로운 메모리의 객체를 생성하게 끔 해준다. (위의 기존 java처럼, 흔치 않음)
설정 호출 output

 

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27
생명주기(Life Cycle)  (0) 2021.12.24
의존객체 선택  (0) 2021.12.24
의존객체 자동 주입  (0) 2021.12.23
스프링 강의노트  (0) 2021.10.22
생성자 대신 정적 팩터리 메서드를 고려하라

클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 하지만 모든 프로그래머가 꼭 알아둬야 할 기법이 하나 더 있다. 클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다. 

//해당 메서드는 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 변환해준다.
public static Boolean valueOf(boolean b){
	return b ? Boolean.TRUE : Boolean.FALSE
}

위의 코드는 boolean 기본 타입의 박싱 클래스(boxed class)인 Boolean에서 발췌한 간단한 예이다.

 

정적 팩터리 메서드가 생성자 보다 좋은 장점

  1. 이름을 가질수 있다.
  2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
  5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

정적 팩토리 메서드의 단점

  1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
핵심정리
정적 팩터리 메서드와 public 생성자는 각자의 쓰임새가 있으니 상대적인 장단점을 이해하고 사용하는 것이 좋다. 그렇다고 하더라도 정적 팩터리를 사용하는 게 유리한 경우가 더 많으므로 무작정 public 생성자를 제공하던 습관이 있다면 고치자.

 

'Java > 이펙티브 Java' 카테고리의 다른 글

[Effective Java] 목차  (0) 2021.12.23

test

'Java > 이펙티브 Java' 카테고리의 다른 글

[EffectiveJava] 2장 객체 생성과 파괴  (0) 2021.12.23

+ Recent posts