신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

자바 JAVA & WEB

JAVA의 특징 : OOP, JVM, GC, Multi Thread

자바는 미국의 선 마이크로 시스템즈가 개발한 객체 지향 프로그래밍 언어이다. 객체 지향 언어라서, 캡슐화, 상속, 다형성이 잘 표현된 언어이다.

JVM만 위에서 돌아가기 때문에 운영체제에 상관없이 돌아간다. 즉, 운영체제에 독립적이다. 

Garbage Collector를 통해 메모리 관리가 된다.

멀티쓰레드를 지원한다.


Class(클래스), Instance(인스턴스), Object (객체)

우리가 구현하고자 하는 실생활의 물리적인 객체(Obejct)를 클래스로 정의한다. 그리고 이 클래스(Class)로부터 만들어진것이 인스턴스(Instance)이다. 

예를들어, 클래스는 과자 틀, 인스턴스는 과자 틀을 이용하여 만든 각각 맛이 다른 과자


OOP (객체 지향 프로그래밍)

Object-Oriented Programing, 객체단위로 나누어 프로그래밍을 한다. 객체간의 상호작용을 통해 프로그램이 완성된다. (객체 하나하나, 자동차의 부품이라고 생각하면 됨)


특징

객체지향 프로그래밍 언어는 코드의 재사용이 높다.

운영관리가 쉬움 (코드 변경이 쉬움)

가독성이 높아짐

개발속도의 향상

상속


오버로딩 Overloading, 오버라이딩 overriding

오버로딩(Overloading) : 같은 이름의 메소드를 갖지만, 들어가는 인자의 개수나 타입이 다르게 정의하는 방법

오버라이딩(Overriding) : 상속을 받았을 때, 상위클래스에서 사용하던 메소드를 하위클래스에서 재정의 하는 방법


Garbage Collection(가비지 컬렉션)

사용하지 않는 동적 할당된 메로리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수한다. C언어와는 다르게 자동으로 가비지 컬렉터가 메모리를 관리해준다. (가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부름)


JDBC(Java Data Base Connection)

JAVA를 통해 데이터 베이스에 접근 할 수 있게 해줌



자료구조

선형구조 : 배열, 연결리스트(단일연결리스트, 이중연결리스트), 큐, 스택

배열(Array) : 연속적으로 메모리에 할당된다. 논리적, 물리적 순서가 동일하고, 연속적이어서 접근이 용이하다. 배열의 특성상 순서를 유지하기 때문에 중간위치에 삽입을 하려면 순서를 미뤄야하기 때문에 매번 데이터의 이동이 필요하다.


배열의 장단점

장점 : 연속적인 메모리 할당으로 접근이 빠르다. (예를들어, int a[3]은 "a[3]의 주소 = a의 주소 + 4byte*3")

단점 : 데이터 삽입이 불편하다. 크기가 고정되어 있다. 배열의 크기가 너무 크면 메모리공간을 할당 못받을 수 도 있다.


연결리스트(Linked List) : 연결리스트에는 '단일연결리스트', '이중연결리스트'가 있다. '단일연결리스트'의 노드는 데이터와 포인터로 이루어진다. 포인터는 그 다음 노드의 주소를 가리킨다. '이중연결리스트'는 데이터와 2개의 포인터(이전 노드 포인터, 다음 노드 포인터)로 이루어진다.


연결리스트의 장단점

장점 : 포인터를 이용하기 때문에 삽입/삭제가 쉽다.

단점 : 포인터로 연결이 되어 있기 때문에, 배열에 비해 접근속도가 느리다.



단일연결리스트(Singly Linked List)와 이중연결리스트(Doubly Linked List)의 차이점

'단일연결리스트'는 포인터 하나로 다음 노드를 가리키고 있으므로, 한쪽 방향으로만 접근이 가능하다. 반면, '이중연결리스트'는 포인터 2개를 이용하여, 이전노드와 다음 노드를 가리키고 있으므로, 양쪽 방향으로 접근이 가능하다. 결국, '이중연결리스트'가 좀 더 접근에 용이하다. 하지만, 포인터 하나를 더 사용함으로 메모리 공간을 더 할당받아야 한다.


큐(Queue) : 먼저 들어온 데이터가 먼저 빠져나간다. (FIFO, First-In-First-Out)

스택(Stack) : 나중에 들어온 데이터가 먼저 빠져나간다. (LIFO, Last-In-First-Out)


비선형 구조 :  트리, 그래프

트리(Tree) : 하나 이상의 노드로 구성된 구조


이진트리(Binary Tree)의 종류 

정이진트리(Full Binary Tree), 포화이진트리(Perfect Binary Tree), 완전이진트리(Complete Binary Tree), 균형이진트리(Balanced Binary Tree)



정이진트리(Full Binary Tree) : 모든 노드의 차수가 0 또는 2를 가지는 트리

포화이진트리(Perfect Binary Tree) : 모든 노드들이 같은 깊이를 가지고, 모든 노드들이 채워진 트리

완전이진트리(Complete Binery Tree) : 위에서 아래로, 왼쪽에서 오른쪽으로 채워진 형태의 트리



균형이진트리(Balanced Binary Tree) : 모든 단말 노드의 깊이가 동일하거나 최대 1깊이 까지만 차이가 나는 트리


순회 Traversal : 전위 순회, 중위 순회, 후위 순회

트리안에서 노드들을 탐색하기 위한 것으로, 탐색 순서에 따라 3가지 방법(전위 순회, 중위 순회, 후위 순회)으로 나눠짐


전위 순회(Preorder Traversal) : root > left > right

중위 순회(Inorder Traversal) : left > root > right

후위 순회(Postorder Traversal) : left > right > root


알고리즘

시간복잡도 Big-O : 연산 속도를 효율적으로 계산

컴퓨터 사양에 상관없이 프로그램 연산 수행 횟수에 따라 연산속도를 계산한다. 시간복잡도를 계산하는 방법은 여러가지가 있지만, 보통 빅오(Big-O) 방식으로 계산을 한다. 빅오는 최악의 경우(가장 많이 연산을 하는 경우)의 시간을 계산하는 방법이다.



속도

O(1) > O(logN) > O(N) > O(NlogN) > O(N^2) > O(N^3) > O(2^N) > O(N!)


분할정복(Divide and Conquer) : 퀵 정렬, 병합 정렬, 이진 탐색

퀵 정렬(Quick Sort) : 피봇(pivot)을 정해서, 피봇을 기준으로 왼쪽은 피봇보다 작은값이 오도록 하고, 오른쪽으로는 큰값이 오도록 한다. 2개의 리스트로 만들어서 재귀적(Recursion)으로 위 과정을 반복한다. 시간복잡도는 최악의 경우 O(N^2), 평균적으로 O(NlogN)을 가진다. (최악의 경우 = 이미 정렬이 된 경우, 분할정복 알고리즘을 사용하지 못하는 경우)

Quick Sort


병합 정렬(Merge Sort) : 정렬되지 않은 리스트를 절반으로 나눠서 2개의 리스트를 합치면서 재귀적(Recursion)으로 순서를 정렬한다. 다른 정렬과 다르게, 리스트를 합치면서 잠시 데이터를 저장할 메모리 공간이 더 필요하다. 시간복잡도는 O(NlogN)을 보장한다. 

 Merge Sort


이진 탐색(Binary Search) : 정렬된 상태에서 진행된다. 절반으로 나눠서 찾고자 하는 값이 절반에 위치한 값보다 작으면 앞쪽 리스트에서, 크면 뒷쪽 리스트에서 위 과정을 찾고자 하는 값이 나올때까지 재귀적으로 반복한다.


그리디(Greedy) 알고리즘 : 크루스칼 알고리즘, 다익스트라 알고리즘

크루스칼 알고리즘(Kruskal Algorithm) : 가장 낮은 비용(최소 비용)으로 모든 노드들을 연결하는 알고리즘. 구현시 주의할점은 사이클이 생기지 않도록 한다. Union-Find(Disjoint Set)을 통해 해결



다익스트라 알고리즘(Dijkstra Algorithm) : 최단경로(Shortest Path)를 찾는 알고리즘


비교기반 알고리즘 : 선택정렬, 버블정렬, 삽입정렬

선택정렬(Selection Sort) : 가장 작은 값을 찾아 맨 앞으로 보내는 정렬 방법. 시간복잡도는 O(N^2)을 가진다.

버블정렬(Bubble Sort) : 이웃한 원소를 비교하여 큰 값을 뒤로 보내는 정렬 방법. 시간복잡도는 O(N^2)을 가진다.

삽입정렬(Insertion Sort) : 원소를 알맞은 위치에 삽입하는 정렬 방법. 시간복잡도는 O(N^2)을 가진다. 정렬이 되어 있는 경우 매우 빠른속도로 연산이 되며, 이때 O(N)의 시간복잡도를 가진다.


이진트리를 이용한 정렬 :  힙 정렬(Heap Sort)

힙정렬(Heap Sort) : 완전이진트리를 이용하여 정렬하는 방법이다. 부모노드가 자식노드보다 큰값을 가지는 형태를 '힙(Heap)'이 되었다고 한다. 이진 트리를 힙상태로 만들어서 가장 큰값이 root 노드가 되도록 한다. 가장 큰 값과 맨 아래의 단말노드와 바꾸고 가장 큰 값을 제외한 상태에서, 이진 트리를 다시 힙상태로 만든다. 위 과정을 반복한다.


분포기반 알고리즘 : 계수정렬, 버킷정렬, 기수정렬

계수정렬(Count Sort) : 

버킷정렬(Bucket Sort) : 

기수정렬(Radix Sort) : 


정리. 시간복잡도를 기준으로 나눈 정렬

O(N) :  계수정렬, 버킷정렬, 기수정렬

O(NlogN) : 퀵정렬(평균), 병합정렬, 힙정렬

O(N^2) : 선택정렬, 버블정렬, 삽입정렬, 퀵정렬(최악의 경우)


네트워크

OSI 7계층

Application Layer : HTTP, DHCP 


Presentation Layer : 통신하는 두 장치가 이해 할 수 있도록 번역하는 역할


Session Layer : SSL, TLS / 통신 세션을 구성 역할, 포트(port) 연결


Transport Layer : TCP, UDP / end-point간 통신을 제어, 에러 확인들을 함. 주로 사용하는 TCP가 있다. 헤더에는 세그먼트(segment)가 들어간다.


Network Layer : IP, ICMP / 패킷(packet)을 전달하는 역할. 대표적으로, IP 프로토콜이 있다.


Datalink Layer : MAC주소를 이용하여, 목적지로 프레임(Frame, bit의 모음)을 보낸다.


Physical Layer : 비트(bit)를 보내주는 역할. 물리적인 연결을 통해 정보를 보냄(유선 케이블, 무선 통신 등)



패킷 (Packet)



운영체제

스케줄러 알고리즘
데드락
가상메모리
페이징


데이터베이스

관계형데이터베이스

oracle, mysql

create, alter

select, insert, update, delete

grant, revoke


기타

애자일 방법론

Agile = 기민한, 좋은것을 빠르고 낭비없게 만드는 것.


애자일 개발 방법론은 계획을 통해서 주도해 나갔던 과거의 방법론과는 다르게 앞을 예측하며 개발을 하지 않고, 일정한 주기를 가지고 끊임없이 프로토 타입을 만들어내며, 그때 그때 필요한 요구를 더하고 수정하여 하나의 커다란 소프트웨어를 개발해 나가는 개발 방법이다. 예전에는 애자일 개발 프로세스는 "경량(Lightweight)" 프로세스로 불렸다.


클라우드

Openstack

빅데이터

IoT

5G

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기