[이것이 자바다] 06 클래스 - 2
1. 정적 멤버
-자바는 클래스 로더 (loader)을 이용해서 클래스를 메소드영역에 저장하고 사용하는데, 정적 멤버란 메소드 영역의 클래스에 고정적으로 위치하는 멤버를 말한다.
-정적 멤버는 객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능하다.
-필드와 메소드는 모두 정적 멤버가 될 수 있음, static 키워드를 추가해주면 된다.
-객체마다 가지고 있을 필요성이 없는 공용적인 필드는 정적 필드로 선언하는 것이 좋음. 예를 들어 Calculator 클래스에서 원의 넓이나 둘레를 구할 때 필요한 파이는 Calculator객체마다 가지고 있을 필요가 없기 떄문에 정적 필드로 선언하는 것이 좋다.
public class Calculator{
String color; // 계산기별로 색이 다를 수 있다
static double PI=3.141592; //계산기에서 사용하는 파이의 값은 동일하다
}
-또 인스턴스 필드를 사용하지 않는 메소드는 정적 메소드로 선언하는 것이 좋다.
public class Calculator{
String color;
void setColor(String color){ this.color=color;} //인스턴스 메소드
static int plus(int x, int y){return x+y;} // 정적 메소드
}
-즉, static 키워드 사용을 권장하는 두 가지 상황은 다음과 같다
(1) 인스턴스 필드와 독립적으로 매개변수만을 사용하는 메소드일 때
(2) 객체마다 가지고 있을 필요가 없을 때
-클래스로 메모리가 로딩된다면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근하면 된다.
** 정적 필드는 객체 생성 없이도 사용할 수 있기 떄문에 생성자에서 초기화 작업을 하지 않는다, 생성자는 객체 생성 후 바로 실행이 되기 때문이다.
2. 정적 블록
-정적 필드는 다음과 같이 필드 선언과 동시에 초기값을 주는 것이 일반적이다.
static double pi=3.141592;
-하지만 복잡한 초기화 작업이 필요하다면 정적 블록 (static block)을 이용해야함, 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행되며 정적 블록이 클래스 내부에 여러 개 선언이 되어 있으면 선언 순서대로 실행된다.
static{
...
}
3. final 필드와 상수
-인스턴스 필드와 정적 필드는 언제든 값을 변경할 수 있다
-그러나 경우에 따라 값을 변경하는 것을 막고 읽기만 허용해야할 때, final 필드와 상수를 선언하여 사용한다.
-final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어 프로그램 실행 도중에 수정할 수 없게 된다.
final 타입필드 [=초기값];
-final 필드는 다음과 같이 선언하며, final 필드에 초기값을 줄 수 있는 방법은 다음 두 가지밖에 없다.
(1) 필드 선언 시에 초기값 대입
(2) 생성자에서 초기값 대입
4. 상수 선언
- 지구의 무게나 원주율 파이와 같은 불변의 값을 저장하는 필드를 자바에서는 상수(constant)라고 부른다.
-상수는 객체마다 저장을 할 필요가 없고 여러 개의 값을 가져서는 안 되기 때문에 static이면서 final인 특성을 가져야 함, 다음과 같이 선언
static final 타입상수 [=초기값];
-초기값은 선언 시에 주는 것이 일반적이지만 복잡한 초기화가 필요할 경우에는 정적 블록에서 초기화도 할 수 있다.
-상수의 이름은 모두 대문자로 작성하는 것이 관례, 만약 서로 다른 단어가 혼합된 이름이라면 언더바로 단어들을 연결한다.
-또한 상수는 정적필드이므로 클래스로 접근하여 읽을 수 있다.
5. 접근제한자
-자바에서는 중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성 (결점이 없는 성질)을 유지하기 위해 접근 제한자를 사용한다
접근제한자 | 제한대상 | 제한 범위 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 같은 패키지 혹은 자식 객체만 사용가능 |
(default) | 클래스, 필드, 생성자, 메소드 | 같은 패키지 |
private | 필드, 생성자, 메소드 | 객체 내부 |
** 클래스를 선언할 때는 네 가지 종류의 접근 제한자 중 public과 default 접근 제한만을 가질 수 있다.
6. 싱글톤 패턴
**얘는 진짜 처음 들어봄 (ノ゚ο゚)ノ
-애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤(Singleton)패턴을 적용할 수 있음
-싱글톤 패턴의 핵심은 생성자를 private 접근제한하여 외부에서 new 연산자로 생성자를 호출할 수 없도록 막는 것이다.
private 클래스() {}
-생성자를 호출할 수가 없으니 외부에서 마음대로 객체를 생성하는 것이 불가능해지며, 대신 싱글톤 패턴이 제공하는 정적메소드를 통하여 간접적으로 객체를 얻을 수 있다.