static / java

aljongjong·2021년 8월 27일
0

맨날까먹는거

목록 보기
3/13

  • 메소드를 정의할 떄 static이란 키워드를 쓰면 클래스 소속
  • 메소드를 정의할 떄 static이란 키워드가 없으면 인스턴스 소속

클래스 변수 (static 변수)

  • static으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다.


👉인스턴스 생성 시마다 1씩 값이 증가.
👉클래스 변수는 인스턴스 내에 존재하는 변수가 아니라 ‘어떠한 인스턴스에도 속하지 않는 상태로 메모리 공간에 딱 하나만 존재하는 변수’이다.
👉클래스 변수도 ‘접근 수준 지시자’의 규칙을 그대로 적용



👉클래스 내부 접근 - 변수의 이름을 통해 직접 접근
👉클래스 외부 접근 - 클래스 또는 인스턴스의 이름을 통해 접근(AccessWay.num++; way.num++;)


  • 인스턴스 간에 데이터 공유가 필요한 상황에서 클래스 변수를 선언한다.

    👉PI가 상수로 선언. PI가 지닌 값은 ‘원주율’로 결코 변하지 않는 값이기 때문이다. 그런데 인스턴스 변수가 아닌 ‘클래스 변수’로 선언되었다. 이는 모든 Circle 인스턴스가 참조해야 하는 값이지만, 인스턴스가 각각 지녀야 하는 값은 아니기 때문이다. —> 참조를 목적으로만 존재하는 값은 final 선언이 된 클래스 변수에 담는다.
    👉그리고 이 값은 외부에서 참조한다고 해서 문제가 되는 값이 아니다. 그래서 private으로 선언하지 않았다. 필요하다면 public으로 선언해도 괜찮은 값이다.

클래스 메소드 (static 메소드)

  • 클래스 내에 정의된 메소드에 static 선언을 하면 ‘클래스 메소드’가 된다.
  • 인스턴스 생성 이전부터 접근이 가능하다.
  • 어느 인스턴스에도 속하지 않는다.


👉NumberPrinter.showInt(20); —> 인스턴스 np 생성 이전에 호출


class AAA {
	int num = 0;
	static void addNum(int n) {
		num += n;		// 인스턴스 변수 접근 불가
	}
}
- 인스턴스 변수(int num = 0;)는 인스턴스에 속한다. 
  인스턴스가 생성이 되어야 메모리 공간에 존재하게 된다. 
  반면 클래스 메소드는 인스턴스 생성 이전부터 호출이 가능하다.
- ❤️‍🔥❤️‍🔥클래스 메소드는 인스턴스에 속하지 않으므로 인스턴스 변수에 접근이 불가능하다.
- 같은 이유로 클래스 메소드는 인스턴스 메소드의 호출도 불가능하다.

------------------------------------------------------------------------

class AAA {
	static int num = 0;
	static void showNum() {
		System.out.println(num); // 클래스 변수 접근 가능
	}
	static void addNum(int n) {
		num += n;		 // 클래스 변수 접근 가능
		showNum();		 // 클래스 메소드 호출 가능
	}
}

0개의 댓글

관련 채용 정보