Java에서 개인 정적 변수를 사용하는 것은 무엇입니까?


156

변수가로 선언되면 public static varName;어디서나 변수에 액세스 할 수 있습니다 ClassName.varName. 또한 정적 멤버는 클래스의 모든 인스턴스에서 공유되며 각 인스턴스에서 재 할당되지 않는다는 것을 알고 있습니다.

변수를 선언하는 것과 private static varName;다른 것으로 변수를 선언하고 private varName;있습니까?

두 경우 모두 다른 클래스 로 ClassName.varName또는 ClassInstance.varName다른 클래스에서 액세스 할 수 없습니다 .

변수를 정적으로 선언하면 다른 특수 속성이 제공됩니까?


5
Java 변수 이름은 대시 (-)를 포함 할 수 없습니다.
Martijn Courteaux

답변:


127

물론로 액세스 할 수 ClassName.var_name있지만 정의 된 클래스 내부에서만 액세스 할 수 있습니다 private.

public static또는 private static변수는 종종 상수에 사용됩니다. 예를 들어, 많은 사람들이 자신의 코드에서 상수를 "하드 코딩"하는 것을 좋아하지 않습니다. 그들은 의미있는 이름으로 변수 public staticprivate static변수 를 만들고 그것을 코드에서 사용하기 때문에 코드를 더 읽기 쉽게 만들어야합니다. (또한 그러한 상수를 만들어야합니다 final).

예를 들면 다음과 같습니다.

public class Example {
    private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
    private final static String JDBC_USERNAME = "username";
    private final static String JDBC_PASSWORD = "password";

    public static void main(String[] args) {
        Connection conn = DriverManager.getConnection(JDBC_URL,
                                         JDBC_USERNAME, JDBC_PASSWORD);

        // ...
    }
}

변수를 만들 public거나 private변수를 클래스 외부에 표시할지 여부에 따라 다릅니다.


6
로 액세스하려면 무엇이 필요 ClassName.var_nam합니까? 내가 직접 접근 할 수있는 곳 : var_nam수업 내
Vaibhav Jani

12
클래스 이름을 통해 액세스 할 필요 는 없지만 비 정적 변수와 구별하기 위해 좋은 스타일이라고 생각하는 사람들이 있습니다.
Jesper

5
정적 변수를 사용하여 액세스하는 데 필요한 것은 "private final String JDBC_PASSWORD ="password ";"라고 쓸 수 있습니다. 이 비밀번호 문자열에 정적 변수를 사용하는 대신
chaitanya

48
@chaitanya 그것은 상수입니다. 왜 정적이 아닌 클래스의 각 인스턴스에 대한 변수 사본을 원하십니까?
Jesper

16
static은 클래스 레벨 변수이며, 공통이며 해당 클래스의 모든 인스턴스에 대해 하나의 사본 만 존재합니다. 이 규칙은 개인이든 공개이든 관계없이 적용됩니다. private은 단지 비 세계가 내 최종 변수가 아닌 정적 값을 손상시키지 않기를 원한다고 말합니다. 스태틱이 최종적이라면 아무도 그 가치를 바꿀 수 없으므로 공개로 만드는 데 아무런 해가 없습니다.
user1923551

94

정적 변수는 클래스의 모든 인스턴스에 대해 단일 값을 갖습니다.

다음과 같은 것을 만들어야한다면 :

public class Person
{
    private static int numberOfEyes;
    private String name;
}

이름을 바꾸고 싶었습니다. 제 이름은 그대로입니다. 그러나 만약 당신이 당신이 17 개의 눈을 갖도록 그것을 바꾸고 싶다면 세계의 모든 사람들이 17 개의 눈을 가질 것입니다.


3
클래스 외부에서 액세스 할 수 없기 때문에 개인 변수에 대한 접근 자 메서드도 작성하지 않으면 개인 정적 변수에 적용되지 않습니다.
Ganesh Krishnan

2
@GaneshKrishnan이 아니므로 클래스의 모든 인스턴스는 두 변수에 모두 액세스 할 수 있습니다. 당연히 수업의 저자는 어리석은 짓을하지 않을 것으로 기대할 수 있습니다. 또한 리플렉션과 JNI를 사용하면 모든 베팅이 해제됩니다.
TofuBeer

46

프라이빗 정적 변수는 프라이빗 인스턴스 변수와 같은 방식으로 유용합니다. 동일한 클래스 내의 코드로만 액세스되는 상태를 저장합니다. 접근성 (private / public / etc)과 변수의 인스턴스 / 정적 특성은 전적으로 직교 개념입니다.

정적 변수가 클래스의 "모든 인스턴스"간에 공유되는 것으로 생각하지 않기를 원합니다. 즉 , 상태가 존재하려면 하나 이상의 인스턴스가 있어야 함을 나타냅니다. 아니오 - 정적 변수는 유형 자체 대신과 관련된 모든 유형의 인스턴스.

따라서 특정 인스턴스가 아닌 유형과 관련된 상태를 원할 때 언제든지 상태를 비공개로 유지하고 싶을 수도 있습니다 (예를 들어 속성을 통한 제어 된 액세스를 허용하는 경우) 전용 정적 변수를 갖는 것이 좋습니다.

따로, 공개 (또는 비공개) 변수를 만드는 유일한 변수 유형은 상수-불변 유형의 정적 최종 변수 인 것이 좋습니다. API와 구현을 분리하기 위해 다른 모든 것들은 비공개로해야합니다.


하나의 클래스에서 개인 정적 및 비 정적 변수 액세스의 차이점에 대해 조금 더 설명 할 수 있습니까?
Dharmendra

1
@ Darmendra : 무슨 말인지는 분명하지 않습니다. 비공개 부분은 관련이 없습니다-정적 변수와 인스턴스 변수의 차이점에 대해 정확히 무엇을 혼란스럽게합니까?
Jon Skeet

정적 및 비 정적 변수를 선언 된 단일 클래스 내에서 사용할 때 접근성의 차이점은 무엇입니까?
Dharmendra

2
@ YogGuru : 나는 질문의 관련성을 보지 못한다. 비공개로하려면 비공개로 설정하고 정적으로하려면 정적으로 설정하십시오. 그들은 직교입니다.
Jon Skeet

1
@ryvantage : 아뇨, 전혀 아닙니다. 정적 메소드는 문제없이 액세스 할 수 있습니다.
Jon Skeet

11

글쎄 당신은 클래스의 인스턴스를 만들지 않고 공용 정적 변수를 사용하지만 개인 정적 변수는 그렇지 않습니다. 그들과 개인 정적 변수를 사용하는 위치의 주요 차이점은 정적 함수에서 변수를 사용해야 할 때입니다. 정적 함수의 경우 정적 변수 만 사용할 수 있으므로 다른 클래스에서 액세스하지 못하도록 비공개 변수로 설정하십시오. 그것이 개인 정적을 사용하는 유일한 경우입니다.

예를 들면 다음과 같습니다.

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}

3
나는이 대답이 가장 마음에 드는 것 같아요. +1. 개인 변수에서 static을 사용하는 것이 유일한 방법은 정적 메소드가 변수에 액세스하는 경우입니다.
Mukus

클래스에 적절한 이름을 부여하지 않으면 이것이 유효한 사용 사례인지 실제로 말할 수는 없습니다. 마찬가지로 클래스가 호출 된 Person경우 연령대가 다른 여러 사람을 가질 수 없기 때문에 버그 일 수 있습니다 (의도 된 사용 사례 인 경우).
DanMan

@Mukus에 동의합니다. 이것은이 질문에 대한 유일한 실제 답변 일 수 있습니다. OP는 이미 정적을 이해하고 있지만 사람들은 다시 설명하고 싶어하는 것 같습니다. 그는 특정 시나리오에 대해 묻고 있습니다. 정적 메소드에서 변수에 액세스하는 기능은 '정적 개인'이 추가하는 기능입니다. 또한 중첩 정적 CLASSES가 변수에 액세스 할 수 있다고 덧붙이고 싶습니다.
Pinkerton

1
메모리는 어떻습니까? 정적을 사용하면 모든 인스턴스에 대한 복사본 대신 클래스에 대해 하나의 복사본 만 만들게됩니다. 그리고 분명히 상수로, 당신은 수업을 위해 하나의 사본 만 있으면됩니다. 메모리가 절약됩니까?
Pinkerton

1
나는 그것을 보았다. 이전 질문에 대한 대답은 다음과 같습니다. 예, 메모리를 절약합니다
Pinkerton

8

음, private static변수는 그 클래스의 인스턴스에서 데이터를 공유 할 수 있습니다. 당신은 우리가 액세스 할 수있는 올바른 동안 private static같은 구조를 사용하여 변수를 ClassName.member하거나 ClassInstance.member하지만, 회원은 항상 그 클래스의 클래스의 메소드 나 인스턴스에서 볼 수 있습니다. 따라서 실제로 해당 클래스의 인스턴스는 항상 멤버를 참조 할 수 있습니다.


6

개인 정적 클래스 변수의 사용은 무엇입니까?

도서관 서적 클래스가 있다고 가정 해 봅시다. 새 책을 만들 때마다 고유 한 ID를 할당하려고합니다. 한 가지 방법은 단순히 0에서 시작하여 id 번호를 늘리는 것입니다. 그러나 다른 모든 책은 마지막으로 생성 된 ID 번호를 어떻게 알 수 있습니까? 간단하게 정적 변수로 저장하십시오. 고객은 실제 내부 ID 번호가 각 책의 번호임을 알고 있어야합니까? 아닙니다. 그 정보는 비공개입니다.

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

이것은 고안된 예이지만 모든 클래스 인스턴스가 다른 사람으로부터 비공개로 유지해야하는 공통 정보에 액세스하려는 경우를 쉽게 생각할 수 있습니다. 또는 할 수없는 경우라도 가능한 한 사적인 것을 만드는 것이 좋은 프로그래밍 습관입니다. 책 사용자가 아무것도하지 않아도 numBooks 필드를 실수로 공개 한 경우 어떻게해야합니까? 그러면 누군가 새 책을 만들지 않고도 책 수를 변경할 수 있습니다.

매우 교활한!


6

변수를 선언하는 것과 private static varName;다른 것으로 변수를 선언하고 private varName;있습니까?

예, 둘 다 다릅니다. 첫 번째 class variable값은 단일 값을 보유하기 때문에 호출 되는 class반면 instance variable다른 값은 다른 값을 보유 할 수 있기 때문에 호출 instances(Objects)됩니다. 첫 번째 인스턴스는 jvm에서 한 번만 작성되고 다른 인스턴스는 인스턴스 당 한 번 작성됩니다. 즉, 인스턴스가 10 개인 경우 private varName;jvm에서 10 개의 다른 항목이 작성 됩니다.

변수를 선언하면 static다른 특별한 속성이 부여됩니까?

예, 정적 변수는 일반 인스턴스 변수와 다른 속성을 갖습니다. 나는 이미 언급하지 않았고 여기에 몇 가지를 보자 : class variables(정적으로 선언 된 인스턴스 변수)는 같은 클래스 이름을 사용하여 직접 액세스 할 수 있습니다 ClassName.varName. 또한 인스턴스 변수가 해당 객체에서만 액세스되는 것과 달리 해당 클래스의 모든 객체는 해당 값에 액세스하고 값을 수정할 수 있습니다. 정적 변수에는 클래스 변수를 사용할 수 있습니다.

private static variableJava에서 무엇을 사용 합니까?

논리적으로, 첫 번째 private static variable와 다를 바없이 public static variable더 많은 제어를 제공합니다. IMO, 당신은 말 그대로 대체 할 수있는 public static variableprivate static variable의 도움으로 public staticgetter와 setter 메소드.

널리 사용되는 영역 중 하나 는 전 세계에 해당 클래스의 단일 인스턴스 만있는 private static variable간단한 Singleton패턴 을 구현하는 것입니다. 여기서 static식별자는 외부 세계에서 단일 인스턴스에 액세스 할 수 있도록하는 중요한 역할을합니다 (물론 공개 정적 게터 메소드도 주요 역할을 수행함).

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}

4

private 키워드는 클래스 내 변수 액세스에 사용하고 정적 메소드에서 변수에 액세스 할 수 있다는 의미에서 정적을 유지하지만 참조 변수는 정적 메소드에서 액세스 할 수 없습니다.


3

다른 관점 :

  1. 클래스와 그 인스턴스는 런타임에 서로 다른 두 가지입니다. 클래스 정보는 해당 클래스의 모든 인스턴스가 "공유"합니다.
  2. 정적이 아닌 클래스 변수는 인스턴스에 속하고 정적 변수는 클래스에 속합니다.
  3. 인스턴스 변수가 개인용 또는 공용 일 수있는 것처럼 정적 변수는 개인용 또는 공용 일 수도 있습니다.

1

정적 메소드에서 변수를 사용하는 경우 변수는 예를 들어 정적이어야합니다.

private static int a=0;  
public static void testMethod() {  
        a=1;  
}

3
글쎄, 당신의 방법이 물론 클래스의 인스턴스에 대한 참조가 주어지지 않는 한.
Jon Skeet

1

정적 변수는 클래스의 모든 인스턴스에 공통적 인 변수입니다. 한 인스턴스가 변경하면 정적 변수의 값이 다른 모든 인스턴스에 대해 업데이트됩니다.


1

어떤 사람들에게는 몇 가지 다른 언어로 볼 때 더 의미가 있으므로 Java로 예제를 작성했으며 페이지의 PHP에서 이러한 수정자를 설명합니다. 당신은 이것에 대해 잘못 생각하고있을 것입니다.

아래에 의미가 맞지 않으면 내 예제를 살펴 봐야합니다. 여기로 이동 http://www.siteconsortium.com/h/D0000D.php

그러나 결론은 그것이 말하는 것과 거의 똑같다는 것입니다. 비공개 정적 멤버 변수입니다. 예를 들어 Singleton 객체를 만들려면 SingletonExample.instance 변수를 public으로 설정해야하는 이유는 무엇입니까? 당신이 수업을 사용하고있는 사람을했다면 쉽게 값을 덮어 쓸 수 있습니다.

그게 다야.

    공개 클래스 SingletonExample {
      개인 정적 SingletonExample 인스턴스 = null;
      개인 정적 정수 값 = 0;
      개인 SingletonExample () {
        ++ this.value;
      }
      공개 정적 SingletonExample getInstance () {
        if (인스턴스! = 널)
        인스턴스 반환;
        동기화 (SingletonExample.class) {
        인스턴스 = 새로운 SingletonExample ();
        인스턴스 반환;
        }
      }
      공공 무효 printValue () {
        System.out.print (this.value);
      }

      공개 정적 무효 메인 (문자열 [] 인수) {
        SingletonExample 인스턴스 = getInstance ();
        instance.printValue ();
        인스턴스 = getInstance ();
        instance.printValue ();
         }
    }


1

클래스에서 전용 정적 변수를 사용하면 클래스의 정적 내부 클래스가 변수에 도달 할 수 있습니다. 이것은 컨텍스트 보안에 완벽하게 좋습니다.


0

변수가 public static으로 정의되면 모든 클래스에서 클래스 이름을 통해 액세스 할 수 있습니다.

일반적으로 함수는 구현 클래스 이름을 호출하여 액세스 할 수있는 public static으로 정의됩니다.

그 좋은 예는 sleep()Thread 클래스 의 메소드입니다.

Thread.sleep(2500);

변수가 private static으로 정의 된 경우 해당 클래스 내에서만 액세스 할 수 있으므로 클래스 이름이 필요하지 않거나 클래스 이름을 계속 사용할 수 있습니다. private var_name과 private static var_name의 차이점은 private 정적 변수는 클래스의 정적 메소드로만 액세스 할 수 있고 private 변수는 해당 클래스의 모든 메소드로 액세스 할 수 있다는 것입니다 (정적 메소드 제외).

그것의 아주 좋은 예는 변수를 private static으로 선언 해야하는 데이터베이스 연결 또는 상수를 정의하는 동안입니다.

또 다른 일반적인 예는

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}

0

Java를 처음 사용하지만 많은 사람들이 생각 하듯이 정적 변수를 사용하는 한 가지 방법은 클래스의 인스턴스 수를 계산하는 것입니다. 예 :

public Class Company {
    private static int numCompanies;

    public static int getNumCompanies(){
        return numCompanies;
    }
}

그런 다음 sysout을 수행 할 수 있습니다.

Company.getNumCompanies();

클래스의 각 인스턴스에서 numCompanies에 액세스 할 수도 있지만 (완전히 이해하지는 못하지만) "정적 방식"이 아닙니다. 이것이 최선의 방법인지 아닌지는 모르겠지만 나에게는 의미가 있습니다.


0

*) 변수가 private로 선언되면 클래스 외부에서 볼 수 없으며이를 데이터 숨김이라고합니다.

*) 변수가 static으로 선언되면 변수의 값이 모든 인스턴스에 대해 동일하며 해당 변수를 호출하기 위해 객체를 만들 필요가 없습니다.

classname.variablename;


0

전용 정적 변수는 하위 클래스에서도 공유됩니다. 하나의 서브 클래스에서 변경 한 경우 다른 서브 클래스에서 변경된 값을 가져 오면 예상 한 값이 아닐 수 있습니다.

public class PrivateStatic {

private static int var = 10;
public void setVar(int newVal) {
    var = newVal;
}

public int getVar() {
    return var;
}

public static void main(String... args) {
    PrivateStatic p1 = new Sub1();
    System.out.println(PrivateStatic.var);
    p1.setVar(200);

    PrivateStatic p2 = new Sub2();
    System.out.println(p2.getVar());
}
}


class Sub1 extends PrivateStatic {

}

class Sub2 extends PrivateStatic {
}

0

ThreadLocal변수는 일반적으로로 구현됩니다 private static. 이러한 방식으로 클래스에 바인딩되지 않으며 각 스레드는 자체 "ThreadLocal"객체에 대한 자체 참조를 갖습니다.


3
이 답변을 이해하지 못합니다. 무슨 소리 야?
H.Rabiee

-1

다음 예에서는 eyePersonB에 의해 변경되지만 leg동일하게 유지됩니다. 개인 변수 메소드 에 자신복사 하여 원래 값이 동일하게 유지되기 때문입니다. 개인 정적 값 공유 할 모든 메소드에 대해 하나의 사본 만 있으므로 값을 편집하면 원래 값이 변경됩니다.

public class test {
private static int eye=2;
private int leg=3;

public test (int eyes, int legs){
    eye = eyes;
    leg=leg;
}

public test (){
}

public void print(){
    System.out.println(eye);
    System.out.println(leg);
}

public static void main(String[] args){
    test PersonA = new test();      
    test PersonB = new test(14,8);
    PersonA.print();    
}

}

> 14 3

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.