| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- OOP
- 자료구조
- DFS
- 논리 메모리
- error
- Python
- springboot
- 파이썬
- java
- BFS
- 캡슐화
- 객체지향 프로그래밍
- 디바이스 입출력
- stack
- DP
- 운영체제
- integretion test
- 백준
- 프로세스
- SW Expert Academy
- 백준 #
- 코딩 테스트
- 데드락
- 스택
- OS
- unionfind
- queue
- 유니크 키
- 큐
- 다익스트라
- Today
- Total
목록전체 글 (37)
middlefitting
캡슐화는 OOP의 4대원칙 중 하나로 원칙인 만큼 매우 중요합니다. 클래스는 서로 관련이 있는 변수와 함수를 하나의 객체로 모아주는 역할을 수행하는데요, 캡슐화는 이러한 클래스의 멤버를 외부에서 쉽게 접근하지 못하게 정보를 은닉하는 것을 말합니다. 정보를 은닉하면 뭐가 좋을까 우선 캡슐화를 하지 않고 객체의 인스턴스 변수를 외부에서 접근하는 것은 객체지향스럽지 않습니다. 4대 원칙에 어긋나니까 당연한 말이지만 어떤 부분에서 그럴지 생각을 해보자면 왜냐하면 객체는 클래스에 있는 메소드로서 자신의 작업을 수행하게 되는데, 클래스에 정의되지 않은 동작으로 객체를 사용하게 되는 것이기 때문입니다. 더불어 그러한 의도되지 않은 동작은 오류의 범위를 크게 만들 것임은 분명합니다. 그래서 클래스의 정보를 은닉함으로써..
백준 1992 쿼드 트리 문제입니다. 파악해야 하는 사각형 범위가 모두 0으로 되어 있거나 1로 되어있다면 해당 숫자를 출력하고 그렇지 않다면 재귀를 타고 가면서 동일한 과정을 반복하는 문제입니다. N이 64밖에 되지 않으므로 O(N**2) 으로도 문제를 해결할 수 있습니다. 저는 분할 정복 방식으로 문제를 해결하였습니다. 제가 작성한 코드는 다음과 같습니다. N = int(input()) arr = [] for i in range(N): arr.append([]) temp = list(str(input())) for j in range(N): arr[i].append(int(temp[j])) def div_logic(tx, ty, length): next_length = length // 2 print..
this와 this()에 이어 super와 super()에 대해 알아보도록 하겠습니다. 이 둘도 완전히 다른 내용인데요, 결론부터 말하면 super는 조상의 멤버를 가리키며, 조상의 멤버를 자신의 멤버와 구분하기 위해 사용하고, super()는 조상의 생성자를 호출하는데 사용합니다. 참조변수 super public class Chair { String color; int weight = 20; } class ChairChild extends Chair{ int weight = 10; void info() { System.out.println(super.weight); System.out.println(weight); } public static void main(String[] args) { ChairC..
this() 와 this 의 차이 개인적으로 생성자 this()와 참조 변수 this는 상당히 낯선 친구들이었습니다. 둘의 차이는 완전히 다른 존재라는 것입니다. 비슷하게 생기긴 했지만 말이죠. 어떤 역할을 하는지 하나씩 알아보도록 하겠습니다. 생성자 this() this()는 생성자에서 호출하는 다른 생성자를 말합니다. 생성자에서 다른 생성자를 호출하는 경우는 무엇이 있을까요. 다양한 이유가 있겠지만 결국 코드의 중복을 줄이기 위해 사용할 것입니다. 생성자는 오버로딩이 가능한데 생성자마다 인스턴스 변수를 초기화하는 과정이 겹칠 수 있으니 그러한 부분을 줄일 수 있다는 것입니다. 예를 들어 다음과 같은 경우 활용할 수 있을 것입니다. public class Chair { String color; int ..
클래스에 존재하는 변수 자바 클래스에서 사용할 수 있는 변수의 종류에 대해 알아보도록 하겠습니다. Class에 존재하는 변수는 크게 4종류로 나누어 볼 수 있습니다. 그들은 인스턴스 변수, 클래스 변수, 지역 변수, 매개 변수입니다. 인스턴스 변수 (Instance Variables) 인스턴스 변수는 클래스 영역에 선언된 변수를 말합니다. 멤버 변수라고 표현하기도 합니다. 다음과 같이 정의를 할 수 있습니다. public class HelloInstance { int age; String name; } 이렇게 클래스 내부에 선언된 변수를 인스턴스 변수라고 합니다. 인스턴스 변수는 이름처럼 인스턴스가 생성되었을 때 생성이 되게 됩니다. 이러한 인스턴스 변수는 메서드에서 참조할 수 있고, 생성자에서도 사용할..
객체지향 프로그래밍(OOP)에서는 이름값 하듯이 객체가 아주 중요합니다. 객체와 클래스라는 개념은 같이 따라오게 되는데요 클래스는 설계도, 객체는 설계도대로 만든 구현체(물건)입니다. 객체(Object) 클래스를 알아보기 전에 객체가 무엇인지 알아보겠습니다. OOP에서 객체는 구현체, 실제로 존재하는 사물을 뜻하는데요, 속성(변수)과, 기능(메서드)를 가질 수 있습니다. 이것이 무슨 말일까요 객체는 속성을 가질 수 있다. 속성을 가진다는 것은 변수를 가질 수 있다는 것을 말합니다. 일단 변수로는 이러한 것들이 있겠습니다 Stringname; intage; 여기서 보시면 int는 Java의 기본 자료형입니다. 그리고String은 기본 자료형이 아니죠. class 자료형입니다. 즉 객체는 속성으로 기본 자료..
가상 메모리 논리 메모리는 물리 메모리보다 큰 공간을 가지고 있습니다. 논리 메모리는 프로세스별로 할당되는 메모리, 물리 메모리는 실제 저장이 이루어지는 공간을 말합니다. 어떻게 논리 메모리는 물리 메모리보다 큰 공간을 가지게 되는 것일까요? 그것은 운영체제의 가상메모리 기법에 의해 가능합니다. 가상 메모리 기법은 논리 메모리와 물리 메모리를 분리하기 위한 기술이며, 이를 이용하여 논리 메모리가 물리 메모리 공간보다 커지는 것을 가능하게 해주게 됩니다. 그러한 가상 메모리 기술에 대해 알아보도록 하겠습니다. Demand Paging 실제로 필요한 페이지만 메모리에 올리는 것을 말합니다. 논리 메모리의 페이지를 모두 물리 메모리에 한번에 올린다면, 실제로 아직 사용되지 않는 페이지까지 모조리 올려버리는 것..
물리 메모리 영역 물리 메모리 영역은 일반적으로 OS 상주역역, 사용자 프로세스 영역으로 나뉘어 사용됩니다. OS 상주역역은 주로 낮은 주소 영역을 사용하고, 사용자 프로세스 영역은 높은 영역을 사용하는데, 사용자 프로세스 영역의 할당 기법에는 연속 할당, 불연속 할당 기법이 존재합니다. 여기서 운영체제의 메모리 할당은 고려하지 않아도 되는 것일까요? 운영체제는 컴퓨터가 시작하고 종료될때까지 가장 먼저 실행되고 멈추지 않고 돌아가는 프로그램입니다. 따라서 운영체제는 당연히 물리 메모리에 올라가 있다고 생각하시면 될 것 같습니다. 연속 할당 연속 할당이란 프로그램이 통째로 메모리 한 장소에 올라가는 것을 말합니다. 통째로 올라간다는 것은 메모리의 연속적인 공간에 적재된다는 것을 말합니다. 연속할당의 방법에..
Logical Address vs Physical Address 물리적 메모리 관리에 앞서 논리 메모리 주소와 물리 메모리 주소에 관해 알아보고자 합니다. 논리적 주소는 가상 주소라고도 말하며, 프로세스마다 독립적으로 가지는 주소 공간을 말합니다. 물리적 주소는 실제 메모리 하드웨어에 올라와 있는 주소를 말합니다. 이 두개가 나누어져 있는 이유는 일반적으로 논리적 메모리가 물리적 메모리보다 크기 때문입니다. 물리적 메모리에는 그때 그때 필요한 메모리가 들어가게 되고, 만약 공간이 부족할 경우에는 Swap 영역으로 쫓겨나게 되는 것입니다. 쫓겨났던 메모리가 다시 들어오게 될 때에는 Swap 영역에서 다시 물리 메모리 공간으로 들어온다고 생각하실 수 있습니다. 주소 바인딩 컴파일시에 심볼 주소는 논리형 숫자..
데드락의 처리방법 데드락은 상호배제, 비선점, 보유 대기 및 순환대기 조건이 모두 충족되어야 발생할 수 있습니다. 즉 해당 조건이 충족되지 않게 한다면, 데드락 발생을 예방할 수 있다는 말이 됩니다. 데드락의 처리 방법에는 다음과 같은 크게 4가지 방법이 존재합니다. Deadlock prevention 가장 강력한 방지법으로 데드락이 발생할 수 있는 원천적인 요소, 발생조건을 차단하는 것을 말합니다. 상호 배제의 경우 공유하는 자원의 경우 반드시 성립해야 하기 때문에 다른 발생조건을 방지하는 방법으로 진행합니다. 점유 대기 방지 해당 조건을 방지하기 위해서는 자원을 요청하는 상황에서는 어떠한 자원을 보유하지 못하게 진행합니다. 방법은 대표적으로 두가지가 존재합니다. 첫 번째는 프로세스가 시작될 때 필요한..
데드락이란 데드락은 남아있는 자원이 없는 상황에서 자원을 점유한 프로세스들이 희생을 하지 않고, 다른 자원을 요청하면서 발생하는 교착상태를 말합니다. 즉 일련의 프로세스들이 서로가 가진 자원을 기다리며 막혀 있는 상태입니다. 여기서 말하는 자원은 하드웨어 소프트웨어 등을 포함하는 개념입니다. 데드락 발생 조건 데드락 발생에는 4가지 조건이 존재하며, 어느 한 조건도 만족하지 않는다면 데드락은 발생하지 않습니다. 상호배제 (Mutual exclusion) 획득한 자원을 독점적으로 사용하는 것을 말합니다 비선점 (No preemption) 프로세스는 자원을 스스로 내어놓을 뿐, 빼앗기지 않는 것을 말합니다. 보유 대기 (Hold and wait) 자원을 가진 프로세스가 자원을 놓지 않고 자원을 기다리는 것을..
Semaphores 세마포어는 공유된 자원, Critical Section에 여러 프로세스가 접근하는 것을 방지합니다. 세마포어는 동기화 도구로써 동기화 대상이 1개 이상일 때 사용합니다. 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있으며, 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있습니다. 세마포어를 사용하기 위해서 다음과 같은 두 연산이 정의됩니다. P(S) P 연산은 락을 거는 과정으로 공유 데이터인 세마포어 변수 값을 획득합니다. 남아있는 자원이 없을 경우 대기를 하게되고, 누군가 자원을 내어 놓으면 자원을 획득하게 됩니다. V(S) V 연산은 락을 푸는 과정으로, 공유 데이터인 세마포어 값을 반납합니다. 대기하고 있는 프로세스가 있을 경우 자원을 ..
프로세스 동기화 문제란 프로세스 동기화 문제란 공유 데이터의 동시 접근이 발생하는 경우에는 데이터의 불일치 문제를 발생시킬 수 있는 것을 말합니다. 일관성 유지를 위해서는 협력 프로세스 간의 실행 순서를 정해주는 메커니즘이 필요하게 됩니다. 동기화 문제의 예시를 들어 보겠습니다. 1. 특정 공유데이터 x = 1 가 있다고 가정합니다. 2. 해당 공유데이터는 프로세스 A, B가 공유합니다. 2; 먼저 한 프로세스 A가 해당 공유데이터를 읽어들이면 x = 1 을 읽어오게 됩니다. 3. 그리고 그 상태에서 interrupt가 발생하여 CPU를 다른 프로세스 B가 점유하게 되었습니다. 4. 그리고 프로세스 B가 공유 데이터에 x += 1 명령을 수행해서 x = 2 가 되었습니다. 5. 그리고 다시 프로세스 A가..
컴퓨터 CPU 구조에 관한 간단한 구조를 다루려고 합니다. 해당 글에서는 CPU, 레지스터, 메모리, 타이머 및 I/O 디바이스에 관해서 다루고자 합니다. CPU 란 무엇인가 CPU란 컴퓨터에서 가장 빠른 하드웨어 장치이며, 역할은 현재 CPU를 점유하는 매 인스트럭션을 실행시킵니다. 인스트럭션이란 컴퓨터에게 일을 시키는 단위로서, 기계어로 이루어진 명령어를 말합니다. 연산자가 표시되는 연산자부와 자료의 정보가 표시되는 자료부로 구성됩니다. CPU의 운명은 메모리에서 인스트럭션을 읽어들이는 것, 그뿐입니다. 레지스터란 무엇인가 레지스터란 메모리보다 빠르면서 정보를 저장할 수 있는 작은 공간을 말합니다. CPU와 메인 메모리는 속도 차이가 크게 나기 때문에, 그 중간에서 속도의 차이를 극복할 수 있도록 도..
CPU 스케줄링이란 운영체제의 CPU는 프로세스들이 돌아가면서 사용하게 됩니다. 때문의 ready 상태의 프로세스들 중 누구에게 CPU를 줄 것인지 결정하는 전략이 필요합니다. CPU 스케줄링은 ready 상태의 프로세스를 CPU 스케줄러가 선택하고, Dispatcher는 CPU 제어권을 스케줄러에 의해 선택된 프로세스에게 넘기게 됩니다. CPU 스케줄링은 언제 일어나는가 CPU 스케줄링이 필요한 경우는 프로세스에게 다음과 같은 상태 변화가 있는 경우입니다. Nonpreemptive (자진 반납) I/O 요청의 시스템 콜 발생 (running -> blocked) terminate Preemptive (강제 반납) 할당 시간 만료로 timer interrupt가 발생하는 경우 (running -> rea..