분류 전체보기 193

스프링 컨테이너와 스프링 빈

스프링 컨테이너 스프링은 스프링 컨테이너를 제공함으로써 이전에 직접 만들었던 AppConfig처럼 각 객체들의 생성과 의존관계를 관리해준다. 스프링 컨테이너가 객체 간의 의존관계를 관리해줌으로써 각 구현체 클래스들은 다른 구현체 클래스에 의존하지 않을 수 있다. 이전에 정의했던 AppConfig에 스프링을 적용하면 다음과 같다. @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(membe..

Backend/Spring 2023.12.28

스프링과 객체지향

스프링의 핵심 컨셉: 객체지향 스프링은 자바 기반의 프레임워크이다. 자바의 가장 큰 특징은 객체지향 언어라는 것인데, 스프링은 객체지향 언어가 가진 강력한 특징을 살려내는 프레임워크이다. 즉 스프링의 핵심 컨셉은 객체지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크이다. 다형성 객체지향 프로그래밍은 프로그램을 여러 객체들의 모임으로 파악하고, 각 객체들 간에 메시지를 주고받으며 협력하는 것을 강조한다. 이러한 객체지향 프로그래밍은 프로그램을 유연하고 변경에 용이하게 만든다. 프로그램이 유연하고 변경에 용이하다는 것은 무엇일까? 여기서 다형성이라는 개념이 등장한다. 다형성은 역할과 구현을 분리한다. 예를 들어 다음과 같이 자동차 역할과 그 구현이 나눠져있다고 가정하자. 그러면 자동차의 구현체가 K3에..

Backend/Spring 2023.12.28

좋은 객체 지향 설계의 5가지 원칙(SOLID)

SOLID는 클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리한 것이다. SRP(Single Responsibility Principle): 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 그런데 이때 하나의 책임이라는 것을 모호하다. 그 책임의 단위가 클 수도 있고 작을 수도 있다. 따라서 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 SRP를 잘 따른 것이다. ex, UI 로직과 비즈니스 로직의 분리, 객체의 생성과 사용을 분리 OCP(Open Closed Principle): 개방 폐쇄 원칙 확장에는 열려있으나 변경에는 닫혀있어야 한다. 즉 확장에 용이하면서 기존 코드의 변경이 적어야 한다는 것이다. LSP(Liskov Substitution Prin..

Language/Java 2023.12.28

[백준] 4179. 불!

https://www.acmicpc.net/problem/4179 4179번: 불! 입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다. 각각의 문자 www.acmicpc.net bfs 문제인데 이 문제를 풀며 주의할 점이 몇가지 있다. 논리적으로 불과 지훈이 동시에 이동해야 한다. 따라서 코드 상으로 불과 지훈이 순차적으로 한 번씩 이동해야 하는데, 둘 중에 불을 먼저 이동시켜야 한다. 불이 먼저 이동해서 불이 번지면, 지훈이가 불이 있는 곳을 피해서 이동해야 하기 때문이다. 불을 한 번 이동시킬 때는 fireQue의 사이즈만큼 이동을 처리해주어야 한다...

CS/Algorism 2023.12.28

프로세스와 스레드

스레드 프로세스는 메모리에 할당된 프로그램, 즉 실행 중인 프로그램으로 운영체제의 관리의 단위이다. 반면, 스레드는 프로세스 내부에서의 CPU 수행 단위를 의미한다. 그 전에 프로세스가 어떻게 관리되는지 정리해보자. 프로그램을 실행하게 되면 프로세스가 생성된다. 프로세스가 생성되면 각 프로세스의 주소 공간(code, data, stack)과 PCB(Process Control Block)가 생성된다. 만약 동일 프로그램을 여러 개 실행하는 경우 그만큼 프로세스가 생성된다. 즉 그만큼 메모리를 차지하고 동일 프로그램이기 때문에 각 프로세스들의 실행 코드는 같다. 따라서 굉장히 비효율적이다. 따라서 여기서 스레드가 등장한다. 동일 프로그램에 대한 프로세스가 여러 개 있을 경우 하나의 프로세스에 여러 개의 스..

CS/Operating System 2023.12.27

[백준] 7576. 토마토

https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net https://olsohee.tistory.com/44 이 문제와 마찬가지로 bfs로 탐색하면서 이전 값에 + 1을 해주어 토마토가 익는데 걸리는 일수를 구하면 된다. 주의할 점은 우선 처음에 그래프 값을 입력받을 때 익은 토마토의 위치를 큐에 넣어주어야 한다. 그리고 큐에서 토마토의 위치를 빼서 해당 위치의 사방면을 탐색하고, 아직 익지 않은 토마토인 경우 이전 값 + 1을 저장..

CS/Algorism 2023.12.26

[백준] 2178. 미로 탐색

https://www.acmicpc.net/problem/2178 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.acmicpc.net 최소 거리를 구하는 문제이기 때문에 bfs를 사용하면 된다. 관건은 이동한 칸수를 계산하는 것인데, visited 배열에 1, 2, 3, ... 과 같이 이동한 칸수를 기록해주면 된다. 즉 visited 배열의 값이 0이면 아직 방문하지 않은 위치인 것이고, 시작 위치와 같이 한 번만에 방문하면 1, 그 다음으로 방문하면 2를 기록해주면 된다. 그리고 visited 배열의 값이 0이 아닌 경우, 즉 이미 방문한 경우에는 제외하기..

CS/Algorism 2023.12.26

[백준] 1926. 그림

https://www.acmicpc.net/problem/1926 1926번: 그림 어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로 www.acmicpc.net bfs 문제를 몇 달만에 풀어서 다 까먹었을까봐 걱정했는데 아주 쉬운 문제라서 그런지 잘 풀었다! 오랜만에 bfs를 푸는 만큼 쉬운 문제더라도 꼼꼼히 보자. bfs와 dfs 문제의 시간 복잡도는 O(V + E)이다. 이때 V는 노드의 개수, E는 간선의 개수이다. 주의해야 할 점은 다음과 같다. 방문 후에는 방문 처리를 해주어야 한다. 따라서 그림이면서 방문하지 않았을 경우에만 bfs를 시작하고, 이때..

CS/Algorism 2023.12.26

프로세스의 주소 공간, 프로세스 상태, 프로세스 스케줄링 큐

프로세스의 주소 공간 프로그램이 실행되면 프로그램의 모든 코드와 데이터는 가상 메모리에 할당된다. 가상 메모리는 추상화된 메모리 공간으로, 각 프로세스마다 가상 메모리를 갖는다. 그러나 가상 메모리에 할당된 코드와 데이터는 물리적 메모리에 로드될 때까지 실제 메모리에 존재하지 않는다. 그리고 필요에 따라 물리적 메모리에 적재되거나 스왑 영역으로 스왑 아웃된다. 또한 가상 메모리 내의 논리적 주소를 물리적 메모리의 물리적 주소로 변환하는 과정이 필요한데, 이는 MMU(Memory Management Unit)라는 하드웨어 장치가 수행한다. 각각의 가상 메모리는 코드, 데이터, 스택으로 구성된다. 코드: 개발자가 정의한 프로그램 코드가 CPU가 수행할 수 있는 기계어로 변환되어 저장된다. 데이터: 전역 변수..

CS/Operating System 2023.12.23

보안 방법

우리가 흔히 사용하는 운영체제는 여러 프로그램이 동시에 실행될 수 있는 다중 프로그래밍 환경에서 동작한다. 따라서 운영체제는 각 프로그램이 다른 프로그램의 메모리 영역이나 파일 영역을 침범하지 않도록 관리해야 한다. 이때 보안과 관련된 중요하고 위험한 명령들을 특권명령이라고 한다. 하드웨어 보안 운영체제는 하드웨어 보안을 위해 I/O 작업과 같이 디스크 파일에 접근하는 작업을 특권명령으로 삼아, 커널 모드에서만 실행할 수 있도록 한다. 따라서 사용자 프로그램이 맘대로 위험한 명령을 수행하는 것을 막는다. 메모리 보안 디스크뿐만 아니라 메모리의 경우에도 보안이 필요하다. 특히 메모리에 올라와 있는 OS의 코드(ex, 인터럽트 벡터와 인터럽트 처리 루틴)는 각별히 보안이 필요하다. 따라서 2개의 레지스터를 ..

CS/Operating System 2023.12.23