참조 : Do it Java 완전정복
http://www.yes24.com/Product/Goods/103389317
접근 지정자
- 자바 제어자: 클래스, 필드, 메서드, 생성자 등 에게 어떠한 특징을 부여하는 문법 요소
- 접근 지정자 : 클래스, 멤버 생성자 앞에 위치 간으, 사용범위를 정의하는 역할
멤버 및 생성자의 접근 지정자
- public, protected, default(또는 package), private 사용가능
- 아무것도 작성하지 않으면, default 접근지정가 자동설정됨
- public : 동일 패키지의 모든 클래스 + 다른 패키지의 모든 클래스에서 사용 가능
- protected : 동일 패키지의 모든 클래스 + 다른 패키지의 자식클래스에서 사용가능
- default : 동일 패키지의 모든 클래스에서 사용가능
- private : 동일 클래스에서 사용 가능
클래스의 접근 지정자
- public, default 접근 지정자만 사용가능
클래스 접근 지정자와 생성자 접근 지정자의 연관성
- 자동으로 추가되는 생성자의 접근 지정자는 클래스의 접근 지정자에 따라 결정된다.
- 클래스가 public이면 자동추가 생성자도 public
- 클래스가 public 이면 다른 패키지에서 임포트가능
- 생성자가 public 이면 생성자를 호출해 객체를 생성가능
- 클래스가 임포트되지 않으면 생성자는 접근 지정자와 상관 없이 호출자체를 할 수 없다.
static 제어자
- static은 클래스의 멤버(필드, 메서드, 이너클래스)에 사용하는 제어자, 객체를 생성하지 않아도 클래스의 내부 구성 요소를 사용할 수 있도록 만든다.
- 객체 안에 있을때 사용할 수 있는 상태가 되는 멤버 - 인스턴스 멤버
- 인스턴스 멤버는 멤버 앞에 static이 붙어 있지 않다.
- static이 붙은 멤버 - 정적 멤버
- 객체의 생성없이 ‘클래스명.멤버명’만으로 바로 사용가능
인스턴스 필드와 정적 필드
class A {
int m = 3; // 객체 생성한 후 참조변수명.인스턴스 필드명 과 같이 사용가능
static int n = 5; //객체 생성없이 사용가능
}
- 인스턴스 필드인 m 의 저장 공간은 객체 내부에 생성되므로 m 을 사용하기위해서는 반드시 객체를 먼저 생성해야 한다.
- 저장 공간이 힙 메모리에 위치하므로 반드시 해당 저장 공간에 값을 읽거나 위해서는 참조 변수명 사용해야한다.
- 정적 필드인 n은 클래스 내부에 저장 공간을 지니고 있기 때문에 객체 생성 없이 바로 사용가능
- 객체 내부에 정적 필드인 n도 존재한다. 다만 n의 실제 저장 공간은 정적(static)영역 내부에 있으며, 객체 내부의 n은 실제 정적 필드의 저장 공간의 참조값만 포함 - 참조변수명으로도 사용 가능
- 정적 필드는 객체 간 공유 변수의 성질이 있다.
-
class A {
int m = 3;
static int n = 5;
}
public class StaticField_2 {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
a1.m = 5;
a2.m = 6;
System.out.println(a1.m);
System.out.println(a2.m);
a1.n = 7;
a2.n = 8;
System.out.println(a1.n);
System.out.println(a2.n);
A.n = 9;
System.out.println(a1.n);
System.out.println(a2.n);
}
인스턴스 메서드와 정적 메서드
- 인스턴스 메서드는 반드시 객체 생성후 사용가능
- 정적 메서드는 클래스명으로도 바로 접근 가능
- 인스턴스 매서드는 인스턴스 메서드 영역(메모리)에 위치
- 정적 메서드는 클래스 내부(메모리)에 존재
- 정적 매서드 내부에서는 정적 멤버만 사용할 수 있다.
- 인스턴스 메서드 내에서는 인스턴스 멤버와 정적 멤버 모두 사용가능
정적 초기화 블록
- 생성자에서는 정적 필드를 초기화 할 수 없다.
- 정적초기화 블록 에서가능
- static { //클래스가 메모리에 로딩될 때 실행되는 내용}
- 클래스가 메모리에 로딩될 때 가장 먼저 실행된다.
- 인스턴스 필드 초기화는 객체가 만들어지는 시점 - 생성자내에서 초기화
static main()메서드
- JVM은 프로그램을 실행할 때 ‘실행 클래스명.main()’을 실행하므로 가장 먼저 실행되는 메서드인 main()메서드를 정적메서드로 구성한 것