생성자, 접근제어자, static
생성자
public class person{
String name;
int age;
int id;
}
위와 같은 클래스가 존재한다면 기본 생성자 person()은 적지 않아도 기본적으로 작동한다.(각 필드의 기본값으로 할당)
생성자가 한가지라도 존재 한다면 기본 생성자가 생성되지 않으므로 따로 오버로딩하여 명시해주어야 한다.
public class person{
String name;
int age;
int id;
person(String name, int age,int id){
this.name = name;
this.age=age;
this.id=id;
}
person(){
}
}
매개변수와 필드명이 같을경우. 호출시 가까운 매개변수가 우선권을 가져서 필드값에 접근하려면 this 키워드 사용
this를 통해 오버로딩된 생성자에서 다른 생성자를 호출할 수도 있다.(생성자의 맨 위에만 가능)
public class person{
String name;
int age;
int id;
person(String name, int age,int id){
this.name = name;
this.age=age;
this.id=id;
}
person(String name,int id){
this(name,0,id);
}
}
나이를 입력하지 않은 경우 0으로.
생성제어자
public -> 다른 패키지에서도 사용가능
protected -> 같은 패키지에서 가능하고, 상속관계일 경우 다른 패키지여도 가능.
default(명시하지 않을 경우 기본값) -> 같은 패키지에서만 사용 가능
private -> 모든 외부 호출 막는다. (클래스 내부에서만)
클래스 접근제어자는 public 아니면 default
private 접근제어자로 캡슐화 하여 적절하게 숨기고 접근을 제약한다.
static
자바의 메모리구조로는 메서드, 스택, 힙 영역이 있다.
메서드 -> 클래스 정보가 저장됨,(공통 리터럴 상수와 static)
스택 -> 실행된 메서드 들이 저장되어있음
힙 -> 객체가 생성되는 영역 (new를 사용해 생성된 것들)
static 요소들은 메서드 영역에 저장됨. 프로그램이 시작될때 딱 하나만 생성됨.
같은 인스턴스를 여러개 생성하면, 각 멤버변수 값들은 다르지만 메서드는 동일하다.
메서드는 힙 영역이 아닌 메서드 영역에 남아있고 사용시 꺼내서 쓴다.
힙영역에 생성된 인스턴스를 스택 영역에서 아무것도 가리키고 있지 않다면 GC에 의해서 제거되어 메모리 관리.
public class person{
static int count;
String name;
int age;
int id;
person(){
count++;
}
}
static 멤버 변수를 사용해서 다른 참조를 추가 할 필요 없이 생성된 사람 인스턴스가 총 몇개인지 확인할 수 있다.
메서드 영역에 보관되기에 추가 관리가 필요없고 사라지지 않음.
멤버 변수가 필요없이 기능만 구현된 메서드는 static 메서드로 구현 할 수 있다.
당연히 클래스 내부 기능을 사용하게 된다면 정적메서드나 정적변수만 사용 가능.