[F-lab 모각코 챌린지 61일차] TIL

JeongheeKim·2023년 7월 31일

TIL

목록 보기
61/66

학습계획


  • 토비의 스프링 4장 1절
  • dependency 의존성 옵션
  • 프로세스 동기화 기법 - 뮤텍스

Today I Learned


토비의 스프링 4장 1절

예외에 대한 catch 블럭에서 예외에 대한 처리가 필수적으로 있어야한다.

예외처리가 되지 않는다면 프로그램이 비정상적으로 동작하거나, 메모리가 소진될 수도 있다.

예외처리를 하지않고 의미없는 throws Exception은 문제에 대한 정확한 파악이 힘들다.

  • 예외의 종류와 특징
    • Error
      • java.lang.Error의 서브 클래스들
      • 주로 자바VM이 발생시키는 것이므로 catch 블럭에서 잡는다고 해결되지 않음 → 대응방법이 없다.
      • checked exception이 강제적인 예외처리 때문에 throws를 남발하는 경향이 있었음
    • Exception
      • 개발자들이 만든 어플리케이션 코드의 작업 중에 예외상황이 발생했을 경우 사용
      • Runtime Exception, unchecked exception
        • 명시적인 예외처리를 강제로 하지 않기 때문에 unchecked exception이라고 한다.
        • 주로 프로그램의 오류(개발자의 부주의)가 있을때 발생하도록 의도함
        • NullPointerException, IllegalArgumentException
  • 예외 처리 방법
  1. 예외 복구
  2. 예외 회피
  3. 예외 전환
    1. 발생한 예외를 그대로 던지는 것이 아닌 적절한 의미를 부여하는 예외로 전환하는 것
      1. 중첩예외로 만든다.

        catch(SQLException e) {
        	if(e.getErrorCode() == MySqlErrorNumbers.ER_DUP_ENTRY){
        		throw DuplicatedUserIdException();
        	} else {
        		throw e;
        	}
        }
      2. 예외를 처리하기 쉽고 단순하게 만들기 위해 포장한다.

        1. checked exception을 unchecked exception으로 변경할 경우 사용

          catch(SQLException se) {
          	throw new EJBException(se);
          }

https://www.acmicpc.net/problem/2720

알고리즘

[나의 풀이]

import sys

n = int(sys.stdin.readline())
money_unit = [0.25, 0.1, 0.05, 0.01]
answer = ''

for i in range(n):
    money = int(sys.stdin.readline()) / 100
    for unit in money_unit:
        for j in range(1, 101):
            if (unit * j) == money:
                answer += str(j) + " "
                money = round(money - (unit * (j)), 2)
                break
            elif (unit * j) >= money:
                answer += str(j - 1) + " "
                money = round(money - (unit * (j - 1)), 2)
                break

    print(answer)
    answer = ''

탐욕법으로 푼다고 생각해서 전체값에서 빼서 남은값을 반복적으로 계산한다고 생각했는데 배열의 값에서 나머지값 연산으로 쉽게 계산이 가능 한 문제였다…

[모범답안]

import sys

n = int(sys.stdin.readline())

for i in range(n):
    C = int(input())
    ans = [0, 0, 0, 0]
    changes = [25, 10, 5, 1]
    for c in range(len(changes)):
        ans[c] += C // changes[c]
        C %= changes[c]

    print(*ans)

dependency 의존성 옵션

compileOnly "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.boot:spring-boot-starter-security"
  • compileOnly
    • runtime에는 사용되지 않고 컴파일에만 사용되는 디펜던시
    • 만약 스프링 관련 디펜던시를 compile Only로 선언하게되면 배포 시 jar파일에 포함되지 않게된다.
  • implementation
    • 구현 전용 디펜던시
    • compile, runtime 모두 가능
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class HeeverseTicketApplication {

    public static void main(String[] args) {
        SpringApplication.run(HeeverseTicketApplication.class, args);
    }

}

SecurityAutoConfiguration : 스프링 부트 시큐리티 자동설정 담당하며, 자동설정을 끄고자할때는 exclue로 설정할 수 있다.

개발자가 설정한 커스텀이 있다면 자동설정보다 우선으로 설정되는데, 위의 경우는 HttpSecurity가 스프링 자동설정으로 들어오는 객체여서 exclude 시 autowired가 불가하다고 뜨는것 같다.


의존성

일반적으로 둘 중 하나가 다른 하나를 어떤 용도로 사용함에 있어 둘의 관계를 뜻한다.

의존성에 있는 두 관계는 수행 순서 지정이 필요하다.


동기화 기법

  • 뮤텍스 락
    • 동시에 접근하면 안되는 자원에 동시접근이 불가하도록 만드는 도구
    • 상호배제를 위한 동기화 도구
    • 예) 탈의실 좌물쇠
    • 프로세스들이 공유하는 전역 변수 : lock
    • 임계구역을 잠그는 역학 : acquire 함수
      • 프로세스가 임계 구역에 진입하기 전에 호출하는 함수
      • 임계구역이 열릴때까지 반복적으로 확인하고, 임계구역이 열려있으면 lock을 true로 변경하여 잠근다.
    • 임계구역의 잠금을 해제하는 역할 : release함수
      • 임계구역 작업이 종료된 뒤 호출하는 함수
      • lock을 true로 변경한다.

[참고]

https://docs.gradle.org/current/userguide/declaring_dependencies.html

https://www.baeldung.com/gradle-implementation-vs-compile

https://youtu.be/tdBYLeKp1vw

https://docs.gradle.org/current/userguide/java_plugin.html#tab:configurations

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기