필드(Field), 멤버 변수, 멤버 필드, 전역 변수
public 모든 범위, 외부에서도 접근 가능
private 나만, 해당 클래스 내부에서만 접근 가능
(default) 같은 패키지 내
protected 후손 클래스 내 상속이 전제되어 있을 때
기본적으로 필드의 접근제한자는 private으로 해야 한다.
필드 예약어 - static
예약어에 static을 쓰면 그것들이 모두 static 영역으로 올라간다고 보면 된다.
static이라고 하면 바로 떠올려야 하는 단어는 '공유'이다.
다른 곳에서 객체를 만들지 않아도 변수명, 메소드명을 통해 바로바로 접근이 가능한(공유되게하는)
같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며,
프로그램 start시에 정적 메모리 영역에 자동 할당되는 멤버에 적용. 프로그램이 끝날 때 종료된다.
예약어 static은 대부분 private으로 접근제한자를 둔다.
static이 붙지 않은 인스턴스변수는 객체를 만들어서 객체 안에서 접근해야 한다.
static이 붙은 클래스변수는 클래스명.변수이름 이렇게 접근한다.
처음에 프로그램이 시작하자마자 Static이 붙는 애들은 정적 메모리 영역에 올린다.
그래서 main 메소드, staticNum이라는 변수가 올라가는데,
staticNum은 어디 있는 변수인지 알 수 있게 하기 위해 클래스명인 A_KindsOfVariable이 앞에 붙는다.
Heap영역에는 instanceNum이 들어가고 주소값이 생기고 Stackd의 akv가 주소값을 통해 참조하게 된다.
staticNum은 akv를 통해 들어가지 않고 클래스명으로 들어가면 된다.
public class Academy {
private final int TEMP1 = 100; // 하나의 값만 저장해야 하므로 처음부터 초기화
private int temp4;
}
변수 - 위치
메소드 안 ==> 지역변수
메소드 밖 ==> 전역변수
- 예약어
static O ==> 클래스변수
static X ==> 인스턴스변수
초기화 블럭
인스턴스 블럭 {} -> static이 붙지 않은
인스턴스 변수를 초기화시키는 블럭으로 객체 생성할 때마다 초기화
static(클래스) 블럭 static{}
static 필드를 초기화시키는 블럭으로 프로그램 시작 시 한 번만 초기화
초기화 순서
JVM 기본값 ==> null, false, 0 등
명시적 초기값 ==> String str = "robyn";
객체를 만들기 위해서는 new + 생성자가 필요하다.
사실 A_If ai = new A_IF();에서 A_IF()가 생성자이다.
생성자는 메소드의 일종이다.
생성자가 있어야지만 객체가 만들어진다.
알맹이 만들 때 소괄호 안 붙인 적 없을 것이다.
생성자는 객체를 생성해주는 아이다.
소괄호 뒤에 중괄호가 들어가있으면 코드 구현,
중괄호 없이 그냥 ;만 붙는다면 메소드 호출이다.
private int age;
private String name;
JVM 기본값으로 age에는 0이, name에는 null이 들어가있다.
private int age = 10;
private String name = "robyn";
명시적 초기값
{
age = 20;
name = "robyn";
}
인스턴스 초기화 블록 초기값
public Test(){
age = 30;
name="robin";
}
생성자를 통한 초기값