티스토리 뷰

study/java

Java 기본

dev.s 2018. 4. 25. 10:26

OOP(Object Oriented Programming)

객체 지향 프로그래밍으로 각각의 객체들을 조립해서 하나의 프로그램으로 만들어내는 것이라고 할 수 있다. 각각의 객체는 하나의 부품으로 볼 수 있기 때문에 유연하고 변경이 용이하다.

캡슐화 : 필드와 메소드를 하나로 묶어 내부 구현을 숨길 수 있다. 접근제한자를 활용한다. 내부 구조에 대한 변경등을 숨길 수 있다.

다형성 : 같은 타입으로 다양한 형식의 결과를 얻을 수 있다. 동일한 추상 클래스, 혹은 인터페이스를 상송하여 다양한 형태의 클래스를 생성할 수 있으며 각각 다른 결과를 나타낼 수 있다.

상속 : 부모 클래스의 성질을 자식 클래스가 상속받아 사용할 수 있다.

 

Overloading : 동일한 메서드 이름을 가지고 매개변수와 리턴 값을 변경하여 다른 역할을 하도록 구현하는 방법

Overriding : 상속받은 클래스나 인터페이스에서 구현되지 않았거나, 구현되었으나 다른 동작을 하도록 새롭게 구현하는 방법. - 리턴값과 매개변수는 동일해야 함.

 

인터페이스 : 추상 메소드와 상수로만 이루어짐. - 다중 구현 가능

implements 명령어를 통해 여러개의 인터페이스를 구현할 수 있음.

추상 클래스 : 추상 메소드와 상수 뿐만 아니라 구현된 메소드도 존재함. - 다중 상속 불가

extends 명령어를 통해 상속하는 데 한 개의 클래스만 상속 할 수 있음.

 

Map : 인터페이스. Key value 구조를 가짐. 키 중복 불가

hashMap : 요소의 삽입, 삭제가 빠름. 검색도 빠름. 해시함수가 저장된 위치를 바로 찾아냄.

hashtable : map 과 기본적으로 동일하게 사용 가능함. key value 구조. 단 동기화됨. hashtable을 상속받은 Property 가 자주 사용됨.

 

자료구조에서 Key 로 활용될 수 있는 Object 는 동일함을 확인할 수 있는 hashcode() equals() 함수를 override 하여 구현해야 한다. 따라서 primitive type 의 자료형은 key 로 사용할 수 없으며 wrapper class를 통해서 key 로 사용 가능하다.

 

Platform independent

OS와 관계없이 java 로 구현된 프로그램은 JVM 위에서 동작하도록 설계되었기 때문에 Platfrom 과 독립적인 관계라고 할 수 있다. 컴파일러를 통해 자바 바이트 코드로 컴파일 된 후 해당 바이트 코드를 사용해서 JVM에서 실행된다.

 

JVM 구조

Java ->class : 컴파일러를 통해 컴파일되어 자바 바이트 코드 변환

class loader : 변환된 자바 바이트 코드를 필요에 의해 loading .

Runtime Data Areas : 자바 어플리케이션이 실행되면서 할당 받은 메모리 영역

Garbage Collector : 어플리케이션에서 생성한 객체의 생존여부를 판단, 참조되지 않는(사용되지 않는) 메모리를 반납(heap 영역에서 수행)

 

JVM 메모리 구조

Method(static) area: JVM에서 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 메서드와 필드, static 변수, 메서드 바이트 등을 보관 – 프로그램 종료시까지 보관 – 모든 스레드에서 공유

Runtime constant pool : Method Area 영역에 포함. 클래스와 인터페이스의 상수, 메서드와 필드에 대한 모든 레퍼런스 저장. 이 풀을 통해 메서드나 필드의 주소를 찾아 참조

- 프로그램 종료시까지 보관 – 모든 스레드에서 공유

heap area: 프로그램 상에서 데이터를 저장하기 위해 동적으로 할당. 객체 생성, 또는 인스턴스와 배열을 저장 – 객체가 더 이상 쓰이지 않거나 null 선언시 GC. - 모든 스레드에 공유

stack area: 메서드 호출 시 생성되는 스레드 수행정보를 기록 메서드 정보, 지역 변수 매개변수, 연산 중에 발생하는 임시 데이터 – 메서드가 끝날 때 제거 – 각 스레드 별로 생성

 

heap area : young(eden, survivor1,2), old.

    Minor gc : eden survivor1 에 살아있는(참조가 있는)데이터를 survivor2 로 넘기면서 정리

               다음 gc survivor 2 1으로.

   Major gc(full gc) : old 영역의 데이터를 정리.

Stop-the-world

 

프로세스와 스레드의 차이

Process : 실행되고 있는 프로그램을 프로세스라 한다. 실행될 때 운영체제로부터 자원을 할당받음.

Thread : Process 내에서 수행되는 subset. 프로세스에서 할당 받은 자원을 이용해 수행. 다수의 쓰레드를 활용할 때 멀티쓰레드라고 함. 멀티 쓰레드에서는 자원의 사용에 대해 고민해야 하며 동일 자원을 활용하게 될 경우 충돌이 발생할 수 있음. 이때 활용 가능한 것이 동기화. Synchronized 또는 static 변수를 사용하여 다수의 쓰레드에서 동일 자원을 활용할 수 있음.

 

쓰레드간 통신 : 전체 스레드에 공유되는 heap 영역을 통해 통신할 수 있음. 전역변수

 

- 프로세스 : OS가 메모리 등의 자원을 할당해준 실행중인 프로그램을 가리킨다. 이때, 각각의 프로세스는 서로 메모리 공간을 독자적으로 갖기 때문에

서로 메모리 공간을 공유하지 못한다. 따라서 공유하기 위해서는 IPC(InterProcess Communication)과 같은 방식이 필요하다.

- 쓰레드 : 쓰레드는 프로세스 내에서 프로세스의 자원을 가지고 실제로 일하는 "일꾼"과 같으며 각 쓰레드는 독자적인 Stack 메모리를 갖고 그 외의

자원(메모리)는 프로세스 내에서 공유하게 된다.

 

 

 

 

자료구조

: 이진바이너리 트리로 되어 있으며 가장 크거나 가장 작은 값이 root node 로 정렬되어 있는 자료구조. PriorityQueue 등 구현하는데 사용됨.

stack : LIFO(last in first out) 구조를 가지고 있다. 입출력이 한쪽 끝에서만 이루어지며 데이터 입력을 push, 출력을 pop 이라고 함.

queue : FIFO(first in first out) 구조를 가지고 있음.

 

 

XML, json

데이터를 전송하기 위해, 받기 위해 사용되는 데이터 포맷. 두 포맷 모두 사람이 읽기 쉽고, 계층구조를 가짐.

json 은 태그 사용하지 않아 간결하며 배열사용이 가능. xml 은 파서를 활용하여야 하나 json 은 간단하게 데이터를 분석할 수 있음.

 

 

Restful API (Representational State Transfer)

웹에 존재하는 모든 자원(이미지, 동영상, DB자원)에 고유한 URI를 부여해 활용. 자원을 정의하고 자원에 대한 주소를 지정하는 방법론.

어플리케이션의 복잡도가 증가하면서 어플리케이션의 분리 및 통합이 주요 이슈가 되었음. 모바일과 같은 다양한 클라이언트가 등장하면서 backend 하나로 다양한 디바이스를 지원하기 위해 REST의 필요성이 증대됨.

자원:uri, 행위:http method, 표현:representation

 

framework, library

framework : 어느정도 구성되어진 뼈대를 채우며 프로그램을 작성하도록 제공.

library : 특정 기능에 대한 API를 모아놓은 집합. 필요한 기능을 호출해서 사용.

 

라이브러리 사용은 어플리케이션 제작자가 직접 프로그램의 흐름을 제어하며 단지 동작 중에 필요한 기능이 있을 때 능동적으로 사용한다.

반면 프레임워크는 어플리케이션 코드가 프레임워크에 의해 사용된다. 제어의 역전 개념이 적용.

 

Spring framework

자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크

동적인 웹사이트 개발하기 위한 여러 가지 서비스를 제공.

제어 반전(IoC:Inversion of Control) : 프로그램의 제어권이 프레임워크에 있어 개발자가 작성한 코드를 프레임워크에서 필요에 따라 호출한다.

의존성 주입(Dependency Injection): 각각의 계층이나 서비스들 간의 의존성이 존재할 경우 프레임워크가 서로 연결시킨다.

관점 지향 프로그래밍(AOP:Aspect Oriented Programming) : 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리

데이터 액세스 프레임워크: JDBC, myBatis, hibernate 등에 대한 지원 기능을 제공하여 데이터베이스 프로그래밍을 쉽게 할 수 있다.

확장성이 높다.

 

Spring MVC

Model : data 처리를 위한 클래스

View : 사용자 인터페이스 요소. 화면

Controller : 데이터와 비즈니스 로직 간의 상호작용

 

클라이언트에서 요청 -> web.xml에서 dispatcherServlet에서 요청을 핸들링 ->컨트롤러에서 비즈니스 로직 및 DB 관련 로직 처리 후 ViewResolver 처리 ->view 전달

 

 

웹서버와 와스서버의 차이

웹서버 : 웹브라우저의 요청을 받아들이는 서버. 작업의 결과를 웹브라우저에게 응답하는 곳이다. 요청된 페이지의 로직 및 데이터 베이스와의 연동을 위해 어플리케이션 서버에 이들의 처리를 요청하는 작업을 수행

 

웹어플리케이션 서버 : 요청된 페이지의 로직 및 DB연동로직을 처리

 

<!--[if !supportLists]-->1. <!--[endif]-->웹 브라우저가 웹 서버에 어떤 페이지를 요청

<!--[if !supportLists]-->2. <!--[endif]-->웹 서버는 요청된 페이지의 로직 및 DB와의 연동을 위해 WAS에 처리 요청

<!--[if !supportLists]-->3. <!--[endif]-->WASDB와 연동이 필요하면 DB와 연동하여 데이터의 처리를 수행

<!--[if !supportLists]-->4. <!--[endif]-->로직 및 DB작업 결과를 웹 서버로 보낸다.

<!--[if !supportLists]-->5. <!--[endif]-->웹 서버는 그 결과를 정적인 view 에 결합하여 브라우저에 응답한다.

웹서버는 정적인 컨텐츠 처리. WAS 는 동적 컨텐츠 전달.

WAS만으로도 처리 가능하나 정적인 컨텐츠 처리는 웹서버가 더 빠르기 때문에 웹서버를 앞에 두고 필요한 WAS들을 플러그인 형태로 설정하여 효율성을 높인다.

 

캐시와 세션

- 공통점 : 둘 다 사용자의 데이터를 저장한다.

- 차이점

- 캐시 : 캐시는 Client 컴퓨터에 저장했다 서버 요청시 네트워크를 타고 서버로 전달되기 때문에 보안에 취약하다.

- 세션 : 세션은 서버에 저장되고 브라우저 단위로 관리된다. 캐시에 비해 보안성이 좋다.

 

SVN, Git

기본적으로 서버의 레파지토리를 사용하여 버전관리를 하는 것은 동일하다.

차이점은 SVN 은 서버에만 레파지토리가 존재하여 commit 등의 동작은 온라인으로만 가능하다. git 은 온라인상의 레파지토리를 로컬로 복사하여 관리하여 훨씬 빠르다. 로컬에 commit 등의 작업을 편하게 진행하고 필요할 때 온라인 서버로 Push 작업을 하면 된다. 또한 Offline인 경우 svn 은 변경사항에 대한 commit 작업이 불가하나 git 은 로컬에 우선 commit 해놓고 추후에 push 작업을 진행하면 된다.

그 외에 svn 은 브랜치가 디렉토리 구조로 되어 있어서 서버에서 받을 때 모두 받게 되어 크기가 크다. 그러나 git 은 해당 시점의 snapshot 만을 다운받으면 된다.

 

GPB(google protocol buffer)

랭귀지 중립적, 플랫폼 중립적 데이터 시리얼라이즈 포맷

데이터 포맷을 정의하여 proto 파일을 생성 후 해당 파일을 컴파일하면 해당 언어에서 사용가능한 라이브러리 파일을 생성해줌. 라이브러리 파일을 사용하여 송수신하면 되기 때문에 여러 클라이언트와 서버 간의 통신을 하기 용이함.

 

Netty

프로토콜 서버 및 클라이언트 등 네트워크 어플리케이션을 빠르고 쉽게 개발하는 것을 가능하게 해준 NIO 클라이언트 서버 프레임워크. TCP, UDP 와 같은 네트워크 프로그래밍을 매우 간단하고 능률적으로 만들어준다.

Asynchronized Event-Driven Network framework.

EventLoop 가 들어오는 요청에 대해서 담당하고 (single thread) 해당 작업은 Work thread가 수행한다.

 

NIO

IO : stream 을 사용. 입력 스트림, 출력 스트림 모두 생성해야 함. 단방향 통신. blocking 방식 지원

NIO : channel을 사용하여 양방향 통신 가능. 버퍼와 비동기 방식을 기본적으로 제공, blocking, non-blocking 모두 지원

 

IO 는 연결 클라이언트 수가 적고 전송되는 데이터가 대용량으로 순차처리 될 때 사용하는 것이 좋음

NIO 는 연결 클라이언트가 많고 하나의 입출력 처리가 오래 걸리지 않는 경우에 사용하는 것이 좋다. 모든 입출력에 버퍼가 사용되기 때문에 대용량 데이터 처리는 버퍼 할당의 문제가 있다.

 

Cassandra DB

 분산 대용량 저장소, write read 보다 빠르고, read rdb 보다 빠름. 서비스 중에 노드 추가 가능. Key-value 구조. CQL 지원

데이터 구조

 Column : 최소 단위. Name, value, timestamp 로 구성

 Columns : 하나 이상의 column 집합 (rdb row)

 Column family : rdb table 에 해당 . key – value.

 Keyspace : rdb database. Column family 의 집합

 

rabbitMQ

 AMQP(Advanced Message Queing Protocol) 을 구현한 메시지 브로커. Cluster 구성이 쉽고 manageUI 가 제공되며 무엇보다 성능이 뛰어나다고 알려져 많이 사용됨.




 

'study > java' 카테고리의 다른 글

자바  (1) 2018.06.01
[JAVA] JAVA 동작원리 및 JVM  (0) 2018.05.05
[JAVA] Object Oriented Programming - 객체지향프로그래밍  (0) 2018.05.05
[JAVA] Primitive type & Reference type  (0) 2018.05.05
JAVA 및 전반적인 기술 질문들  (5) 2018.04.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/08   »
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
31
글 보관함