java study _ static

도연·2023년 6월 9일
0

moyeon_java-study

목록 보기
2/2

Static

static은 고정이란 의미
static을 사용함으로써 정적 필드, 정적 메소드를 선언 할 수 있다.
정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이다.
그렇기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스 별로 관리된다.
따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있다.

static 키워드를 통해 생성된 정적 멤버들은 heap 영역이 아닌 static 영역에 할당된다.

StaticHeap
* 주로 클래스들이 할당* 주로 객체들이 할당
* Garbage Collector 관여 x* Gartbage Collector 관여
* 모든 객체가 메모리를 공유* 메모리를 공유하지 않음

Static 영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 된다.
그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 약 영향을 줄 수 있다.

인스턴스로 생성할 것인지 정적으로 생성할 것인지는 공용으로 사용하느냐 아니냐로 판단할 수 있다.
필드와 메소드 선언 시 static이란 키워드를 붙이면 정적으로 생성 , 그냥 생성한다면 자동으로 인스턴스로 생성된다.

Static 필드 사용 예시

class Number {
	static int num = 0 ; // 클래스 필드 
    int num2= 0 ; // 인스턴스 필드
}

public class static_ex{
	public static void main(String[] args) {
    	NUmber number1 = new Number();  // 첫번째 number
        Number number2 = new Number();  // 두번째 number
        
        number1.num++;   //  클래스 필드 num을 1 증가 (클래스 필드는 저장소를 같은 곳으 쓰고 있는 점 유의) 
        number2.num2++;  // 인스턴스 필드 numdmf 1 증가 (인스턴스 필드는 선언 때 마다 새로 생성 됨을 알기)
        System.out.println(number2.num); // 클래스 필드를 출력하므로 number2도 number1의 클래스 필드 num을 가르킴
        System.out.println(number2.num2); // number1 의 인스턴스 필드와는 다른 num2 를 가르킴
     }
}
  • 출력 결과
    1
    0
  • 코드 설명
    Number1 , Number2 라는 객체를 2개 생성 했다.

num++ 의 경우는 클래스 필드 값을 증가 시키고 있다.
number1.num 과 number2.num 이 같은 num의 저장소를 가르키고 있으므로 어떤 num을 호출 하던지 증가된 num값이 반영된 num을 호출 및 출력 할 수 있다.

num2++ 의 경우는 인스턴스 필드 값을 증가 시키고 있다.
number1.num2와 number2.num2는 다른 필드를 가르키고 있다.(인스턴스 필드는 객체(인스턴스)가 생성될 때 마다 새로 생성되기 때문에 각각 다른 저장소를 가지고 있는 것)
그렇기 때문에 number1.num2를 증가 시킨 뒤 number2.num2값을 출력 및 호출하면 증가 되지 않은 number2.num2값이 출력 및 호출 되는 것이다.

Static 메소드 사용 예시

class Name {
	static noid print() {
    	System.out.println("나는 클래스 메소드") ;
        }
    void print2() { 
    	System.out.println("나는 인스턴스 메소드") ;
    }
}

public class Static_ex {

	public static void main(String[] args) {
    	Name.print();  // 인스턴스를 생성하지 않아도 호출 가능 (클래스 메소드 )
        
        Name name = new Name(); // 인스턴스 생성
        name.print2();  // 인스턴스를 생성해야만 호출 가능 (인스턴스 메소드 이므로)
   }
}
  • 출력 결과
    나는 클래스 메소드
    나는 인스턴스 메소드

정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성된다.
그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있다.
정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용된다.

** 유틸리티 함수 : 여러 계산과 처리를 대신하는 일반 함수 , 반복적으로 사용을 하므로 static 선언을 해두면 수시로 호출하여 사용 하기 용의 (인스턴스를 사용 때 마다 생성해서 사용할 필요가 없음)

static의 의미는 아는데 코딩을 할 때 그냥 습관적으로 붙여서 만드는 경우가 많다 ..
그래서 인스턴스 필드라 생각하고 처리하다가 오류를 못 찾는 경우가 꽤나 있다.
이번에 자격증 실기 시험을 봤을 때 이 내용이랑 관련된 문제가 나왔었는데
문제로 보니까 꽤나 헷갈려서 확신해서 쓰질 못했던 기억이 있어서 한번 정리해본다.

참조 ) 링크텍스트

profile
모연

0개의 댓글