[24.06.25] JAVA_인터페이스, 중첩 객체2

ANGELA·2025년 1월 8일

[KB]학습내용정리

목록 보기
6/57

01. string

1. 개념/함수

  • 문자열만 리터럴 가능 → new 안써도 됨
  • 리터럴은 상수이다.
  • new 쓰면 각각의 인스턴스로 만들어짐
💡 리터럴 주는거랑 내가 직접 만든거랑 다르다.
  • 모든 클래스는 object로부터 상속 받는다.
  • equals는 모든 자바가 가지는 메서드다.

  • string : 불변객체이다. 한번 배정되면 바꿀 수 없음
    • 바꾸고 싶으면 다른값 참조로 바꿀 수 있다.
    • c++은 바꿀수 있다.
  • 코드는 문자로 관리한다. 숫자가 아니다.

  • 배열이 아니여서 length() 메서드로 길이를 얻는다.
  • replace() 메서드로 새로운 문자열로 대체해서 바꿔야 한다. → 원본 값을 못 바꾸니까
  • 또는 oldStr = 로 아예 새로운 값을 선언한다.
  • subString() 함수
  • indexof() → 찾고자 하는 문자열 시작 인덱스 번호 찾기
  • split() → 구분자로 문자열 분리 → 배열로 분리됨

2. 배열에서 객체 참조하기

  • 중괄호로도 쓸 수 있다. → 이건 선언문에서만 가능
  • tire는 이렇게 해야한다.
    - 각각의 인스턴스가 들어가야하니까 new를 쓴다.

3. 배열

  • 컴파일에서의 배열
  • 한번 선언하면 길이 변경 불가
  • 늘리고 싶으면 복사해야한다.
    - 루프 돌려서, 옛날 배열을 새로운 배열로 값을 옮긴다,
    - 얕은 복사이다. (디폴트는 얕은복사)
  • arraycopy()
    - 얕은 복사이다.
    - 참조를 복사한다.
  • 배열 루프 돌리는 for문 : for ( : )
    - 자바스크립트에서 of, in 과 같음

4. 열거(Enum) 타입

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

  • 클래스명.상수명

02. 중첩선언

1. 표기법

  • 파스칼
  • 반드시 연관되는 클래스. 새로운 클래스

2. 내부 메서드

  • 메서드 끝나면 값 사라진다.
  • 자바에서는 클로저 개념이 없다
    - 상수는 메서드영역에 저장이 된다. → 값 살리는 방법은 상수화 시켜서 살린다.
    - GUI 안드로이드에서 주로 쓰인다. 윈도우 기반 어플 만들때 등장하는 기술
    - 백엔드에서는 안나오는 기술이다. 개념만 알고 있으면 된다.

3. 자바의 콜백

  • 콜백함수 없다.
  • 리스너를 만든다 → 값을 객체에 따라 다르게 받는다.
  • 리스너가 핸들링한다.

03. 익명객체

  • js의 익명 함수

인터페이스 익명 객체 → 익명 구현 객체

  • 인터페이스 : 추상이여서 인스턴스 못 만든다.
  • {} 때문에 인스턴스 생성 가능
  • 매개변수로 넘길때 많이 사용

04. builder 패턴

  • new Memo() → 순서 중요, 값없으면 null로, memo인스턴스에 종속되어있다.
  • static으로 선언되어 있을것이다.
  • 순서가 중요하지 않다.
  • 필요한것만 만들 수 있다.
  • 빌더의 리턴값 this → 자기 자신 리턴
  • 메모 빌더 : 빌더의 .id .title ……
  • 백엔드에서 자주 사용하는 방법
    💡 lombok이라는 라이브러리 쓸것이다. 직접 쓸 일 없다. 단, 이해는 해야한다.

05. CLI 프레임워크

싱글톤패턴

  • 패턴
    • 연속된 숫자 → 배열
  • 자바는 함수가 없어서 객체로 받아야한다.
    - 메서드의 이름은다르지만, 리턴타입 매개변수 똑같죠 → void / 매개변수 없다 → 요 모양 가지는 객체 만들면 된다. → 인터페이스로 만들면 된다.

06. 오후수업

  • 이론정리 게시판
## 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()를 사용하여 선언하면 힙 메모리에 동적 메모리를 할당한다는 점에서 리터럴과 다릅니다.
동일한 콘텐츠 객체가 존재하더라도 객체는 `힙 메모리`에 생성됩니다.
--------------------------
## thisClass.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 메소드는 제외)
----------------
접근제한자
![](https://velog.velcdn.com/images/totomom/post/330ecada-6d45-4471-894d-36e84e923f1d/image.png)
profile
혼자 보려고 만든 기록장 | 또또는 귀여워 🐈‍⬛

0개의 댓글