public class Main {
public static void check(int[] x, int[] y) {
if(x==y) System.out.print("O");
else System.out.print("N");
}
public static void main(String[] args) {
int a[] = new int[] {1, 2, 3, 4};
int b[] = new int[] {1, 2, 3, 4};
int c[] = new int[] {1, 2, 3};
check(a, b);
check(b, c);
check(a, c);
}
}
== 연산자로 비교== 연산자 : 배열이 참조하는 주소값을 비교false가 반환됨시스템의 성능을 향상시키고 개발 및 운영의 편의성 등을 높이기 위해 정규화된 데이터 모델을 의도적으로 통합, 중복, 분리하여 정규화 원칙을 위배하는 행위
반정규화
정규화
데이터의 중복을 제거하고 데이터 무결성을 유지하기 위해 데이터베이스를 여러 테이블로 나누는 과정
| 절차 | 설명 |
|---|---|
| 제 1정규화 | - 도메인의 원자성 확보 |
| 제 2정규화 | - 부분 함수 종속성 제거 |
| 제 3정규화 | - 이행 함수 종속성 제거 |
| BCNF | - 모든 결정자가 후보키 집합에 속해야 함 |
| 제 4정규화 | - 다중값 종속 제거 |
| 제 5정규화 | - 조인 종속 제거 |
[테이블]
사원 [사원번호(PK), 이름, 나이, 부서]
부서 [사원번호(PK), 이름, 주소, 나이]① 신입사원이 들어와서 부서 테이블에 새로운 사람을 추가
INSERT INTO 부서 (사원번호, 이름, 주소, 나이) **( ① )** (240728, '홍길동', '서울', 30);② 부서 테이블에서 추가한 사원을 검색한 후 사원 테이블에 추가
INSERT INTO 사원 (사원번호, 이름, 나이, 부서) **( ② )** 사원번호, 이름, 나이, ‘영업’ FROM 부서 WHERE 이름 = '홍길동';③ 전체 사원 테이블 조회
SELECT * **( ③ )** 사원;④ 사원의 퇴사로 인해 부서에 해당하는 값을 '퇴사'로 변경
UPDATE 사원 **( ④ )** 부서 = '퇴사' WHERE 사원번호 = 240728;`
① VALUES
② SELECT
③ FROM
④ SET
INSERT INTO 부서 (사원번호, 이름, 주소, 나이) VALUES (240728, '홍길동', '서울', 30);
INSERT INTO 사원 (사원번호, 이름, 나이, 부서)
SELECT 사원번호, 이름, 나이, '영업' FROM 부서 WHERE 이름 = '홍길동';
SELECT * FROM 사원;
UPDATE 사원 SET 부서 = '퇴사' WHERE 사원번호 = '240728'

- Network layer에서 IP패킷을 암호화하고 인증하는 등의 보안을 위한 표준이다.
- 기업에서 사설 인터넷망으로 사용할 수 있는 VPN을 구현하는데 사용되는 프로토콜이다.
- AH(Authentication Header)와 ESP(Encapsulating Security Payload)라는 두 가지 보안 프로토콜을 사용한다.

실행 순서가 밀접한 관계를 갖는 기능을 모아 모듈로 구성하며, 한 모듈 내부의 한 기능 요소에 의한 출력 자료가 다음 기능 원소의 입력 자료로써 제공되는 형태이다.
| 종류 | 설명 | 예시 |
|---|---|---|
| 기능적 응집도 | 하나의 모듈이 한 가지 명확한 기능만 수행 | - 사용자 로그인을 처리하는 모듈 - 계산기 모듈처럼 단일 목적 |
| 순차적 응집도 | 모듈 내 기능이 순차적으로 연결되며, 한 기능을 출력이 다음 기능의 입력으로 사용됨 | - 데이터를 입력받아 처리하고, 결과를 출력하는 모듈 -컴파일러 |
| 교환적 응집도 | 모듈 내 여러 기능이 동알한 데이터를 사용하여 수행됨 | - DB 레코드를 읽고 수정/삭제 기능이 있는 모듈 |
| 절차적 응집도 | 관련된 기능들을 순서대로 수행하지만, 기능 간에 데이터의 직접 전달은 없음 | - 시스템 초기화 모듈 - 여러 가지 초기화 작업을 단지 순서적으로 수행 |
| 시간적 응집도 | 시간적으로 동시에 실행될 필요가 있는 기능들을 한 모듈로 묶음 | 시스템 시작 시 초기화 작업 - 정기적 백업, 배치(batch) 작업 |
| 논리적 응집도 | 논리적으로 관련된 기능을 하나의 모듈로 묶지만, 실제로는 서로 다른 기능 | - 오류처리 모듈 - 하나의 모듈이 여러 비슷한 작업을 논리적 분기로 처리 |
| 우연적 응집도 | 서로 연관이 없는 기능들이 무작위로 하나의 모듈에 모임 | - 잡다한 기능을 한 번에 처리하는 유틸리티 모듈 |

- 컬렉션 객체의 내부 구조를 노출하지 않고 순차적으로 접근할 수 있게 하는 패턴이다.
- 객체의 내부 표현 방식에 독립적으로 요소에 접근할 수 있다.
- 반복 프로세스를 캡슐화하여 클라이언트 코드에서는 컬렉션의 구체적인 구현에 종속되지 않게 한다.
- Cursor라고도 한다.
def cnt(str, p):
result = 0
for i in range(len(str)):
sub = str[i:i+len(p)]
if sub == p:
result += 1
return result
str = "abdcabcabca"
p1 = "ca"
p2 = "ab“
print(f'ab{cnt(str, p1)} ca{cnt(str, p2)}')
cnt(str, p1) 의 반환값: 3cnt(str, p2) 의 반환값: 3( ① ) : 연결형 통신에서 주로 사용되는 방식으로, 출발지와 목적지의 전송 경로를 미리 연결하여 논리적으로 고정한 후 통신하는 방식이다.
( ② ) : 비연결형 통신에서 주로 사용되는 방식으로, 사전에 접속 절차를 수행하지 않고 헤더에 출발지에서 목적지까지의 경로 지정을 위한 충분한 정보를 붙여서 개별적으로 전달하는 방식이다.
① 가상 회선 방식
② 데이터그램 방식
1. 패킷 교환 방식
2. 회선 교환 방식
3. 메시지 교환 방식
| 항목 | 회선 교환 | 메시지 교환 | 가상회선 | 데이터그램 |
|---|---|---|---|---|
| 연결 방식 | 연결형 | 비연결형 | 연결형 | 비연결형 |
| 단위 | 회선 | 전체 메시지 | 패킷 | 패킷 |
| 전송 순서 유지 | O | O | O | X |
| 경로 설정 | 물리적 경로 | 없음 | 논리적 경로 | 패킷마다 다름 |
| 지연 | 짧음 | 김 | 짧음 | 가변적 |
| 예시 | 전화망 | (구) 네트워크 | ATM, MPLS | IP, UDP |
#include
void swap() {
int a = 11;
int b = 19;
int t = a;
a = b;
b = t;
}
int main() {
int a = 11;
int b = 19;
swap();
switch(a) {
case 1:
b += 1;
case 11: // a = 11
b += 2; // b= 21
default:
b += 3; // b = 24
break;
}
printf("%d", a-b); // 11 - 24 = -13
}
b += 2; 가 실행됨. -> b = 21b += 3; 실행됨 -> b = 24a - b 는 -13#include
#include
void func(char *d, char *s) { // teststring , first
int sum = 0;
while (*s) { // f
*d = *s; // test=f
d++; // first++
s++; // first++;
}
*d = ''; // first
}
int main() {
char* str1 = "first";
char str2[50] = "teststring";
int result = 0;
func(str2, str1);
for (int i = 0; str2[i] != ''; i++) {
result += i;
}
printf("%d", result);
return 0;
}
interface Number {
int sum(int[] a, boolean odd);
}
public class Main {
public static void main(String[] args) {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
OENumber OE = new OENumber();
System.out.print(OE.sum(a, true) + ", " + OE.sum(a, false)); // 25, 20
}
}
class OENumber implements Number {
public int sum(int[] a, boolean odd) {
int result = 0;
for(int i=0; i < a.length; i++) { // 9
if((odd && a[i] % 2 != 0) || (!odd && a[i] % 2 == 0)) // 1, 3,5,7,9 | 2,4,6,8
result += a[i];
}
return result; //25
}
}
OE.sum(a, true)if((odd && a[i] % 2 != 0)) 이 만족되는 값OE.sum(a, false)if(!odd && a[i] % 2 == 0) 이 만족되는 값25, 20 이 출력
| 비교 항목 | RIP (Routing Information Protocol) | OSPF (Open Shortest Path First) |
|---|---|---|
| 경로 선택 | 홉 수 (Hop Count) 거치는 라우터 수가 적은 경로 | 누적 링크 비용 (Link Cost) 각 링크의 비용(대역폭, 지연 등) 총합 |
| 프로토콜 유형 | 거리 벡터 기반 | 링크 상태 기반 |
| 경로 계산 방식 | 이웃 라우터로부터 거리 정보 받아 갱신 | 모든 라우터가 전체 네트워크 토폴로지를 알고 Dijkstra 알고리즘으로 계산 |
| 최대 홉 수 | 15 (16은 무한대) | 제한 X |
| 속도 | 느림 | 빠름 |
QUESTION
- 대칭키 알고리즘으로 1997년 NIST(미국 국립기술표준원)에서 DES를 대체하기 위해 생성되었다.
- 128비트, 192비트 또는 256비트의 가변 키 크기와 128비트의 고정 블록 크기를 사용한다.
- 높은 안전성과 효율성, 속도 등으로 인해 DES 대신 전 세계적으로 많이 사용되고 있다.
#include
int main() {
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int* parr[2] = {arr[1], arr[2]};
printf("%d", parr[1][1] + *(parr[1]+2) + **parr);
return 0;
}
| [0] | [1] | [2] | |
|---|---|---|---|
| arr[0] | 1 | 2 | 3 |
| arr[1] | 4 | 5 | 6 |
| arr[2] | 7 | 8 | 9 |
| index | points to |
|---|---|
| parr[0] | {4, 5, 6} |
| parr[1] | {7, 8, 9} |
parr[1][1] = 8*(parr[1] +2)parr[1] = arr[2]parr[1] + 2 = arr[2][2]*(parr[1] + 2) = arr[2][2] = 9**parr*parr = parr[0] = arr[1]**parr = *parr[0] = arr[1][0] = 4
| 프로세스 | 시간 | 대기시간 |
|---|---|---|
| A | 1 12 13 14 15 16 17 18 | 18-1-8 = 9 |
| B | 2 5 6 7 | 7-2-4 = 1 |
| C | 3 19 20 21 22 23 24 25 26 | 26-3-9 = 14 |
| D | 4 8 9 10 11 | 11-4-5=2 |
26 / 4 = 6.5의미
- 선점 : CPU가 한 번 할당되면 다른 프로세스는 점유 불가
- 비선점 : CPU를 차지하는 프로세스가 있어도 다른 프로세스가 빼앗아 사용 가능
선점
- RR
- Round Robin
- 준비상태 큐에 먼저 들어온 프로세스 먼저 CPU할당
- 할당된 시간만 실행. 완료되지 않으면 다음 프로세스에 CPU 넘겨줌
- SRT
- Shortest Remaining Time
- SJF의 선점형태 변형
- 가장 짧은 실행시간인 프로세스부터 처리
- 새로운 프로세스가 더 빨리 끝나면 얘부터 처리
비선점
- FCFS
- First Come First Service (FIFO)
- 준비상태 큐에 도착한 순서대로 CPU 할당
- SJF
- Shortest Job First
- 가장 적은 평균 대기시간
- 실행 시간이 가장 짧은 프로세스부터 CPU 할당
- HRN
- Highest Response - ratio Next
- 대기시간과 실행시간으로 계산된 우선순위
(대기시간+서비스시간) / 서비스시간
public class Main {
public static String rf(String str, int index, boolean[] seen) {
if(index < 0) return "";
char c = str.charAt(index);
String result = rf(str, index-1, seen);
if(!seen[c]) {
seen[c] = true;
return c + result;
}
return result;
}
public static void main(String[] args) {
String str = "abacabcd";
int length = str.length();
boolean[] seen = new boolean[256];
System.out.print(rf(str, length-1, seen));
}
}
seen[c] = true / c+result 로 누적return result
- 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하기 위해, 제어를 통신하거나 제어 요소를 전달하는 결합도이다.
- 한 모듈이 다른 모듈의 상세한 처리 절차를 알고 있어 이를 통제하는 경우나 처리 기능이 두 모듈에 분리되어 설계된 경우에 발생한다.
답 : ( ) Coupling
| 종류 | 설명 |
|---|---|
| 내용 결합 | 모듈 간의 인터페이스로 데이터, 지역 변수 등을 직접 참조하거나 수정할 때의 결합도 |
| 공통 결합 | 모듈 간의 인터페이스로, 모듈 밖에 선언된 전역 변수를 사용하여 전역 변수를 갱신하는 방식으로 상호작용 |
| 외부 결합 | 모듈들이 운영체제, 하드웨어 포맷 등 외부 인터페이스를 공유 |
| 제어 결합 | 단순 처리 대상인 데이터만 전달되는 것이 아니라 어떻게 처리해야 하는지를 결정하는 제어 요소가 전달되는 경우 |
| 스탬프 결합 | 모듈 간의 인터페이스로 배열이나 레코드 등의 자료 구조가 전달될 때의 결합도 |
| 자료 결합도 | 필요한 데이터만 명확히 전달 |
#include
struct node {
int n1;
struct node *n2;
}; // linked list와 유사
int main() {
struct node a = {10, 0}; // a.n1 = 10, a.n2 = null
struct node b = {20, 0}; // b.n1 = 20, b.n2 = null
struct node c = {30, 0}; // c.n1 = 30, c.n2 = null
struct node *head = &a; // head -> &a
a.n2 = &b; // a.n2 -> &b
b.n2 = &c; // head->n2->n1 → b.n1 → 20
printf("%d", head -> n2 -> n1); //
return 0;
}
struct node n1 : 정수값n2 : 다음 노드를 가리키는 포인터 (struct node * )main()a.n1 = 10, a.n2 = NULLb.n1 = 20, b.n2 = NULLc.n1 = 30, c.n2 = NULLstruct node *head = &a; : head -> &a a.n2 = &b; : a.n2 -> &bb.n2 = &c; : b.n1 → 20head -> n2 -> n1head -> &ahead->n2 -> a.n2 -> &bhead->n2->n1 -> b.n1 -> 20public class Main {
public static void main(String[] args) {
String str = "ITISTESTSTRING";
String[] result = str.split("T");
System.out.print(result[3]);
}
}