## 커리큘럼(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)
```
---
# 객체지향 프로그래밍(OOP : Object Oriented Programming) 기술
+ 컴퓨터 프로그램을 **객체**들의 모임으로 파악하고자 하는 프로그래밍의 패러다임 중 하나
+ 각 객체들은 서로 메시지를 주고 받을 수 있으며 데이터를 처리할 수 있음
+ **강한 응집력**과 **약한 결합력**을 지향
	+ **응집력(cohesion)** : `모듈에 포함된 내부 요소`들이 서로 연관되어 있는 정도
	+ **결합력(coupling)** : `모듈간`의 상호 의존 정도

+ **장점** 
	+ 프로그램을 유연하고 변경이 용이하게 만듬
	+ 프로그램의 개발과 보수를 간편하게 만듬
	+ 직관적인 코드 분석을 가능하게 함


+ **OOP의 기본 구성 요소**
	+ **클래스(Class)**
		+ : `같은 종류의 집단에 속하는 속성과 행위`를 정의한 것으로 다른 클래스와 독립적으로 디자인해야 함
	+ **객체(Object)**
		+ : `클래스의 인스턴스`로 상위클래스의 속성을 가지고 있으면서 개별적인 특성과 행위 또한 가지고 있음
	+ **메서드(Method)**
		+ : `클래스로부터 생성된 객체를 사용하는 방법`으로 객체의 속성을 조작하는데 사용

+ **OOP의 5원칙(SOLID)**
	+ **S**(`SRP,단일 책임 원칙` : Single Responsibilty Principle)
		+ : 한 클래스는 하나의 책임만 가져야 함
	+ **O**(`OCP,개방-폐쇄 원칙` : Open/Closed Principle)
		+ : 소프트웨어의 구성 요소는 확장에는 열려있으나, 변경에는 닫혀 있어야 함
		+ 이 원칙을 통해 기존 코드의 변경없이 시스템 기능의 확장 가능능
	+ **L**(`LSP,리스코프 치환 원칙` : Liskov's Substitution Principle)
		+ : 프로그램의 객체는 프로그램의 정확성을 꺠뜨리지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 함
	+ **I**(`ISP,인터페이스 분리 원칙` : Interface Segregation Principle)
		+ : 자신이 사용하지 않는 메서드에 의존하면 안됨됨
	+ **D**(`DIP,의존성 역전 원칙` : Dependency Inversion Principle)
		+ 고수준 모듈은 저수준 모듈에 의존해서는 안되며, 둘 다 추상화에 의존해야 함

+ **OOP의 특성**
	1. **캡슐화(Encapsulation)**
		+ 관련된 기능과 관련된 데이터를 하나의 클래스로 묶어서 사용하는 법
		+ 정보 은닉
		+ **public** : 클래스 내부/외부에서 접근 가능
		+ **protected** : 해당 객체를 상속받은 객체 내부에서 접근할 수 있으나 단순 인스턴스에서는 접근 할 수 없음
		+ **default** : 동일한 패키지 내의 객체에서 인스턴스를 생성하여 접근
		+ **private** : 클래스 내부에서는 접근이 가능하나 외부에서 접근할 수 없음

	2. **상속(Inheritance)**
		+ 재사용(extends), 부모 클래스에서 선언한 변수나 메서드를 자식 클래스에서 직접 만들지 않고 상속받음으로서 자식 클래스가 부모 클래스의 변수나 메서드를 사용할 수 있음
		+ 부모클래스의 생성자, 초기화 블록은 상속 되지 않음
		+ 부모 private 멤버는 상속은 되지만 직접 접근 불가
		+ 자바는 단일 상속만 지원
		+ Is a(상속관계) : 자식 클래스는 부모 클래스
		+ Has a(연관관계) : 한 클래스 멤버변수로 다른 클래스 타입의 참조변수 선언

	3. **추상화(Abstraction)**
		+ 객체에서 공통된 속성과 행위 추출
		+ 유연성 확보를 위해 구체적인 것은 제거
		+ 프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정

	4. **다형성(Polymorphism)**
		1) **오버라이딩(Overriding)**
			+ 관련된 기능과 관련된 데이터를 하나의 클래스로 묶어서 사용
			+ `메서드 헤드라인 위에 반드시 Annotation, @Override 표시`
			+ 부모 클래스와 자식 클래스의 메서드를 비교하여 메서드 이름이 동일하거나 매개변수의 개수, 타입, 순서가 동일하다면 메서드를 재정의
		2) **오버로딩(Overloading)**
			+ 한 클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것
			+ 같은 메서드 이름, 다른 매개변수 선언 조건이어야 사용가능


## 상속(Inheritance)
- OOP(Object Oriented Programming)에서 상속은 기존의 클래스를 확장해 새로운 클래스를 이끌어내는 것
- 기존의 **코드를 재사용**함으로써 불필요한 코드의 재작성을 방지하고 시간과 노력을 줄일 수 있음.
- `단일상속만을 지원`

- **상속을 사용하는 키워드**는 `extends`
- `자식클래스` : 다른 클래스로부터 상속을 받아 새롭게 만들어진 클래스
- `부모클래스` : 자식클래스에게 멤버변수와 메서드를 물려준 상위 클래스 
- 상속을 하면 부모클래스의 멤버변수와 메서드가 자식클래스에 상속되나 `부모클래스의 생성자는 상속이 되지 않음`
- Object클래스는 자바의 최상위 클래스


```
public class Person{

	String name;
	int age;

	String info(){
		return "이름: "+ name + ", 나이: " + age;
	}
}

// #상속1
public class Employee extends Person{

	String department;
}

// #상속2
public class Student extends Person{

	String studentId;
}

// #상속3
public class Teacher extends Person{

	String subject;
}
```

## 오버라이딩(Overriding) - 메서드 재정의
+ `부모클래스로부터 상속받은 메서드`를 자식클래스에서 행위를 바꾸거나 보완하기 위해 `다시 정의해서 사용`하는 것
+ 부모클래스에서 특별한 용도로 사용하던 메서드를 자식클래스에서 다른 용도로 사용할 때 필요

	+ 오버라이딩 규칙
		- 반드시 상속을 전제
		- 반드시 반환 유형이 동일
		- 메서드 이름이 동일
		- 매개 변수 선언이 정확히 일치
		- 접근제한자는 같거나 더 제한이 없어야 함


```
public class Person {
	// 공통클래스(부모 클래스) 
	String name;
	int age;
	
	String info() {
		return "이름:" +name+", 나이:"+age;
	}
}

public class Student extends Person{
	String studentId;
	
	@Override // 어노테이션 - 특정기능 표현
	String info() {
		return "이름:"+name+", 나이:"+age+", 학번:"+studentId;
	}

}

public class Teacher extends Person{
	String subject;

	
	@Override
	String info() {
		return "이름:"+name+", 나이:"+age+", 과목:"+subject;
	}
}

public class Employee extends Person{

	String department;
	
	@Override
	String info() {
		return "이름:"+name+", 나이:"+age+", 부서:"+department;
	}
}

```

## 오버로딩(Overloading) - 메서드 중복
+ 자바는 메서드나 생성자의 중복 선언 허용
+ 중복은 메서드 또는 생성자를 선언할 때 이름은 같지만 매개 변수의 유형이나 개수를 다르게 선언해 놓는 것
+ 중복을 사용하면 하나의 메서드로 매개 변수의 유형에 따라 다른 동작이 실행

	+ 오버로딩 조건
		+ 이름이 동일
		+ 접근제한자나 반환유형은 영향을 미치지 않음
		+ 매개 변수의 유형이 달라야 함
		+ 매개 변수의 개수가 달라야 함
		+ 매개 변수의 순서가 달라야 함