매니페이스 파일은 앱의 이름, 버전, 구성요소, 권한 등 앱의 실행에서 꼭 필요한 정보가 저장 되어 있는 파일
xml파일로 프로젝트의 최상위에 존재
태그 구성으로 가장위는 manifest 태그가 존재하고 패키지명, 버전 등이 기제됩니다.
application 태그에는 앱 아이콘, 앱 이름등의 정보가 저장됩니다.
activity태그에는 액티비티 클래스명과 액티비티 이름을 정의합니다.
acitivty 하위에는 intent-filter 태그를 이용하여 액티비티에 대한 인텐트 작업시 필요한 action과 category를 정의
RxJava란 ?
일단 RxJava는 Reactive Programming을 기반으로 한 언어이다.
즉 Reactive Extension의 JVM버전이다.
비동기 데이터 처리를 효율적으로 할 수 있는 장점이 있다.
반응형 프로그래밍
for if while과 같은 것이 아니라 sql 쿼리 같은 선언형으로 구성됩니다.
또 함수를 단지 호출하는 대상이 아니라 변수로도, 혹은 인자로도 넘길 수 있습니다.
이러한 함수형 언어의 도구들을 자유롭게 활용해야 합니다. (java8의 람다표현식)
1) 반응형 프고르맹은 명령형 프로그래밍의 반대말이다.
명령형 프로그래밍이란... 우리가 지금까지 해온 C/C++, Java라고 생각하면 됩니다. 변수, for, while, if등의 제어문을 사용합니다.
그 반대로 반응형 프로그래밍이란 선언형(declarative) 프로그래밍입니다. 대표적인 예로 SQL이 있습니다.
반응형 프로그래밍은 선언형 프로그래밍을 지향합니다.
2) 반응형 프로그램밍은 함수형 프로그래밍을 활용한다.
함수형 언어는 함수를 단지 호출하는 대상이 아닌 변수로도 할 수 있고 인자로도 넘길 수 있고 마음대로 할 수 있다.
반응형 프로그래밍은 함수형 언어 도구들을 자유자재로 활용해야 합니다. 예를 들어 Java8에 도입된 람다 표현식은 반드시 알아야한다.
3) 반응형 프로그래밍은 함수형 프로그래밍 언어의 도구들을 가지고 데이터 흐름을 Composable 하게 구현하는 것입니다.
Java/Kotlin 차이
Java의 특징
멀티 플랫폼
크로스 플랫폼이라고도 불리는데 JVM(Java Virtual Machine)만 설치되어 있으면 어떤 운영체제에서도 애플리케이션을 작동시킬 수 있습니다.
메모리 관리
자바는 포인터 개념이 없고 자동으로 메모리를 관리합니다.
Garbage Collector 가 사용하지 않는 자원을 자동으로 반환해줍니다.
프로그래밍이 편해집니다.
OOP (Object Oriented Programing)
부품들을 조립해서 하나의 제품을 만드는 것과 같은 원리입니다.
객체(Object)라는 단위로 나누고 객체들끼리 상호작용하는 방식입니다.
멀티 스레드
Thread 클래스와 Runnable 인터페이스를 이용하여 멀티 스레드를 구현합니다.
동적 로딩
필요한 시점에 구현한 클래스를 로딩할 수 있습니다.
코틀린특징
개발자의 편의성, 간결하고 효율적인 코드 작성, 객체지향 프로그래밍과 함수형 프로그래밍의 장점을 절묘하게 조화시킨 언어
코틀린은 jvm의 바이트 코드로 실행되고 자바와 100% 호환되므로 뿌리부터 완전히 다른 새로운 개념의 언어는 아닙니다. 따라서 모든 특징을 설명하기보단 자바와 비교해가며 특징을 보도록 하겠습니다.
Type Inference
할당되는 리터럴 값을 알아서 추론해줍니다.
OOP 와 FP (Functional Programing)
객체지향 프로그래밍, 함수형 프로그래밍을 모두 지원합니다.
코틀린에서 함수는 일급 객체입니다.
고차 함수로 사용이 가능합니다.
모든 타입이 클래스 타입
기본형 타입마저 클래스로 존재합니다. (Nullable 위해)
Nullable
Null 할당이 가능한 타입을 선언할 수 있습니다.
NPE 예외를 컴파일 시점에서 미리 방지할 수 있습니다.
안드로이드 개발에서 차이
안드로이드를 개발할 땐 객체지향 언어처럼 클래스 내에서 로직을 작성해야 합니다.
여전히 자바와 코틀린을 동시에 지원하므로 자바의 형식에 맞춰서 코틀린을 사용해야 합니다.
하지만 자바로 작성했을 때보다는 코틀린 코드의 양이 훨씬 줄어들고 간결해지므로 개발자의 편의성이 훨씬 좋습니다.
일례로 Java에선 변수에 대한 get/set 함수를 만들어주고 생성자를 만들어 변수를 초기화하는 작업을 수행해야함.(수 십줄) 하지만 코틀린은 data class를 만들어 정의해주면 코드량이 엄청나게 간결해진다. (5줄이내) 아무래도 나중에 나온 언어다 보니 Java의 좋은 점+a 라고 생각하면된다.
함수형 프로그래밍
함수형 프로그래밍은 이름처럼함수를 기반으로 돌아가는 프로그램(=JavaScript)
함수형 프로그래밍은 몇 가지 원칙이 있습니다.
입출력이 순수해야합니다. (순수함수)
하나 이상의 인자를 받고, 받은 인자를 처리하여 반드시 결과물을 돌려주어야 한다.
부작용(부산물)이 없어야합니다.
함수와 데이터를 중점으로 생각합니다.
//보통의 반복문 생성
var sum = 0;
for (var i = 1; i <= 10; i++)
{
sum += i;
}
//함수형 프로그래밍
function add(sum, count)
{
sum += count;
if (count > 0)
{
return add(sum, count - 1);
} else
{
return sum;
}
}
add(0, 10); // 55
JSP(Java Server Pages)의 약자로 HTML 내에 직접 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹브루아저에게 돌려주는 서버 측 웹 프로그래밍중 하나이다. Java EE 스펙 중 일부로 웹 어플리케이션 서버(WAS)에서 동작한다.
JavaScript - 클라이 언트 언어
Front-end 개발 언어로, 정적인 웹 문서에 동작을 부여하는 스크립트 언어(소스 코드를 컴파일하지 않고도 실행할 수 있는 프로그래밍 언어를 의미한다)이다. javaScript도 웹 브라우저에서 바로 실행되며, JSP와 다르게 클라이언트 측 스크립트 언어이다.
JQuery
브라우저 호환성이 있는 HTML 속 자바 스크립트 라이브러리(Library)이다. 클라이언트 사이드 스크립트 언어를 단순화 할 수 있도록 설계 되어있다.
즉, 정리하자면 JSP는 서버에서 자원(코드)들을 사용하는 것이고, Java Script는 클라이언트에서 자원(코드)를 사용한다. JQuery는 Java Script의 라이브러로 생성된 언어이고, Java를 이용하여 HTML 문서를 출력하게 되는데 이것을 서블릿이라고 하며 이 서블릿은 Java로 간편하게 하기 위해 나온것이 JSP이다. 라고 정리하자.
[Servlet, JSP]
기능의 차이는 없고 역할의 차이만 있다.(하는 일은 동일)
Servlet
Container가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것 (Html in Java : 자바 코드안에 html 코드)
웹 개발을 위해 만든 표준
Java 코드 안에 HTML 코드
Data Processing(Controller)에 좋다.
즉 DB와의 통신, Business Logic 호출, 데이터를 읽고 확인하는 작업에 유용하다.
Servlet이 수정된 이후 java 코드를 컴파일(.class 파일 생성)한 후 동적인 페이지를 처리하기 때문에 전체 코드를 업데이트하고 다시 컴파일하는 재배포하는 작업이 필요하다.
JSP(Java Server Page) :
html기반에 java코드를 블록화하여 삽입한 것(Java in Html : HTML 코드안에 JAVA 코드)
HTML 코드안에 Java 코드
Servlet를 보완하고 기술을 확장한 스크립트 방식 표준
[JDBC]
Java Data Base Connection의 약자로 JAVA 언어를 통해 데이터 베이스에 접근할 수 있는 프로그래밍 의미.
[Get/Post 방식]
Get 방식
Post 방식
[JSP]
JavaScript
클라이언트 언어
웹 브라우저 (사용자의 컴퓨터)에서 실행되는 스크립트 언어
자바스크립트 파일은 .js 확장자를 가지며, 자바스크립트 문법에 따라 작성 됨
프로그래밍 언어 중 하나 라고 생각하면 된다.
JSP(Java Sever Page)
서버 언어(JavaScript 처럼 언어의 종류를 나타내는 것은 아니다.)
JSP는 서버에서 실행되고, 그 결과가 웹브라우저(사용자 컴퓨터)로 전송된다.
JSP는 웹 서버에서 실행되는 .JSP파일
JSP 파일에는 html태그와 javascript 함수도 사용이 가능하다. 추가로 자바 문법도 사용가능하다.
[Maven]
빌드
작성한 소스코드 (Java), 프로젝트에서 쓰인 각각의 파일 및 자원(.xml, .jpg, .jar, .properties)을 JVM이나 톰캣(=WAS)가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.
빌드도구
빌드도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램
빠른기간동안 계속해서 늘어나는 라이브러리 추가, 프로젝트 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장
초기의 java 빌드도구는 Ant-> 최근 Maven -> Gralde이 많이 쓰인다.
Maven
Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다.
Maven은 Ant와 마찬가지로 프로젝트의 전체적인 라이프 사이클을 관리하는 도구 이며, 많은 편리함과 이점이 있어 널리 사용되고 있다.
Maven은 특정문서 (pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.
간단한 설정을 통한 배포 관리가 가능하다.
[브라우저]
우리가 사용하는 브라우저는 사용자가 요청한 자원(URI 주소)을 받아와서 표시해준다. 주로 HTML 파일을 받아와 해석하여 보여주지만, 이미지, PDF 등 여러가지 파일 역시 지원한다.
브라우저는 사용자가 요청하여 받아온 HTML파일을 파싱하여 DOM 트리를 그리고, CSS 파일을 파싱하여 이를 결합한 후 렌더링을 하는 작업을 우리의 화면에 그려주게 된다.
[HTML]
HTML(HyperText Markup Language)은 웹 페이지를 위한 언어로, 특정 영역이 어떤 성질을 갖는지 미리 정해진 규칙에 따라 구조화된 요소들로 이루어진 마크업 언어이다. 마크업 언어는 태그(<>)를 이용하여 데이터 구조를 명명하는 언어이므로, 태그 안에 담기는 요소들에 따라 영역의 성질이 달라지게 되고 각 영역들이 모여 구조화된 문서를 만든다.
HTML 요소들은 W3C라는 웹 표준기구에서 정한 가이드라인을 기반으로 정해져왔기 때문에 서로 다른 브라우저에서는 표준에 맞게 해석하여 동일 페이지를 사용자에게 보여줄 수 있다.
HTML은 인간이 이해하고 구분할 수 있는 언어로 만들어져 있고, 기계는 이렇게 규약된 언어를 해석할 수 없다. 때문에, 파싱이라는 작업을 거쳐 브라우저가 해석할 수 있는 언어와 구조로 변환하는 작업이 필요하다. (각 브라우저마다 파서가 다르기 때문에 같은 HTML문서라도 다른 파싱 결과값을 가질 수 있다.)
[DOM]
첫째,브라우저는 html태그를파싱 하여돔 트리를구성한다.
동시에브라우저는 스타일시트에서 css를 파싱 하여스타일 규칙들을 만들어낸다.
둘째,위에서 언급한 돔 트리와 스타일 규칙 두 가지가 합쳐져서렌더 트리를만들어낸다.
DOM은 원본 HTML 문서의 객체 기반 표현 방식입니다. 둘은 서로 비슷하지만, DOM이 갖고 있는 근본적인 차이는 단순 텍스트로 구성된 HTML 문서의 내용과 구조가 객체 모델로 변환되어 다양한 프로그램에서 사용될 수 있다는 점입니다.
DOM이란 웹페이지의 HTML을 계층화시켜 트리구조로 만든 객체 모델이다.
javascript는 이 model로 웹 페이지에 접근하고, 페이지를 수정 할 수 있습니다.
DOM은 HTML인 웹페이지와 스크립팅언어(JavaScript)를 서로 잇는 역할이다.
이렇게 파싱된 HTML 언어는 트리구조를 갖는 객체로 표현되는데, 이를 DOM(Document Object Model)이라고 한다.
DOM은 문서에 접근할 수 있는 API로, node와 property, method를 갖는 객체로 이루어져 스크립트나 CSS와 같은 언어들이 DOM 구조에 접근 하여 커스텀 할 수 있게 만들어주는 연결 부분 역할을 갖는다.
때문에 DOM을 이용하여 텍스트값을 변경할 수 있고 스타일링 및 노드 구조까지도 바꿀 수 있다.
[DOM과 HTML의 차이]
DOM은 HTML 문서로부터 생성되지만 항상 동일하지 않습니다. DOM이 원본 HTML 소스와 다를 수 있는 두 가지 케이스가 있습니다.
작성된 HTML 문서가 유효하지 않을 때
올바르게 교정되므로 HTML!=DOM
자바스크립트에 의해 DOM이 수정될 때
javascript로 DOM을 업데이트
이 코드는 DOM을 업데이트합니다. 하지만 HTML 문서의 내용을 변경하진 않습니다.
W3C의 DOM 스펙에선, 문서의 의미는 HTML에만 국한된것이 아니라고 한다. XML 역시 DOM을 사용하여 데이터를 관리할 수 있으며, DOM은 다양한 환경과 어플리케이션에서 사용할 수 있는 API라고 설명한다.
HTML은 단순히 규칙에 따라 정해진 태그, 속성값으로 이루어진 언어이며, DOM은 브라우저가 HTML 파싱한 후 생성되는 객체 모델로, document에 접근가능한 API이다.
요약정리
DOM은 HTML 문서에 대한 인터페이스입니다.
첫째로 뷰 포트에 무엇을 렌더링 할지 결정하기 위해 사용되며,
둘째로는 페이지의 콘텐츠 및 구조, 그리고 스타일이 자바스크립트 프로그램에 의해 수정되기 위해 사용됩니다.
DOM은 원본 HTML 문서 형태와 비슷하지만 몇 가지 차이점이 있습니다.
항상 유효한 HTML 형식입니다.
자바스크립트에 수정될 수 있는 동적 모델이어야 합니다.
Javascript가 getElementbyid()를 같은 함수를 이용하여 HTML문서의 각 요소(li, head같은 태그들)들을 접근하고 사용할 수 있도록 하는 객체 모델입니다.
[가상 돔(Vitual DOM)]
가상돔(Virtual DOM)은 실제DOM문서를 추상화한 개념으로, 변화가 많은 View를 실제 DOM에서 직접 처리하는 방식이 아닌 VirtualDom과 메모리에서 미리 처리하고 저장한 후 실제 DOM과 동기화 하는 프로그래밍 개념입니다.
가상 돔이 생긴 원인
기존에는 화면의 변경사항을 돔을 직접 조작하여 브라우저에 반영하였다. 하지만, 이 방법의 가장 큰 단점은 돔 트리가 수정될 때마다 렌더 트리가 계속해서 실시간으로 갱신된다는 점이었다. 즉, 화면에서 10개의 수정사항이 발생하면 수정할 때마다 새로운 랜더 트리가 10번 수정되면서 새롭게 만들어지게 되는 것이다.
효과
가상 돔을 활용하면 이러한 불필요한 렌더링 횟수를 줄일 수 있다. 가상 돔을 활용한 대표적인 프런트 앤드 프레임워크가 리액트, 뷰, 앵귤러이다. 이러한 프레임워크들은화면에 변화가 있을 때마다 실시간으로 돔 트리를 수정하지 않고 변경사항이 모두 반영된 가상 돔을 만들어낸다. 그 후 가상 돔을 이용해한 번만 돔수정을 하게 되고 이는 한 번만 렌더 트리를 만들어내게 된다. 결과적으로 브라우저는 한번만 렌더링을 하게 됨으로써불필요한 렌더링 횟수를 줄일 수 있게 되는 것이다.
[CRS vs SSR]
User는 google.com을 Server에게 요청한다.
Server는 HTML을 보내준다.
브라우저는 HTML을 랜더링하여 띄운다.
jQuery (=powerFul함)
jQuery (=powerFul함) jQueryTable
Server Side에서 Json 포맷으로 전달하면 jQuery는 테이블로 변환한다.
즉, CSR은 HTML에서 jQuery를 이용하여 랜더링하는 것 SSR은 Server에서 HTML주는 것
MVC
M : 데이터관련, 수정,삭제,저장 등 주방장
V : 보여지는 것 -> HTML, CSS 직원(접시에담음)
C : 제어연결(프로그래밍) : JS 서빙
MVC 프레임워크란
이미 MVC 골격을 미리 짜놓은 것
라이브러리 vs 프레임워크
라이브러리는 가져다 쓰는 것 (재료)
프레임워크는 기본 틀로 삼아서 그 위에 뭘 덧붙여 만드는 것
SPA(Single Page Application)
"jQuery이용하여 특정데이터말고 전체 화면을 랜더링하고 싶다"라는 needs가 생김
왜 SPA가 등장 했는가
강력한 MVC 웹 프레임워크(=Spring, C# .NET Framework)들이 등장하고 발전하면서 편리하고 빠르게 웹 사이트를 개발할 수 있게 됐다.
기존 MVC 웹 프레임워크의 문제점
오래된 웹 사이트 경우 좋아요 하나를 눌렀는데 모든 창이 다시 랜더링 되는 경우, 해결책으로 ajax가 나와서 특정 부분만 변경가능해짐 단 일일이 프로그래밍해야되는 불편함이 생김
웹 브라우저 뿐만 아니라 모바일로도 웹을 구현해야하는 일이 생김
웹, 웹앱, 안드로이드용 앱, IOS용 앱
백앤드 개발자는 그냥 DB에서 데이터만 전송하면 프로트앤드 단에서 알아서 상위의 4개의 상황에 맡게 랜더링을 실행하는 기술을 구현한다. 그것이 SPA 프레임워크이다.
SPA : 종업원(=서버)이 재료를 가져다 주면 손님(=클라)이 직접 불판에서 구워먹는 고기집
React : 프레임워크 보다는 라이브러리에 가깝다는 느낌, 막강한 라이브러리
Angular : 구글에서 만들었고 약간 어렵지만 단단하다라는 느낌, TypeScript 사용
Vue.js : 아주 쉽게 접할 수 있다는 특징
TypeScript
컴파일 언어, 정적 타입 언어이다. JS는 인터프리터 언어지만, TypeScript는 컴파일 언어로 코드 수준에서 미리 타입을 체크하여 오류를 체크한다. 쉽게 말해 TypeScript = JavaScript + type JS의 var와 같은 자료형 대신 string, number 같은 자료형을 지정함으로써 안정성을 확보한다. type이 생김으로서 1) 안정성이 확보된다. 2) type에 대한 예외처리를 하지않아도 된다. Angular에서 사용하는 것으로 알고있습니다.
컴파일러와 인터프리터
컴파일러는 고급 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 링킹 작업을 통해 컴퓨터에서 실행 가능한 프로그램으로 생성한다. C/C++, 등
인터프리터 BASIC, LISP, APL 프로그램이 직접 실행됨, 고급언어로 작성된 프로그램을 한줄 단위로 받아들여 번역하고 번역과 동시에 프로그램을 한줄 단위로 즉시 실행시키는 프로그램.
CSR방식
SSR의 경우 Btn을 이전페이지 누를 때 마다 HTML 모두 생성해서 Client로 보낸다. (=비효율적)
CSR의 경우 이전의 받아던 파란색 btn은 keep 해주고 새로운 data를 Server에서 가져온다.(=효율적)
포인터는 어떤 변수의 주소값을 저장하는 변수입니다. 포인터의 선언은 변수명 앞에 *을 붙이면 가능하고, 어떤 변수의 주소값을 얻기 위해서는 &를 붙이면 됩니다.
#include <stdio.h>
int main() {
int* p = NULL;
int num = 10;
p = #
printf("포인터 p의 값: %d \n", p);
printf("num의 주소: %d \n", &num);
return 0;
}
[Java의 장점과 단점 ]
장점
JVM 위에서 동작하기 때문에 운영체제에 독립적이다.
가비지컬렉터가 메모리를 관리해주기 때문에 편리하다.
단점
JVM 위에서 동작하기 때문에 실행 속도가 상대적으로느리다.
다중 상속이나 타입에 업격하는 등 제약이 있는 것이많다.
[오버라이딩(Overriding)과 오버로딩(Overloading) ]
오버라이딩(Overriding): 상위 클래스가 가지고 있는 메소드를 하위 클래스에서 재정의하여 사용하는 기술
오버로딩(Overloading): 매개변수의 유형과 개수를 변경하면서 같은 이름의 메소드를 여러 개 사용하는 기술
public class Person {
public void print() {
System.out.println("나는 사람입니다");
}
}
public class Student extends Person {
// Overriding
public void print() {
System.out.println("나는 학생입니다.");
}
// Overloading
public void print(String name) {
System.out.println(name + "는 학생입니다");
}
}
[클래스(Class), 객체(Object), 인스턴스(Instance)의 개념 ]
클래스(Class): 객체를 만들어내기 위한 설계도 혹은 틀
객체(Object): 설계도(클래스)를 기반으로 선언된 대상, 클래스의 인스턴스라고도 부름
인스턴스(Instance): 객체에 메모리가 할당되어 실제로 활용되는 실체
// 클래스
public class Person {
private String name;
}
public class Main {
public static void main(String[] args) {
// 객체 = 클래스의 인스턴스
Person person;
// 인스턴스
person = new Person();
}
}
[싱글톤 패턴(Singleton Pattern) 구현 및 사용 이유 ]
public class Person {
private static Person instance;
public static Person getInstance() {
if(instance == null){
instance = new Person();
}
return instance;
}
}
싱글톤 패턴은 단 하나의 인스턴스를 생성하여 사용하는 디자인패턴입니다. 싱글톤패턴은 아래의 경우에 사용합니다.
해당 인스턴스가 절대적으로 1개만 존재한다는 것을 보증하고 싶은 경우
동일한 인스턴스를 자주 생성해주어야 하는 경우(메모리 낭비의 방지)
하지만 이러한 싱글톤 패턴은 객체 지향 설계의 원칙에 적합하지 않으며, LifeCycle 제어가 힘들고, 멀티스레드 환경에서 여러 개의 객체가 생성되는 문제가 발생할 수 있습니다. 그러한 이유로 멀티스레드 환경이라면 static 앞에 synchronized 키워드를 붙여 동기화 작업을 추가해주어야 합니다.(당연히 성능이 저하됩니다).
[추상클래스와 인터페이스의 차이 ]
추상클래스
단일 상속만이 가능하다.
모든 접근 제어자를 사용할 수 있다.
변수와 상수를 선언할 수 있다.
추상 메소드와 일반 메소드를 선언할 수 있다.
인터페이스
다중 구현이 가능하다.
public 접근 제어자만 사용할 수 있다.
상수만 선언할 수 있다.
추상메소드만 선언할 수 있다.
[ Java의 List, Set, Map 차이 ]
List
데이터를 순차적으로 저장한다.
데이터의 중복을 허용한다.
데이터로 null을 허용한다.
Set
순서없이 Key로만 데이터를 저장한다.
Key의 중복을 허용하지 않는다.
Key로 null을 허용하지 않는다.
Map
순서없이 Key, Value로 데이터를 저장한다.
Value는 중복을 허용하지만 Key의 중복을 허용하지 않는다.
Key로 null을 허용하지 않는다.
[Java의Vector와 ArrayList 차이 ]
Vector
동기화를 지원한다.
속도가 느리지만 병렬 상황에서 안전하다.
크기가 증가하는 경우, 2배 증가함(10 -> 20)
ArrayList
동기화를 지원하지 않는다.
속도는 빠르지만 병렬 상황에서 안전하지 않다.
크기가 증가하는 경우, 1.5배 증가함(10 -> 15)
[synchornized란? ]
Java에서 지원하는 synchronized 키워드는 여러 쓰레드가 하나의 자원을 이용하고자 할 때, 한 스레드가 해당 자원을 사용중인 경우, 데이터에 접근할 수 없도록 막는 키워드입니다. synchronized 키워드를 이용하면 병렬 상황에서 자원의 접근을 안전하게 하지만, 자원을 이용하지 않는 쓰레드는 락에 의한 병목현상이 발생하게 됩니다.
메소드 synchronized: 한 시점에 하나의 쓰레드만이 해당 메소드를 실행할 수 있다.
변수 synchronized: 한시점에 하나의 쓰레드만이 해당 변수를 참조할 수 있다.
[Java8 ]
Java8에서는 함수형 프로그래밍을 위한 stream API와 Lambda, 함수형 인터페이스 등과 Null-safe한 작업을 위한 Optional API, Date와 Time API 등이 추가되었습니다.
[Stream API의 장점과 단점 ]
장점
코드를 간결하게 작성하여 가독성을 높일 수 있다.
병렬스트림과 같은 기술을 이용하면 처리 속도를 많이 높일 수 있다.
단점
잘못 사용하면 기존의 Java 방식보다 오히려 성능이 떨어질 수 있다.
코드들이 추상화되어 있어 실수가 발생할 수 있다.
[람다(Lambda)와 람다(Lambda)의 사용법 ]
람다는 불필요한 코드를 줄이고, 가독성을 높이기 위한 익명 함수로써, 함수의 이름과 반환타입 없이 손쉽게 함수를 선언할 수 있습니다. 람다는 아래와 같이 괄호와 화살표로 표현할 수 있으며, 람다의 반환값은 함수형 인터페이스이므로, 이를 이용해주어야 합니다.
@FunctionalInterface
interface MyFunctionalInterface {
String test();
}
public class Lambda {
public static void main(String[] args) throws Throwable {
String str = "This is My String";
// Labmda Expression
MyFunctionalInterface fi = () -> str.replaceAll("\\s+", "");
System.out.println(fi.test());
}
}
C++와 JAVA을 비교하는 것은 대학에서 프로그래밍 언어를 배울 때, 얼핏배우고 지나갔던 내용이었다. 비슷한 성격(객체지향)을 띄는 언어이지만, 차이점도 극명한 언어이기도하다.
나름의 기준으로 3가지 기준으로 차이점들을 정리해봤다.아, 그리고 여기에 작성되는 것들이 JAVA와 C++ 차이점의 전부는 아니라는 점 꼭 알아뒀으면 좋겠다. 그리고 나름대로 중요한 것만 뽑았지만...아닐 수도 있다..
1. 상속
대학 수업에서 교수가 학생에게 C++과 JAVA의 차이점을 묻는다면, 높은 확률로 학생은 상속에 관련된 차이점을 대답할 것이다. 그정도로 상속에 있어 두 언어의 차이점은 극명한데, JAVA가 C++보다 단순한 상속 체계를 지원한다.
첫째로,C++은다중 상속을 지원하고 JAVA는 그렇지 않다.여기서 '다중 상속'이라 함은, 하나의 클래스가 두개 이상의 클래스를 상속하는 것을 지칭한다. 다중상속을 지원하는 언어에서는다이아몬드 문제(Diamond Problem)이 발생하는데, C++에서는 다이아몬드 문제를 회피할 수 있는 기능을 제공한다. 물론 JAVA에서는 애초에 발생할 일이 없다.
둘째로,C++는friend 키워드를 지원하고 JAVA는 그렇지 않다.특정 class에 friend 키워드를 붙여서 클래스 혹은 함수를 선언해 놓으면, 명명된 클래스와 함수는 그 class의 private, protected area에 접근할 수있다. 하지만 이 방법은객체의 은닉성을 파괴하므로 정말 특수한 경우가 아니면사용을 지양한다.
셋째로,JAVA는Interface를 지원하고 C++는 그렇지 않다.다중상속이 지원되지 않는 JAVA는 Interface를 통해 다중상속을 어느정도 흉내낼 수 있다. JAVA에서는 하나의 Class가 여러개의 Interface를 Implement할 수 있다. Interface는 상수와 추상메소드로만 구성되어 있으므로 여러개의 Interface를 implement하더라도, 다이아몬드 문제를 발생시키지 않는다.
※ 요약
1. C++은 다중 상속을 지원하나, JAVA는 지원하지 않는다.
2. C++는 friend 키워드를 지원하나, JAVA는 지원하지 않는다. friend 키워드는 은닉성 이슈로 사용을 자제한다.
3. JAVA는 다중상속을 지원하지 않는 대신 Interface를 지원한다. C++는 지원하지 않는다.
인덱스란추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.만약 우리가 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지를 찾아 보는것은 오랜 시간이 걸린다. 그렇기 때문에 책의 저자들은책의 맨 앞 또는 맨 뒤에 색인을 추가하는데, 데이터베이스의 index는 책의 색인과 같다.
데이터베이스에서도 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 돕고 있다.
만약 Index를 적용하지 않은 컬럼을 조회한다면, 전체를 탐색하는 Full Scan이 수행된다. Full Scan은 전체를 비교하여 탐색하기 때문에 처리 속도가 떨어진다.
[인덱스의 자료구조 ]
해시 테이블
컬럼의 값으로 생성된 해시를 기반으로 인덱스를 구현한다.
시간복잡도가 O(1)이라 검색이 매우 빠르다.
부등호(<, >)와 같은 연속적인 데이터를 위한 순차 검색이 불가능하다.
B+Tree
자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이다.
BTree의 리프노드들을 LinkedList로 연결하여 순차 검색을 용이하게 하였다.
해시 테이블보다 나쁜O(log2nlog2n)의 시간복잡도를 갖지만 해시테이블보다 흔하게 사용된다.
[클러스터링 vs 리플리케이션 ]
리플리케이션
여러 개의 DB를 권한에 따라 수직적인 구조(Master-Slave)로 구축하는 방식이다.
비동기 방식으로 노드들 간의 데이터를 동기화한다.
장점: 비동기 방식으로 데이터가 동기화되어 지연 시간이 거의 없다.
단점: 노드들 간의 데이터가 동기화되지 않아 일관성있는 데이터를 얻지 못할 수 있다.
클러스터링
여러 개의 DB를 수평적인 구조로 구축하여 Fail Over한 시스템을 구축하는 방식이다.
동기 방식으로 노드들 간의 데이터를 동기화한다.
장점: 1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 장애없이 운영할 수 있다.
단점: 여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replciation에 비해 쓰기 성능이 떨어진다.
[DB 정규화 ]
제1정규형: 모든 속성 값이 원자 값을 갖도록 분해한다.
제2정규형: 제1정규형을 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 분해한다. (여기서 완전 함수 종속이란 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미한다.)
제3정규형: 제2정규형을 만족하고, 기본키가 아닌 속성이 기본키에 직접 종속(비이행적 종속)하도록 분해한다. (여기서 이행적 종속이란 A->B->C가 성립하는 것으로, 이를 A,B와 B,C로 분해하는 것이 제3정규형이다.)
BCNF 정규형: 제3정규형을 만족하고, 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키가 되도록 분해한다.
[트랜잭션(Transaction)이란? ]
하나 이상의 쿼리를 처리할 때 동일한 Connection 객체를 공유하여 에러가 발생한 경우 모든 과정을 되돌리기 위한 방법입니다.
[힌트(Hint)란? ]
힌트란 SQL을 튜닝하기 위한 지시구문입니다. 옵티마이저가 최적의 계획으로 SQL문을 처리하지 못하는 경우에 개발자가 직접 최적의 실행 계획을 제공하는 것입니다. 힌트는 아래와 같이 SELECT 다음에 작성할 수 있으며, INDEX, PARALLEL 등 다양한 힌트절이 있습니다.
자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
즉, 자원(Resource)의 표현(representation)에 의한 상태전달
자원표현
자원 : 해당 소트프웨어가 관리하는 모든 것
ex) 문서, 그림, 데이터
자원의 표현 : 그 자우너을 표현하기 위한 이름
ex) DB의 학생 정보가 자원일 때, 'Students'를 자원의 표현으로 정한다.
상태(정보)전달
데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달한다.
JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.
REST는 기본적으로 웹의 기존기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일이다.
REST는 네트워크상에서 Cliedt와 Server사이의 통신 방식 중 하나이다.
REST의 구체적인 개념
HTTP URI를 통해 자우너을 명시하고 HTTP Method(Post, get, Put, Delete)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
즉, REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계 중심에 Resource가 있고 HTTP MEthod를 통해 Resource를 처리하도록 설계된 아키텍처 이다.
CRUD Operation
Create 생성(post)
Read 조회(get)
Update 수정(put)
Delete 삭제(deltete)
Head : header 정보 조회
REST하다는 것
REST(REpresentational State Transfer)란, "웹에 존재하는 모든 자원(이미지, 동영상, DB자원)에 고유한 URI를 부여해 활용" 하는 것으로 자원을 정의하고, 자원에 대한 주소를 지정하는 방법론을 의미합니다. 따라서 RESTful API는 REST특징을 지키면서 API를 제공하는 것을 의미합니다.
REST
어떤 자원에 대해 CRUD(Create, Read, Update, Delete) 연산을 수행하기 위해 URI(Resource)로 요청을 보내는 것, Get, Post 등의 방식(Method)을 사용하여 요청을 보내며, 요청을 위한 자원은 특정한 형태로 표현됩니다.
Resource(자원의 위치 URI)와 이에 대한 Method(행위, POST) 그리고 Resprestation of Resource(자원의 형태, JSON)을 사용하면 표현이 명확지므로 이를 REST라고 한다. 이러한 규칙을 지켜서 설계된 API를 REST API 또는 RESTful API라고 합니다.
아래 설명할6가지조건을 “REST”라고 하며이를 잘 지키는 서비스 디자인을 보고RESTful하다고 한다.
lUniform Interface
lClient-Server
lStateless
lCacheable
lLayered System
lCode on Demand(optional)
HTTP vs HTTPS
HTTP란 인터넷에서 데이터를 주고 받을 수 있는 프로토콜 입니다. (프로토콜 : 규칙) 입니다.
상태코드
1xx (정보): 요청을 받았으며 프로세스를 계속한다
2xx (성공): 요청을 성공적으로 받았으며 인식했고 수용하였다
3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요하다
4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없다
5xx (서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했다
HTTPS
HTTPS는 웹서버와 브라우저간 정보를 암호화된 상태로 주고받는 반면, HTTP는 정보를 평문으로 주고받기 때문에 오가는 정보를 중간에서 탈취당할 위험이 크다. 크롬 브라우저는 이 부분을 경고하고 있다.