From ac07b6c0769d2fd69639b7588755ebc49881b2e1 Mon Sep 17 00:00:00 2001 From: tkdwns414 Date: Sun, 16 Jun 2024 23:26:09 +0900 Subject: [PATCH 1/2] effectiveJava - item 24 --- ...4_\353\247\214\353\223\244\353\235\274.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 "sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23424_\353\251\244\353\262\204_\355\201\264\353\236\230\354\212\244\353\212\224_\353\220\230\353\217\204\353\241\235_static\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" diff --git "a/sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23424_\353\251\244\353\262\204_\355\201\264\353\236\230\354\212\244\353\212\224_\353\220\230\353\217\204\353\241\235_static\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" "b/sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23424_\353\251\244\353\262\204_\355\201\264\353\236\230\354\212\244\353\212\224_\353\220\230\353\217\204\353\241\235_static\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" new file mode 100644 index 0000000..054d88f --- /dev/null +++ "b/sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23424_\353\251\244\353\262\204_\355\201\264\353\236\230\354\212\244\353\212\224_\353\220\230\353\217\204\353\241\235_static\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" @@ -0,0 +1,51 @@ +# 멤버 클래스는 되도록 static으로 만들라 + +## 중첩 클래스의 종류 + +- 정적 멤버 클래스 +- 비정적 멤버 클래스 +- 익명 클래스 +- 지역 클래스 + +내부 클래스: 비정적 멤버 클래스, 익명 클래스, 지역 클래스 + +## 정적 멤버 클래스 + +- 다른 클래스 안에서 선언된다 +- 바깥 클래스의 private 멤버에도 접근할 수 있다 +- 이외에는 일반 클래스와 똑같다 +- 다른 정적 멤버와 똑같은 접근 규칙을 적용받으므로 private로 선언하면 바깥 클래스에서만 접근할 수 있다 + +-> 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스로 쓰인다 + +## 비정적 멤버 클래스 + +- 인스턴스가 바깥 클래스의 인스턴스와 암묵적으로 연결된다 +- 비정적 멤버 클래스의 인스턴스 메소드에서 클래스명.this를 사용해 바깥 인스턴스의 메소드를 호출하거나 바깥 인스턴스의 참조를 가져올 수 있다. +- 비정적 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없다 +- 멤버 클래스가 인스턴스화 될 때 비정적 멤버 클래스의 인스턴스와 바깥 인스턴스 사이의 관계가 확립된다. + +-> 어댑터를 정의할 때 주로 쓰인다 (어떤 클래스의 인스턴스를 감싸 다른 클래스의 인스턴스처럼 보이게 하는 뷰) + +- 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙이자. 참조를 저장하는데에 시간과 공간이 소비되며 메모리 누수가 생길 수도 있다. + +## 익명 클래스 + +- 이름이 없는 일회성 클래스로 클래스 선언과 인스턴스 생성을 동시에 할 수 있다 +- 주로 메소드, 초기화 블록, 필드에서 사용됩니다. +- 익명 클래스는 바깥 클래스의 변수를 참조할 수 있으며, final이나 effectively final인 변수만 참조 가능하다. + +-> 익명 클래스는 주로 이벤트 핸들러나 간단한 콜백을 구현할 때 사용된다 + +## 지역 클래스 + +- 가장 드물게 사용된다. +- 지역변수를 선언할 수 있는 곳이면 어디서든 선언 가능하며 유효 범위도 지역변수와 같다 +- 멤버 클래스처럼 이름이 있고 반복해서 사용 가능하다 +- 익명 클래스처럼 비정적 문맥에서 사용될 때만 바깥 인스턴스를 참조할 수 있다. +- 정적 멤버는 가질 수 없으며 가독성을 위해 짧게 작성해야한다. + +## 결론 + +1. 멤버 클래스의 인스턴스 각각이 바깥 인스턴스를 참조한다면 비정적으로, 그렇지 않으면 정적으로 만들자 +2. 중첩 클래스가 한 메서드 안에서 쓰이면서 그 인스턴스를 생성하는 지점이 단 한 곳이고 해당 타입으로 쓰기에 적합한 클래스나 인터페이스가 이미 있다면 익명 클래스로 만들고 그렇지 않으면 지역 클래스로 만들자. From 18a06d342c51ea7e55d6c299bb04fdefe7f2b9a5 Mon Sep 17 00:00:00 2001 From: tkdwns414 Date: Sun, 16 Jun 2024 23:35:26 +0900 Subject: [PATCH 2/2] effectiveJava - item 25 --- ...\247\214_\353\213\264\354\234\274\353\235\274.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 "sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23425_\355\206\261\353\240\210\353\262\250_\355\201\264\353\236\230\354\212\244\353\212\224_\355\225\234_\355\214\214\354\235\274\354\227\220_\355\225\230\353\202\230\353\247\214_\353\213\264\354\234\274\353\235\274.md" diff --git "a/sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23425_\355\206\261\353\240\210\353\262\250_\355\201\264\353\236\230\354\212\244\353\212\224_\355\225\234_\355\214\214\354\235\274\354\227\220_\355\225\230\353\202\230\353\247\214_\353\213\264\354\234\274\353\235\274.md" "b/sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23425_\355\206\261\353\240\210\353\262\250_\355\201\264\353\236\230\354\212\244\353\212\224_\355\225\234_\355\214\214\354\235\274\354\227\220_\355\225\230\353\202\230\353\247\214_\353\213\264\354\234\274\353\235\274.md" new file mode 100644 index 0000000..12fd100 --- /dev/null +++ "b/sangjune/7\354\243\274\354\260\250/\354\203\201\354\244\200-7\354\243\274\354\260\250-\354\225\204\354\235\264\355\205\23425_\355\206\261\353\240\210\353\262\250_\355\201\264\353\236\230\354\212\244\353\212\224_\355\225\234_\355\214\214\354\235\274\354\227\220_\355\225\230\353\202\230\353\247\214_\353\213\264\354\234\274\353\235\274.md" @@ -0,0 +1,12 @@ +# 톱 레벨 클래스는 한 파일에 하나만 담으라 + +## 톱 레벨 클래스? + +- 다른 클래스 안에 포함되지 않은 클래스. 즉, 독립적으로 존재하는 클래스 +- 자바 소스 파일은 일반적으로 하나의 톱레벨 클래스를 담고, 그 클래스의 이름이 파일 이름과 일치해야 힘 + +## 1 클래스 1 톱레벨 + +- 이름 충돌로 인한 클래스 중복 정의 방지 +- 컴파일 순서에 따른 컴파일 오류 방지 +- 굳이 해야한다면 정적 멤버 클래스로 만들기