## 커리큘럼(12-30/변경)
```
01. Java (v)
02. git 
03. Database
04. Jsp [Server]

05. 미니프로젝트 (3W)
06. HTML,CSS  
07. JS

08. SpringFramework , SrpingBoot
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)
```
---

### 객체(Object) & 클래스(Class)
+ **클래스** : 객체를 만들기 위한 틀 <Java>
+ **인스턴스** : 어떤것의 복제품이라는 추상적인 개념
+ **객체** : 클래스의 인스턴스
<img src="https://corejava25hours.com/wp-content/uploads/2016/10/classes_and_objects.jpg">

```
// <Calculator.java>

// Calculator > 클래스(Class)
// 객체를 생성하기 위한 클래스는 main메서드를 만들지 않음.
public class Calculator {
	int result = 0;

	int add(int n) {
		result += n;
		return result;
	}
}


// <ObjectEx01.java>

public class ObjectEx01 {
	public static void main(String args[]) {		
		// cal > Obejct(객체)	
		Calculator cal = new Calculator();
		System.out.println(cal.add(10));
		System.out.println(cal.add(20));
		System.out.println(cal.add(30));
	}
}
```

#### 객체 생성 명령
```
className instanceName = new Constuctor();

// <example>
Calculator cal = new Calculator();
```

#### 클래스내의 변수
- **멤버변수** : 클래스의 속성을 나타낼때 사용
- **메서드** : 클래스의 기능


```
public class Pen {
	// 멤버변수 - ink, price, company	
	String ink;
	int price;
	String company;
	
	// 메서드 - write(), info()
	void write() {
		System.out.println(ink+"색상 글씨입니다.");
	}
	
	String info() {
		System.out.println("---펜의 사용 정보---");
		System.out.println("색상 :"+ink);
		System.out.println("가격 :"+price);
		System.out.println("제조사:"+company);
		
		return "색상: "+ ink+", 제조사 :"+company;
	}
	
}
```

#### 변수 종류
- **멤버변수**(Member Variable) == 전역변수
	- `클래스 안에서 선언` 된 변수
	- **객체를 생성**할 때 각 데이터 타입의 **기본값으로 자동 초기화**
	- 기본값 : 정수형(0), 실수형(0.0), 논리형(false), 객체(null)

- **지역변수**(Local Variable)
	- `메서드 안에서 선언`된 변수
	- **사용하기 전에 반드시 초기화**


```
public class Variable{

	int a ; // 멤버 변수

	public void printNum(int c){
		int b =1; // 지역변수 (* 반드시 초기화)
		System.out.println("멤버변수 : "+a);
	}
}
```

#### 생성자(Constructor)
+ 생성자는 `객체가 생성될 때 객체의 상태(멤버변수)를 초기화` 하는데 사용
+ 객체가 생성될 때 new 키워드 다음에 오는 것
+ 생성자는 메서드와 모양이 비슷하게 생겼지만, `반환 타입을 적지 않고 클래스 이름과 대/소문자까지 동일`하게 생성해야 함
+ 생성자는 반드시 클래스 안에 하나 이상 선언, 만일 생성자를 만들지 않을 경우 JVM이 기본 생성자 자동 생성 (직접 선언하면 자동생성 되지 않음음)
+ 기본 생성자는 매개 변수를 가지지 않는 기본 형태의 생성자

+ **생성자를 만드는 규칙**
	1. `생성자의 이름`은 `클래스 이름과 대/소문자 까지 정확히 동일`해야 하고, 만일 클래스 이름과 다른 이름으로 만들면 메서드로 간주.
	2. 생성자는 메서드와는 달리 `반환 유형을 적지 않음`
	3. 생성자는 `다른 유형으로 여러개 생성 가능` <생성자 오버로딩>


```
// <pen.java>
public class Pen{
	public String color;
	int price;

	// 생성자1(매개변수를 받지 않음) - color멤버변수 값 black으로 초기화
	public Pen(){
		color="black";
	}

	// 생성자2(매개변수를 받음) - color값을 입력받은 매개변수로 초기화
	public Pen(String init_color){
		color=init_color;
		System.out.println("생성자를 이용해 color값 초기화");
	}

	public void write(){
		System.out.println("색상 출력 :"+color);
	}
}


// <Example.java>
public class Example{
	public static void main(String args[]){
		
		// 매개변수를 받는 생성자2를 호출해 멤버변수를 매개변수로 초기화
		Pen red = new Pen("red"); 
		
		System.out.println("펜의 색은 "+red.color+"입니다."); // <출력 결과> : 펜의 색은 red입니다.
	}
}
```

### 가비지 컬렉션(Garbage Collection)
+ 자바의 메모리 관리 방법 중 하나
+ JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스


### 패키지(Package)
+ 서로 관계가 있는 클래스들 묶어놓음
+ 현재 클래스에서 다른 패키지의 외부 클래스를 사용할경우 `import` 키워드 사용

### 데이터타입
+ **기본타입**(Primitive type)
	+ `정수, 실수, 문자, 논리 값`을 저장하는 데이터타입
	+ `실제값`을 변수 안에 저장

+ **참조타입**(Reference type)
	+ `객체의 주소를 참조`하는 타입
	+ `메모리의 주소값`을 변수안에 저장
	+ `스택 영역에 주소값`을 저장하고 내부의 `실제 값은 힙 영역`에 저장
		+ **스택 영역**
			+ `primitive 타입의 데이터`(int, double, byte, long, boolean 등) 에 해당되는 지역변수, 매개 변수 `데이터 값`이 저장 
			+ 메소드가 호출 될 때 메모리에 할당되고 종료되면 메모리에서 사라짐

		+ **힙 영역**
			+ 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
			+ 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재
			+ Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.그러다 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 청소된다.

		* 참고(https://vvd.bz/cxB)

	+ 참조타입 **String**
		+ String의 객체 동등 비교 메서드 **equals()**
		+ 문자열이 동일하다면 String객체를 공유
		+ new 키워드를 사용해 생성한다면 `내용이 같더라도 다른 주소값`을 가지게 되므로 동등, 비동등 연산자의 결과가 false로 나오기 때문에 `equals()메서드를 사용`.

