Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

상준 - 7주차 #40

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# 멤버 클래스는 되도록 static으로 만들라

## 중첩 클래스의 종류

- 정적 멤버 클래스
- 비정적 멤버 클래스
- 익명 클래스
- 지역 클래스

내부 클래스: 비정적 멤버 클래스, 익명 클래스, 지역 클래스

## 정적 멤버 클래스

- 다른 클래스 안에서 선언된다
- 바깥 클래스의 private 멤버에도 접근할 수 있다
- 이외에는 일반 클래스와 똑같다
- 다른 정적 멤버와 똑같은 접근 규칙을 적용받으므로 private로 선언하면 바깥 클래스에서만 접근할 수 있다

-> 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스로 쓰인다

## 비정적 멤버 클래스

- 인스턴스가 바깥 클래스의 인스턴스와 암묵적으로 연결된다
- 비정적 멤버 클래스의 인스턴스 메소드에서 <i>클래스명</i>.this를 사용해 바깥 인스턴스의 메소드를 호출하거나 바깥 인스턴스의 참조를 가져올 수 있다.
- 비정적 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없다
- 멤버 클래스가 인스턴스화 될 때 비정적 멤버 클래스의 인스턴스와 바깥 인스턴스 사이의 관계가 확립된다.

-> 어댑터를 정의할 때 주로 쓰인다 (어떤 클래스의 인스턴스를 감싸 다른 클래스의 인스턴스처럼 보이게 하는 뷰)

- 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙이자. 참조를 저장하는데에 시간과 공간이 소비되며 메모리 누수가 생길 수도 있다.

## 익명 클래스

- 이름이 없는 일회성 클래스로 클래스 선언과 인스턴스 생성을 동시에 할 수 있다
- 주로 메소드, 초기화 블록, 필드에서 사용됩니다.
- 익명 클래스는 바깥 클래스의 변수를 참조할 수 있으며, final이나 effectively final인 변수만 참조 가능하다.

-> 익명 클래스는 주로 이벤트 핸들러나 간단한 콜백을 구현할 때 사용된다

## 지역 클래스

- 가장 드물게 사용된다.
- 지역변수를 선언할 수 있는 곳이면 어디서든 선언 가능하며 유효 범위도 지역변수와 같다
- 멤버 클래스처럼 이름이 있고 반복해서 사용 가능하다
- 익명 클래스처럼 비정적 문맥에서 사용될 때만 바깥 인스턴스를 참조할 수 있다.
- 정적 멤버는 가질 수 없으며 가독성을 위해 짧게 작성해야한다.

## 결론

1. 멤버 클래스의 인스턴스 각각이 바깥 인스턴스를 참조한다면 비정적으로, 그렇지 않으면 정적으로 만들자
2. 중첩 클래스가 한 메서드 안에서 쓰이면서 그 인스턴스를 생성하는 지점이 단 한 곳이고 해당 타입으로 쓰기에 적합한 클래스나 인터페이스가 이미 있다면 익명 클래스로 만들고 그렇지 않으면 지역 클래스로 만들자.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# 톱 레벨 클래스는 한 파일에 하나만 담으라

## 톱 레벨 클래스?

- 다른 클래스 안에 포함되지 않은 클래스. 즉, 독립적으로 존재하는 클래스
- 자바 소스 파일은 일반적으로 하나의 톱레벨 클래스를 담고, 그 클래스의 이름이 파일 이름과 일치해야 힘

## 1 클래스 1 톱레벨

- 이름 충돌로 인한 클래스 중복 정의 방지
- 컴파일 순서에 따른 컴파일 오류 방지
- 굳이 해야한다면 정적 멤버 클래스로 만들기