Effective JAVA 책 완독하기 - 중첩클래스는 정적멤버클래스로 정의하자!

박경현·2023년 5월 13일
0

이펙티브 자바 책을 볼 수록 코드를 구현할때 생각 이상으로 많은 고민을 하고 작성해야하는 구나를 느꼈다..

기본적이지만 지켜야할 것들,(추상클래스보다는 인테페이스 등) 아니면 메모리를 위한 필수적인 코딩방법 등을
공부하는데 여전히 배워야할게 많았다 ㅋㅋ

오늘은 정적멤버 클래스에 대해 작성해보려고 한다!

중첩클래스란?

말 그대로 하나의 클래스 내부에 클래스가 있는 형태를 말한다!

그렇다면 이걸 굳이 왜 사용해야 하는 걸까?

캡슐화를 위해서 사용한다고 생각하면 좋다!
예시를 통해서 알아가보자!

시나리오) A클래스에서 b라는 작업이 자주 쓰일때 우리는 b작업을 B클래스로 만들어버리면 쉽게 관리가 가능해진다!
하지만 다른 곳에서 B클래스를 사용하지 않고 A에서만 주로 쓰인다면 우리는 굳이 이걸 외부에 노출시킬 필요가 없다
그렇기에 A클래스 내부에 B클래스를 만들어서 캡슐화 시켜버리면 됨!

class A {
	class B {
    	// A가 자주쓰는 B작업들 여기 적으면 됨
    }
}

중첩클래스에서 정적 멤버 클래스!

일단 하나 알고 가야할게 !! static은 Heap영역에서 관리하지 않는다!!
stack영역에서 관리하기 때문에 GC(가비지 컬렉터)가 수거해가지 않는다는 포인트를 알아야한다!

너무 static 남발도 그래서 별로 안 좋긴함,, 메모리 낭비의 주범

class A {
	private int a;
	static class B {
    	private int b;
    }
}

중첩클래스에서 비 정적 멤버 클래스

비정적은 말 그대로 static이 안붙은 형태를 말한다

class A {
	private int a;
	static class B {
    	private int b;
    }
}

비정적 멤버 클래스와 비교되는 엄청난 정적 멤버 클래스의 장점!!

비정적클래스 객체 생성

void foo() {
A.a = new A();
A.B b = a.new B();
}

무조건 외부 즉 바깥클래스를 만들고 내부 클래스에 대한 인스턴스를 할 수 있어서
외부가 안쓰여도 계속 만들어져 있어야한다 ->> 어마어마한 메모리 낭비!!! (GC가 외부클래스도 사용하는 건줄 알고 수거를 못해감!)

정적클래스 객체 생성

void foo() { A.B b = new B(); }

애는 그냥 static으로 클래스범위에서 접근이 가능해서 굳이 외부 클래스를 객체화한 뒤 만들지 않아도 된다!

피드백

이 책을 절반정도 읽었는데 주로 메모리와 관련된 내용들이 많다
그만큼 프로그래밍에서 메모리라는 것은 중요하다는 거니까 항상 기억하자!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글