static - 변수와 메서드를 만들 때 사용할 수 있다. 정적 멤버, 클래스 멤버라고도 하는데 개체(인스턴스) 소속이 아닌 클래스 소속이 된다. 전역 변수처럼 사용할 수도 있다. 생성자가 없어도 사용이 가능하다. 그 이유는 개체가 만들어진 개수와는 상관없이 클래스는 하나만 존재하기 때문에 자신에게 해당 메서드가 없으면 클래스로 가서 확인할 수 있기 때문이다. 생성자를 만들고 개체를 만들어서 사용할 수 있다. 생성자를 private으로 두면 개체를 못 만들게 할 수도 있다. 정적 메서드에서 비정적 메서드에는 접근이 불가능하다. 비정적 메서드에서 정적 메서드는 접근할 수 있다. 클래스에 속한 메서드가 개체에 속한 멤버(함수/변수)에는 접근이 불가능하다. 클래스 내부에 있기 때문에 접근 범위를 제어할 수 있고, 이름 충돌이 적다.
static에서 불가능 한 것 - 다형성을 사용할 수 없다. 시그니처(ex. getInstance())를 그대로 두고 멀티턴 패턴으로 바꿀 수 없다. 개체 생성 시점(ex. getInstance())을 제어할 수 없다.
디자인 패턴 - 반복적이고 범용적인 소프트웨어 설계에서 흔히 겪는 문제에 대한 해결책이다. 완성된 설계가 아니다. GoF에는 생성 패턴(Creational), 구조 패턴(Structural), 행위 패턴(Behavioral)가 나와있다.
싱글턴(Singleton) - 어떤 클래스에서 만들 수 있는 인스턴스 수를 하나로 제한하는 패턴이다. 프로그램 실행 중에 최대 하나만 있고, 이 개체에 전역적으로 접근이 가능해야 하는 개체에 적용하기 적합하다. static과 똑같다는 이유로 싱글턴도 안티패턴이라고 주장하기도 한다. 싱글턴을 사용하지 않고도 가능하지만 코드가 복잡해질 수 있다.
싱글턴의 변형 - getInstance() 대신 createInstance(), deleteInstance()를 활용해 인스턴스를 생성하고 삭제하는 형식으로 만들 수 있다.
내포 클래스(Nested Class) - 클래스 안에 다른 클래스가 들어있는 것이다. 비정적 내포 클래스(Non-Static Nested Class = 내부 클래스 Inner Class), 정적 내포 클래스(Static Nested Class)가 있다. 서로 연관된 클래스를 그룹지을 수 있다. 내포 클래스는 바깥 클래스의 private 멤버에 접근이 가능하다. 바깥에서 내포의 private는 접근 불가능하다.