목록전체 (37)
보근은 참고 있다
관계형 데이터베이스 RDB(Relational Database)라고 하며, 키(key)와 값(value)들의 관계를 2차원 표인 테이블로 표현하는 데이터베이스로 가장 주류를 이룬다. 열(column)과 행(row)으로 테이블을 이루며, 고유 키가 각 행을 식별한다. 행은 튜플이나 레코드라고 부른다. 일반적으로 각 테이블/관계는 하나의 엔티티 타입을 대표한다. 행은 그 엔티티의 인스턴스를 대표하며 열은 그 인스턴스의 속성이 되는 값들을 대표한다. RDB에서 2차원 표는 테이블(table)이라고 불린다. 테이블은 RDB에서 데이터를 관리하기 위한 유일한 단위이므로 '어떤 테이블에 어떤 데이터를 포함하는가'가 시스템의 기능을 좌우하는 중요한 의미가 있다. 예를 들어, 한 테이블에 너무 많은 정보를 채워 넣는다..
데이터베이스 데이터베이스(Database, DB)란, 여러 사람이 공유하여 사용할 목적으로 체계화하여 통합, 관리하는 데이터의 집합이다. 작성된 목록으로써 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음이다. 데이터베이스의 기본 기능으로 4가지가 있다. 데이터의 검색과 갱신 동시성 제어 장애 대응 보안 1. 데이터의 검색과 갱신 DB는 검색이 가능해야 한다. 검색은 원하는 데이터를 찾는 것이다. 예를 들어, DB에게 이름에 "박"을 포함하고 있는 사람들을 검색하면, DB내의 데이터 중 "박"으로 시작하는 이름을 가진 데이터들을 얻을 수 있다. DB의 갱신이 가능해야 한다. 갱신은 넓은 의미로 등록, 수정, 제거이다. 예를 들어, 주소록에 새로 사귄 김보근 씨를 추가할 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/1u4Hq/btqLYMimY5q/u23ar63H6H3xkyXVgmaUM0/img.png)
트리 순회(Tree traversal)는 트리 구조에서 각각의 노드를 정확히 한 번만, 체계적인 방법으로 방문하는 과정을 말한다. 전위 순회(preorder) 노드를 방문한다. 왼쪽 서브트리를 전위 순회한다. 오른쪽 서브트리를 전위 순회한다. 중위 순회(inorder) 왼쪽 서브트리를 중위 순회한다. 노드를 방문한다. 오른쪽 서브트리를 중위 순회한다. 후위 순회(postorder) 왼쪽 서브 트리를 후위 순회한다. 오른쪽 서브트리를 후위 순회한다. 노드를 방문한다. 출처 : ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EC%88%9C%ED%9A%8C#%EC%A0%84%EC%9C%84_%EC%88%9C%ED%9A%8C
SOLID란, 클린 코드의 저자인 로버트 마틴이 제시한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다. SRP(Single Responsibility Principle) : 단일 책임 원칙 OCP(Open/Close Principle) : 개방-폐쇄 원칙 LSP(Liskov Substitution Principle) : 리스코프 치환 원칙 ISP(Interface Segregation Principle) : 인터페이스 분리 원칙 DIP(Dependency Inversion Principle) : 의존 관계 역전 원칙 SRP 단일 책임 원칙 단일 책임 원칙은, 한 클래스는 하나의 책임..
오류: 강력한 명령어를 사용하면 성능이 좋아진다. intel x86 명령어는 접두사를 이용해 명령어 실행 방식을 변경할 수 있기 때문에 매우 강력하다. 그중 한 접두사는 카운터 값이 0이 될 때까지 명령어 반복 실행이 가능하게 해준다. 그러나, 순환문 오버헤드가 없도록 명령어를 반복적으로 늘어놓는 방법을 쓰면 접두사를 쓴 것보다 약 1.5배 빠르다. 오류: 최고 성능을 얻기 위해 어셈블리 언어로 프로그램 작성하기. 과거에는 컴파일러가 출력하는 코드의 성능이 좋지 못했으나, 현재는 컴파일러 기술이 발달하면서 컴파일한 코드와 직접 손으로 작성한 코드의 차이가 급격히 줄어들었다. 상위 수준 언어로 프로그램을 작성해 컴파일하는 이유는 다음과 같다. 컴파일러 기술이 발달된 지금, 어셈블리 프로그래머가 컴파일러의 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/DnqQb/btqKbXFXBZp/QSebtP7qYhkkH3H371s8t0/img.png)
이 절에서는 두 가지 C 프로시저의 MIPS 코드를 만들어 본다. 하나는 배열 원소 두 개를 맞바꾸는 것, 다른 하나는 배열 원소를 정렬하는 것이다. C 프로그램을 어셈블리 프로그램으로 바꿀 때는 다음 절차에 따라 번역한다. 1. 프로그램 변수에 레지스터를 할당한다. 2. 프로시저 본체에 해당하는 코드를 생성한다. 3. 프로시저 호출 후의 레지스터 내용을 호출 전과 같도록 만든다. 프로시저 swap void swap (int v[], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } 레지스터 할당 인수 v, k를 각각 $a0와 $a1에 할당한다. 그 외의 변수는 temp 뿐인데 swap은 말단 프로시저이므로 레지스터 $t0에 할당된다. 본체..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bQHfII/btqJHa5uQDh/nZth4voD5elsN69vkACuK1/img.png)
컴파일러 컴파일러는 상위 수준 프로그램을 어셈블리 언어 코드로 바꾼다. 어셈블리 언어 프로그램은 컴퓨터가 이해할 수 있는 심벌 형태이다. 어셈블리 언어 프로그램에 비하면 상위 수준 프로그램의 문장 수는 훨씬 적다. 결국, 이 과정은 프로그래머의 생산성을 높여준다. 어셈블러 어셈블러는 어셈블리 언어 코드를 기계어 형태의 목적 모듈로 바꾼다. 어셈블리 언어는 상위 수준 프로그램과 기계어 사이의 인터페이스 역할을 한다. 이 명령어들은 하드웨어로 구현이 되어 있지 않더라도, 어셈블러가 알아서 처리하여 번역과 프로그래밍을 간편하게 해 준다. 이런 명령어들을 의사명령어(Pseudo instruction)이라 한다. ex) move $t0, $t1 -> add $t0, $zero, $t1 // 기계어 명령어에는 mo..
태스크가 서로 독립적일 때는 병렬처리가 필요가 없지만, 서로 협력해야 하는 경우 매우 중요하다. 협력이란 어떤 태스크들이 읽어야 할 값을 다른 태스크들이 쓰는 것을 의미한다. 그들 사이에 동기화가 되지 않으면 데이터 경쟁관계(data race)의 위험이 있다. 컴퓨팅에 있어서 동기화 메커니즘은 일반적으로는 사용자 수준의 소프트웨어 루틴에서 제공되는데, 이 소프트웨어 루틴들은 하드웨어가 제공하는 동기화 명령을 이용한다. 이 절에서는 lock과 unlock 동기화 연산의 구현에 집중한다. lock과 unlock을 이용하여 단 하나의 프로세서만이 작업할 수 있는 영역(상호배제(mutual exclusion))을 생성하며, 더 복잡한 동기화 메커니즘을 구현할 수 있다. 멀티 프로세서에서 효율적으로 기본 동기화 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bx4I9w/btqJsjpvxip/KmlA7qLf2wx44YjX0Bbc1K/img.png)
MIPS의 명령어 길이를 32비트로 고정한 덕에 하드웨어가 간단해졌지만, 32비트짜리 상수나 주소를 사용하면 편한 경우가 많다. MIPS는 32비트 상수나 주소 역시 지원한다. MIPS의 명령어는 상수타입(I타입)을 지원하지만, 16비트가 한계이다. 대부분의 상황에서 16트로 충분하지만 예외의 경우에 더 큰 상수가 필요할 때가 있다. 그런 경우를 위해 MIPS는 lui(Load Upper Immediate) 명령어를 제공한다. lui는 상위 16비트에 상수를 넣고 그 다음에 나오는 다른 명령어로 하위 16비트를 채움으로써 32비트 상수를 사용할 수 있다. ex) $s0에 32비트 상수를 채워라. lui $s0, 320 // $s0 = 0000 0001 0100 0000 0000 0000 0000 0000..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bUWz08/btqJsj27SYm/LFshcRKuQXyhmiMftGGlZK/img.png)
프로시저 프로시저란, 제공되는 인수에 따라서 특정한 작업을 수행하는 서브 루틴. 프로시저는 지정된 작업 외의 다른 것은 아무 것에도 영향을 주어서는 안된다. 프로그램의 프로시저 호출 후 실행 6단계 : 프로시저가 접근할 수 있는 곳에 인수를 넣는다. ($a0~$a3) 프로시저로 제어를 넘긴다. 프로시저가 필요로 하는 메모리 자원을 획득한다. 필요한 작업을 수행한다. 호출한 프로그램이 접근할 수 있는 장소에 결과 값을 넣는다. ($v0~$v1) 프로시저는 프로그램 내의 여러 곳에서 호출될 수 있으므로 원래 위치로 제어를 돌려준다. ($ra) 프로그램 또는 프로시저가 프로시저를 호출 하려면 이동 명령어가 필요하다. MIPS에서는 jal(Jump And Link) 명령어가 있다. jal의 jump는 프로시저로..