+ |
+ 타입
+ |
+
+ 예시
+ |
+
+ 기본값
+ |
+
+ 할당되는 메모리의 크기
+ |
+
+ |
+ 배열(Array)
+ |
+
+ int[] arr = new int[5];
+ |
+
+ Null
+ |
+
+ 4 byte
+ |
+
+
+ |
+ 열거(Enumeration)
+ |
+
+ RED, ORANGE, YELLOW, GREEN
+ |
+
+ Null
+ |
+
+ 4 byte
+ |
+
+
+ |
+ 클래스(Class)
+ |
+
+ String str = "test";
+ Student sujin = new Student();
+ |
+
+ Null
+ |
+
+ 4 byte
+ |
+
+
+ |
+ 인터페이스(Interface)
+ |
+
+ public interface Bank {
+
+ |
+
+ Null
+ |
+
+ 4 byte
+ |
+
+
+
+
+
+
+---
+### 프리미티브 타입과 래퍼런스 타입
+
+
+** 자바의 기본형 타입 (프리미티브 타입) **
+* 자바에서는 총 8개의 타입 (위의 표 참조) 을 미리 정의하여 제공 한다.
+* 실제 값을 저장 하는 공간으로 스택 (Stack) 메모리에 저장된다.
+* 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 컴파일 에러가 발생한다. ( 실제 백준을 풀때 이때문에 에러가 나는 경우가 많았다... )
+
+** 참조형 타입 (Reference Type) **
+* 기본 타입(프로미티브 타입)을 제외한 타입들이 모두 참조형 타입이다.
+* 빈 객체를 의미하는 Null이 존재한다.
+* 값이 저장되어있는 곳의 주소값을 저장하는 공간인 힙(Heap)에 메모리가 저장된다.
+* 문법상으로는 에러가 없지만 실행 시켰을때 에러나 나는 런타임 에러 발생한다 NullException이 발생하지 않도록 변수값을 꼭 넣어준다.
+---
+### 리터럴
+
+** 리터럴 이란? **
+* 리터럴은 데이터 그 자체를 의미하며 변수에 넣는 변하지 않는 데이터를 의미한다.
+* ex)
+``` java
+ int a = 1;
+```
+ a =변수, 1 = 리터럴
+
+** 리터럴의 종류 **
+* 리터럴의 종류
+
+ * 정수형 (Interger)
+ * 실수형 (floating point)
+ * 부울형 (boolean)
+ * 문자형 (charactor)
+ * 문자열 (String)
+
+** 리터럴과 데이터 타입의 차이 **
+* 리터럴 = 실제 프로그램 코드에 나와있다.
+* 데이터 타입 = 리터럴에 관한 정보 (리터럴에 들어갈 변수가 얼마나 많은 메모리 공간을 차지하나, 어떤 범위의 값이 들어갈 수 있는가에 대한 정보
+
+** 리터럴을 사용하는 이유 **
+* 리터럴을 사용하는 이유는 데이터 타입의 표현을 명확하게 하기 위해서 이다.
+``` java
+ int i = 10;
+ long j = 10;
+```
+이때 10이 어떤 타입인지 구분 하기 힘들다 이를 구분하기 위해 리터럴을 사용하는것이다.
+[참조](https://m.blog.naver.com/PostView.nhn?blogId=simba222&logNo=193021821&proxyReferer=https:%2F%2Fwww.google.com%2F)
+
+
+---
+### 변수 선언 및 초기화하는 방법
+** 변수란? **
+* 변수는 데이터를 저장하는 메모리 영역을 의미한다.
+
+** 변수의 선언 **
+* 👍 자바에서 변수를 사용하기 전에는 꼭 선언 , 초기화를 해줘야 한다!!
+* 선언 하는 방법
+
+ 1. 변수의 선언만 하는 방법
+ 2. 변수 선언과 동시에 초기화 하는 방법
+* 변수의 선언만 하는 방법
+
+ * 먼저 변수를 선언 하여 메모리를 할당 받은 후 나중에 변수를 초기화 하는 방법으로 이 방법을 한후 변수의 초기화를 해주지 않으면 쓰레기 값이 들어가게 된다.
+ ``` java
+ int num;
+ num = 10;
+ ```
+* 변수의 선언과 동시에 초기화 하는 방법
+
+ * 자바에서는 변수 선언과 동시에 값을 초기화 할 수 있다. (내가 써본 언어 대부분이 가능했던것 같다)
+ ``` java
+ int num1 = 10;
+ ```
+_선언하고자하는 타입과 초기화 하려는 타입이 다를 경우 선언 불가능!_
+
+[참고](http://www.tcpschool.com/java/java_datatype_variable)
+
+---
+### 변수의 스코프와 라이프타임
+
+
+** 변수의 스코프 **
+* 변수의 스코프란 프로그램 상에서 변수를 사용 가능한 범위를 나타낸다.
+``` java
+public class ValableScopeExam{
+
+ int globalScope = 10; // 인스턴스 변수
+
+ public void scopeTest(int value){
+ int localScope = 10;
+ System.out.println(globalScope);
+ System.out.println(localScpe);
+ System.out.println(value);
+ }
+ }
+```
+* 위 코드에서 globalScope 의 사용 범위는 ValableScopeExam의 내부에 있는 전체 에서 사용이 가능 하지만 localScope 는 ValableScopeExam에서는 사용이 불가능 하고 scopeTest안에서만 사용 가능하다.
+
+** static **
+* static은 고정 이란 의미를 가지고 있다. Static이라는 키워드를 사용하면 Static 변수와 Static 메소드를 만들수 있는데 이를 정적 필드와 정적 메소드라고 하며 합쳐서 정적 멤버(클래스 멤버)라고도 한다.
+* 정적 멤버는 객체에 소속된 멤버가 아니라 클래스에 고정 된 멤버이며 클래스 로더가 클래스를 로딩할때 메소드 메모리 영역에 클래스별로 관리가 되어 클래스 로딩이 끝나면 바로 사용이 가능하다.
+
+* 정적 멤버는 Heap이 아닌 Static 영역에 할당 되며 이 static 영역에 할당된 메모리는 모든 객체가 공유를 하며 하나의 멤버를 언제든지 참조가 가능하다.
+
+
+
+
+
+* 위 코드를 보면 dong은 static으로 hyun 은 인스턴스 변수로 선언을 하였다 그후 클래스 객체를 2개 선언 한후 d1 클래스에서만 증가를 해줬는데 d2클래스를 출력했을때 static 으로 선언한 값이 증가 한것을 볼수 있다. 이는 static으로 선언된 변수는 모든 인스턴스가 하나의 저장 공간을 공유 하기 때문이다. (나는 보통 cnt 값을 셀때 쓴다)
+* Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가진다. 하지만 이점이 단점이 될때도 있다. 만약 카운터 같은 모든 영역에서 공유하돼 하나만 선언되어야하는 변수가 아니고 각각의 영역에서 다른 메모리 값을 가지며 사용되는 변수에 static 을 선언하면 그 코드는 오답이 될것이다. 따라서 static을 사용할때는 남발하면 안되고 상황에 맞게 고려해가면서 써야한다.
+
+** 변수의 라이프 타임 **
+* 변수의 메모리가 살아있는 기간이다.
+
+ * 인스턴스 변수 = 객체가 메모리에 남아있을때 까지.
+ * 클래스 변수(static) = 프로그램이 끝날때까지 메모리가 로드되는 동안
+[참고](https://programmers.co.kr/learn/courses/5/lessons/231)
+
+---
+### 타입 변환, 캐스팅 그리고 타입 프로모션
+
+
+** 자바 타입 변환 **
+* 타입 변환의 종류
+
+ * 자동 타입 변환 (묵시적)
+ * 강제 타입 변환 (명시적)
+* 자동 타입 변환
+
+ * 프로그램 실행 도중에 자동으로 타입 변환이 일어난다.
+ * 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 변환이 일어나는데 타입별 크기는
+ 1. byte(1)
+ 2. short(2)
+ 3. int(4)
+ 4. long(8)
+ 5. float(4)
+ 6. double(8)
+ ex)
+ ``` java
+ int intVal = 10;
+ long longVal = intVal; // 자동 타입 변환이 이루어짐
+ // 음수가 저장될수있는 byte,int 는 char 타입으로 자동 변환 불가
+ ```
+* 강제 타입 변환
+
+ * 큰 크기의 타입을 작은 타입으로 변환 할때 자동으로 변환 되지 않아 강제로 타입을 변환해 줘야한다.
+ ex)
+ ``` java
+ int intVal = 12345;
+ char charVal = (char)intVal;
+ ```
+ _이때 값손실이 나지 않게 범위를 체크해야한다_
+
+---
+### 1차 배열 및 2차 배열 선언하기
+
+** 1차 배열 선언하기 **
+``` java
+int[] arr1;
+int arr1[];
+```
+* 위와 아래 둘다 맞는 표현이지만 자바 코드 컨벤션에 의하면 위에 표기식이 맞는 표현이다.
+
+** 1차원 배열 초기화 하기 **
+``` java
+int[] arr1;
+int arr1 = new int[3];
+```
+* 이때 배열을 초기화 하면 기본 값이 0 으로 셋팅이 된다.
+
+** 1차원 배열을 선언과 동시에 초기화 하기 **
+``` java
+int[] arr1 = new int[10];
+```
+* 이때도 배열을 기본 값 0으로 지정된다.
+
+** 1차원 배열에 원하는 값 집어 넣기 **
+``` java
+int [] arr1 = {1, 2, 3, 4};
+```
+* 위의 결과는 배열 사이즈 4의 [1, 2, 3, 4] 가 만들어진다.
+
+** 2차원 배열 선언 **
+* 2차원 배열의 선언
+``` java
+int[][] arr;
+```
+* 2차원 배열의 초기화
+``` java
+int[][] arr;
+arr = new int[1][1];
+```
+* 2차원 배열의 선언과 초기화 동시에 하기
+``` java
+int[][] arr = new int[1][1];
+```
+* 2차원 배열에 원하는 값 저장 하기;
+``` java
+int[][] arr = {{1, 2, 3}, {4, 5, 6}};
+```
+
+---
+### 타입 추론, var
+** 타입 추론(Type Inference)**
+* 타입 추론은 정적 타이핑을 지원 하는 언어에서 타입이 정해져 있지 않은 변수에 대해 컴파일러가 자동으로 변수의 타입을 추론해 낼수 있도록 하는 기능이다.
+* 타입 추론이 가능 하다 -> 코드량이 줄어든다, 코드의 가독성이 높아진다.
+_예젼에 노드 js 를 공부할때 var 을 정말 많이 봤었었는데 이제 자바10이상부터는 자바에서도 var 사용이 가능하다 한다._
+* 자바 8이 등장 하고부터 람다에서 타입 추론을 할 수 있게 되었다.
+``` java
+ BinaryOperator