자바 study(jdeep) 발표 - static
클래스, 객체 , 인스턴스의 차이
클래스= 객체에 대한 정의, 객체를 만들기위한 틀
객체 = 인스턴스를 대표하는것 new 키워드로 객체를 생성할수있다.
인스턴스 = 클래스에서 만들어진 객체를 클래스의 인스턴스라고 한다.객체와 해당클래스의 관계
Car car = new Car();
Car car2 = new Car();
객체와 인스턴스는 같은의미이지만, 상황에 따라서 다르게 쓰인다.
자바의 static
JVM의 Prepare 과정
static 값들을 메모리에 할당, 기본값 세팅(0)
initialization
static 값들을 본래의 값으로 세팅, 이때 클래스 내에 모든정보들이 메소드영역에 배치된다.
public class Test {
static int count =0;
public Test() {
count++;
System.out.println(count);
}
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
1.모든 인스턴스에 공통으로 사용하는것에 static을붙인다
2. 클래스 변수(static)는 인스턴스를 생성하지않아도 된다
3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할수없다.
=> 인스턴스변수는 당연히 인스턴스가 존재해야 사용한데, 클래스메서드는 인스턴스 없이도 호출이 가능해서
4. 메서드 내에서 인스턴스 변수를 사용하지않는다면 static을 붙이는걸 고려한다.
=> 메서드 호출시간이 짧아져서 성능향상된다. non-static 메서드는 실행시 호출되어야할 메서드를 찾는 과정이 필요해서 시간이 더 걸린다.
문제가 될수있는부분
- 캡슐화원칙에 어긋난다. ( + 변수를 공유할때 문제)
- 오버라이딩 불가능하다 (확장성 제약)
- 프로그램 종료시까지 메모리에 상주 (인스턴스 메소드와 달리 참조되지않는 상태여도 gc가 수거해가지않음)
단순히 빠르다는이유만으로는 static 사용을 지양해야한다.
자주사용하는객체 + 객체를 만드는 비용이 큰객체를 생성할때 사용하는것이 좋다.
초기화 블럭
클래스 초기화블럭 - 블럭내에서 조건문,예외,반복처리 등을 사용할수있어서
명시적 초기화만으로 부족할때 사용을 고려할수있다.
인스턴스 초기화 블럭 -모든 생성자에서 공통으로수행돼야 하는코드를 넣을때
Car(){
count++;
serialNo = count;
...
}
Car(String color, String Type){
count++;
serialNo = count;
...
}
{
count++;
serialNo = count;
...
} //인스턴스 초기화블럭
위와같은 예시에선 생성자가 여러개있을때, 공통되는로직을 묶을수있다고 하는데 사용되는걸 많이 보진못했다.
Author And Source
이 문제에 관하여(자바 study(jdeep) 발표 - static), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dudwls0505/자바-스터디-발표예비저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)