











일종의 상수로 자동으로 넘버 주겠다.

클래스명.상수명







💡 lombok이라는 라이브러리 쓸것이다. 직접 쓸 일 없다.
단, 이해는 해야한다.


## 1교시 **문자열 정리**
length() / replace() / indexOf() / split() / substring()
### 스트링 메서드 목록
https://www.w3schools.com/java/java_ref_string.asp
### 배열 복사 방법 3가지
1. System.arraycopy()
2. Arrays.copyOf()
3. Object.clone() [얕은 복사]
Advanced for문 == for each loop
### enum 타입
### static method / instance method
--------------------------
## 2교시 **중첩클래스**
## 중첩 인스턴스 클래스
- 클래스의 멤버 변수 선언부에 위치하고 static 키워드가 없는 내부 클래스
- 외부 클래스의 멤버로 취급되기 때문에 외부 클래스의 객체 먼저 생성한 후 내부 클래스의 객체를 생성이 가능하다
### 중첩 정적 클래스
- static 키워드가 붙은 내부 클래스
- 외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 static 멤버처럼 다뤄진다.
- 단, 일반적인 static 필드 변수나 static 메서드와 똑같이 생각하면 안된다.
- static 클래스 내부에는 instance 멤버와 static 멤버 모두 선언 할 수 있다.
- 그러나 일반적인 static 메서드와 동일하게 외부 클래스의 인스턴스 멤버에는 접근이 불가하고, 정적(static) 멤버에만 접근할 수 있다.
- 외부 클래스 객체가 없어도 정적 중첩 클래스 객체가 있을 수 있습니다. 즉, 정적 중첩 클래스 개체는 외부 클래스 개체와 연결되지 않습니다.
- main() 메서드를 선언할 수 있으므로 명령 프롬프트에서 정적 중첩 클래스를 직접 호출할 수 있습니다.
가장 많은 사람들이 실수하는 오해가 static 클래스가 그 외의 static 필드 변수나 static 메소드와 같이,
'static 이니까 메모리에 하나만 올라가는 인스턴스'로 착각 한다는 점이다.
우선 결론부터 말하면 static 클래스는, 키워드가 static이 들어갔을 뿐이지,
우리가 알던 static 멤버와는 전혀 다른 녀석이다.
### 중첩 로컬 클래스 / 중첩 지역 클래스 (local class)
- 외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 메서드 블록 영역 내부에서만 사용될 수 있다.
- **메소드 내부**에 위치하는 클래스 (지역 변수와 같은 성질을 지님)
- 지역 변수처럼 해당 메서드 내부에서만 한정적으로 사용된다. (해당 메소드 실행 외에는 클래스 접근 및 사용 불가)
- 접근제한자와 static을 붙일 수 없다.
- 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없고, 원래 메소드 내에는 static 멤버를 선언할 수 없기 때문이다.
- 메서드내의 로컬 클래스에서 지역 변수에 접근해서 값을 사용하려고 할때 반드시 final 상수화 된 지역 변수만 사용이 가능하다.
- 변수에 final을 안붙여도 실행이 되는 이유는, JDK1.8부터 지역 클래스에서 접근하는 지역 변수 앞에 final 을 생략할 수 있기 때문이다. (컴파일러가 자동으로 붙여줌)
- 그러나 지역 변수(상수)의 값이 바뀌는 문장이 있으면 이는 상수가 아닌 변수이니, 컴파일 에러가 발생한다.
### 익명 클래스 >> 익명클래스 파생 : 람다(lambda) 클래스 (거의 무조건 중첩이라 중첩 용어는 생략가능)
- 익명 클래스는 클래스 이름이 존재하지 않는 이너 클래스다. (자바스크립트의 익명 함수로 생각해도 된다)
- 단 하나의 객체만을 생성하는 일회용 클래스 (클래스의 선언과 동시에 객체를 생성)
- 익명 클래스는 생성자가 존재하지 않는다.
- 익명 클래스는 기존에 존재하는 클래스를 메서드 내에서 일회용으로 클래스 내부 구성을 선언하여 필요한 메서드를 재정의 하여 사용하는 기법이다.
- 익명 클래스는 전혀 새로운 클래스를 익명으로 사용하는 것이 아니라, 이미 정의되어 있는 클래스의 멤버들을 재정의 하여 사용할 필요가 있을때 그리고 그것이 일회성으로 이용될때 사용하는 기법이다.즉, 익명 클래스는 부모 클래스의 자원을 일회성으로 재정의하여 사용하기 위한 용도 인 것이다.
- 익명 클래스도 내부 클래스의 일종이기 때문에, 외부의 지역 변수를 이용하려고 할때 똑같이 내부 클래스의 제약을 받게 된다.
- 내부 클래스에서 가져올 수 있는 외부 변수는 final 상수인 것만 가져와 사용할 수 있다.
- 오버라이딩 한 메소드 사용만 가능하고, 새로 정의한 메소드는 외부에서 사용이 불가능 하다.
- 새로 정의한 메소드는 외부 스코프에서 호출할 수 없고, 익명 클래스 내에서만 호출이 가능하다.
### 익명 클래스 사용법
1. 클래스 필드로 이용 : 특정 클래스 내부에서 여러 메소드에서 이용될때 고려해볼 만 하다.
2. 지역 변수로서 이용 : 메소드에서 일회용으로 사용하고 버려질 클래스라면 적당하다
3. 메소드 아규먼트로 이용: 만일 메소드 매개변수로서 클래스 자료형이 이용된다고 할때 일회성으로만 사용한다면 아규먼트로 익명 객체를 넘겨주면 된다.
**자바의 익명 클래스 기법의 진가는 인터페이스를 익명 객체로 선언하여 사용할 때 이다.**
익명 클래스는 일회성 오버라이딩 용도 이기 때문이다. >> 콜백함수와 유사한 동작 로직
- 익명 구현 객체의 한계점은 오로지 하나의 인터페이스만 구현하여 객체를 생성할 수 있다는 점이다.
인터페이스의 가장 큰 본질은 다중 상속(구현)이 가능하다는 것인데,
둘 이상의 인터페이스를 갖거나, 하나의 클래스를 상속 받고 동시에 인터페이스를 구현하는 형태로는 익명 구현 객체로 불가능하다.
- 따라서 어쩔수 없이 일회용 용도일지라도 다중 구현한 클래스는 따로 정의하여 사용해야 한다. (중첩 클래스 사용 가능)
- 인터페이스로만 만들 수 있다.
- 하나의 추상 메소드만 선언되어 있는 인터페이스만 가능하다. (단, default 메소드는 제외)
## 중첩 인터페이스
클래스 내부에서 선언한 인터페이스
## 3교시 : 빌더와 익명 객체
빌더패턴: 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식이다.
너무 많이 써서 롬복(LomBok)으로 그냥 다 자동화 시켜버림
### 익명객체 : 특정 클래스, 인터페이스로 만들어진 일회용 구현체
#### 상속으로 익명 객체를 구현하면 익명자식객체, 구현으로 익명 객체를 구현하면 익명구현객체 라고 합니다.
## 4교시 : 커맨드 패턴, cli 리팩토링
V3 : singletone, command 패턴적용
V4 : 캡슐화 적용
---------------------------
## new()를 사용하여 문자열을 생성하는 것과 리터럴로 생성하는 것은 어떻게 다릅니까?
> new()를 사용하는 문자열은 문자열을 선언하면 `스택 메모리` 내부에 요소를 저장하는 반면,
new()를 사용하여 선언하면 힙 메모리에 동적 메모리를 할당한다는 점에서 리터럴과 다릅니다.
동일한 콘텐츠 객체가 존재하더라도 객체는 `힙 메모리`에 생성됩니다.
--------------------------
## this 와 Class.this 의 차이
> this는 현재 인스턴스를 참조하는 키워드입니다
인스턴스 변수와 매개변수 사이에 모호성이 있는 경우 이 키워드는 모호성 문제를 해결합니다.
> Class.this 는 중첩 클래스 또는 익명 메서드 내부의 외부 클래스 개체를 참조하는 참조 변수입니다.
내부(또는 익명) 클래스와 외부 클래스 사이에 모호성이 있는 경우 Class.this는 모호성 문제를 해결합니다.
---------------------------
## 인스턴스 변수와 클래스 변수의 차이
> 변수는 메모리 위치에 부여된 이름입니다
- 변수에 저장된 값은 프로그램 실행 중에 변경될 수 있습니다.
- 변수는 메모리 위치에 부여된 이름일 뿐입니다.
### 클래스 변수 : 클래스 내에서 선언되지만 메서드, 생성자 또는 블록 외부에서 선언되며 항상 기본값을 가져옵니다.
- 인스턴스 변수 / 정적 변수 / 로컬 변수 등이 클래스 변수로 사용될 수 있습니다
### 인스턴스 변수 : 기본적으로 static 수식자가 없는 클래스 변수입니다
- 여러 인스턴스에서 이러한 변수는 서로 다른 값을 가질 수 있습니다.
- 인스턴스 변수의 내용은 한 객체 인스턴스와 다른 객체 인스턴스와 완전히 독립적입니다.
- 이러한 변수는 일반적으로 객체를 생성할 때 생성되고 객체가 소멸되면 소멸됩니다.
Class A
{
int count; // Count는 클래스 변수이자 인스턴스 변수입니다.
}
### 지역 변수 : 이 변수는 메서드 내에서 선언되지만 기본값을 가져오지 않습니다.
- 일반적으로 메서드나 생성자를 입력할 때 생성되고 블록을 종료한 후 또는 메서드에서 return될 때 소멸됩니다.
- 그 범위는 일반적으로 메서드로 제한되며 해당 범위는 선언된 줄부터 시작됩니다. 해당 범위는 일반적으로 메서드의 닫는 중괄호가 올 때까지 해당 위치에 유지됩니다.
- 지역 변수의 초기화는 필수입니다.
### 정적 변수 : 기본적으로 클래스 수준 어디에서나 static으로 선언할 수 있는 변수 입니다. (정적 변수를 클래스 변수로 호칭하는 경우도 있습니다)
여러 개체에서 이러한 변수는 하나의 값만 가질 수 있습니다.
이러한 변수는 클래스의 특정 인스턴스에 연결되어 있지 않으므로
클래스의 모든 개체에서 공유할 수 있습니다.
#### 접근 가능 목록
인스턴스 멤버 클래스 : outer 클래스의 모든 field, method
정적 멤버 클래스 : outer 클래스의 static field, static method
#### 이름이 중첩되면?
inner클래스가 사용되는게 기본값임
> outer클래스의 멤버를 쓰고 싶으면? outer클래스.this 로 접근해야함
-------------------------
### 내부 익명 객체 자동완성 어떻게 하나요?
> 상속으로 익명 객체를 구현하면 익명자식객체, 구현으로 익명 객체를 구현하면 익명구현객체 라고 합니다.
public class OuterClass() {
InnerClass A = new InnerClass() { **여기에** 커서 두고 `ov` 탭 하면 됩니다 }
}
-----------------------
### 람다?
수학에 나오는 축약법인데 프로그래밍에서 그대로 활용함
ex : f(x, y) = x + y
ex-lambda : (x, y) -> x + y
```java
Operate operate = new Operate() {
public int operate(int a, int b) {
return a + b;
}
};
// 람다식으로 줄이기
Operate operate = (a, b) -> {
return a + b;
};
// 더 짧게 줄이기 (리턴 코드만 있다면 생략이 가능)
Operate operate = (a, b) -> a + b;
이러한 람다식 표현의 익명 구현 객체는 언제 어디서나 만들 수 있는 것은 아니고 2가지 정도 제약이 있다.
- 인터페이스로만 만들 수 있다.
- 하나의 추상 메소드만 선언되어 있는 인터페이스만 가능하다. (단, default 메소드는 제외)
----------------
접근제한자
