## 커리큘럼(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)
```
---
# 클래스 키워드
## this
- **자기 자신 객체를 지정**할 때 사용하는 키워드
- `this.`을 사용하면 **동일 클래스 내의 멤버(멤버변수, 메서드)를 참조**할 수 있음
- `this()`를 사용하면 **생성자 내부에서 자신의 다른 생성자를 호출** 가능

 
```
public class Person{

	String name; 
	int age; 

	public Person(String name, int age){
		this.name = name; // this.로 나의 멤버변수 접근 가능
		this.age = age;
	}
	
	public Person(String name){
		this(name,1); // this()로 나의 생성자의 접근 가능
	}

	public Person(){
		this("이름없음",1);
	}

	public String getDetails(){
		return "이름: "+name+"\t나이: "+age;
	}

}
```

## super
- **한단계 위 부모클래스의 객체를 지정**할 떄 사용
- `super.` 을 사용하면 **부모클래스의 멤버를 참조**할 수 있음
- `super()`는 **생성자 내부에서만 사용이 가능하며, 부모클래스의 생성자를 호출**하는데 사용
- 생성자의 첫 라인에는 반드시 this(), super()가 있어야 하는데 이를 기술하지 않으면 묵시적으로 super()가 삽입되어 부모클래스의 기본 생성자를 자동으로 호출
- 생성자 내부에서 또 다른 생성자를 호출할 떄는(this(),super()) 반드시 생성자 블록 내부의 첫 라인에 기술


```
public class Airplane{

	void takeOff(){
		System.out.println("비행기가 이륙합니다.");
	}

	void fly(){
		System.out.println("일반 모드로 비행합니다.");
	}

	void land(){
		System.out.println("비행기가 착륙합니다.");
	}
}

public class SuperSonicAp extends Airplane{

	int flyMode = 1;

	void fly(){ // 자식 객체의 생성자
		if(flyMode==1){
			System.out.println("초음속 모드로 비행합니다.");
		}
		else[
			super.fly();  // 부모 객체의 생성자 호출
		]
	}
}
```
---
# 접근제한자(Access Modifier)
+ 클래스와 멤버변수, 메서드, 생성자의 접근을 제어할 수 있는 제한자
+ 라이브러리 클래스를 설계할 때는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 변수, 생성자,메서드를 설계하는것이 바람직
+ 클래스에는 접근 제한자를 **public**과 **default**만 붙일 수 있음.

## 종류
+ **public** : 같은 클래스, 같은 패키지, 다른 패키지를 막론하고 접근 가능
+ **protected** : 같은 클래스, 같은 패키지는 접근이 가능, 다른 패키지에 속해있는 클래스인 경우 상속관계가 없으면 접근 불가능
+ **default** : 같은 클래스, 같은 패키지에서만 접근 가능
+ **private** : 같은 클래스 내부가 아니면 접근 불가능

---
# OOP기술 - 은닉
## 정보은닉 - 캡슐화(Encapsulation)
+ 은닉은 사용자에게 상세한 내부 구현을 숨기고 필요한 부분만 보이게 하는 것
+ 은닉을 사용하기 위해서는 클래스의 멤버변수의 접근제한자를 **private**로 설정
+ 은닉된 멤버변수에 접근하기 위해서는 public 메서드를 통해서 접근할 수 있는데, `변수의 값을 변경시키는데 사용되는 메서드`는 **setter메서드***라고 부르며, `변수의 값을 얻어오는데 사용하는 메서드`를 **getter메서드**라고 부름
+ 공개 메서드를 이용해 데이터를 변경시킬 경우 메서드 내에 데이터 유효성을 검증할 수 있는 루틴을 넣을 수 있음.
+ 경우에 따라 권한을 체크할 수 있는 로직을 포함시키면 인가되지 않은 사용자에게 데이터나 로직을 숨길 수 있음
+ 멤버변수 뿐만 아닌 메서드들도 private으로 선언 가능

### getter
1. 은닉 변수에 값을 저장하기 위한 메서드
2. 접근 제어자를 public으로 선언하고 이름 (set+멤버변수명)으로 설정정

### setter
1. 은닉 변수에 값을 조회하기 위한 메서드
2. 접근제어자 public으로 선언하고 이름 (get+멤버변수명) 으로 설정


```
public class MyDate{
	private int year;
	private int month
	private int day;

	public void setYear(int year){
		this.year=year;
	}

	public int getYear(){
		return year;
	}

	public void setMonth(int month){
		this.month=month;
	}
	public int getMonth(){
		return month;
	}

	public void setDay(int day){
		this.day=day;
	}
	public int getDay(){
		return day;
	}

}
```