Java에서 클래스 변수와 인스턴스 변수의 차이점은 무엇입니까? [닫은]


16

Java를 처음 접했고 클래스 변수와 인스턴스 변수의 차이점을 이해하고 싶습니다.

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

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

인스턴스 변수와 클래스 변수는 어떻게 다른가요? 여기에 어떤 변수가 클래스 변수이고 어떤 변수가 인스턴스 변수입니까? 이것이 범위에 어떤 영향을 미칩니 까?


1
Java ™ 학습서 : 클래스 멤버 이해 하기를 읽기 시작 했지만이 내용을 완전히 이해하지는 못했습니다.

답변:


35

둘 다 멤버 변수이므로 클래스와 연관되어 있습니다. 물론 둘 사이에는 차이점이 있습니다.

인스턴스 변수 :

이러한 변수 는 클래스인스턴스에 속하므로 객체입니다. 그리고 해당 클래스 (객체)의 모든 인스턴스에는 해당 변수의 자체 사본이 있습니다. 변수에 대한 변경 사항은 해당 클래스의 다른 인스턴스에 반영되지 않습니다.

public class Product {
    public int Barcode;
}

클래스 변수 :

이들은 정적 멤버 변수 라고도하며 해당 클래스의 모든 인스턴스와 공유되는 해당 변수의 사본은 하나뿐입니다. 해당 변수가 변경되면 다른 모든 인스턴스는 변경 효과를 보게됩니다.

public class Product {
    public static int Barcode;
}

전체 예 :

// INSTANCE VARIABLE
public class Main {

    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.Barcode = 123456;

        Product prod2 = new Product();
        prod2.Barcode = 987654;

        System.out.println(prod1.Barcode);
        System.out.println(prod2.Barcode);
    }
}

public class Product {
    public int Barcode;
}

출력은 다음과 같습니다.

123456

987654

이제 인스턴스 변수를 정적으로 만들어 클래스 변수로 변경하십시오.

//CLASS VARIABLE
public class Main {

    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.setBarcode(123456);
        Product prod2 = new Product();
        prod2.setBarcode(987654);

        System.out.println(prod1.getBarcode());
        System.out.println(prod2.getBarcode());
    }
}

public class Product {

    public static int Barcode;

    public int getBarcode() {
        return Barcode;
    }

    public void setBarcode(int value){
        Barcode = value;
    }
}

정적이 아닌 메소드를 사용 Barcode하여 클래스가 아닌 객체에서 호출 할 수 있는 값을 가져오고 설정했습니다 . 출력은 다음과 같습니다.

987654

987654


왜 Java 질문에 대한 C # 예제입니까?
Basile Starynkevitch

내 생각은 정확히. 나는 C #이 아닌 Java 프로그래밍 만 알고 있으므로 많은 도움을받지 못했다
Skylar Adams

1
@BasileStarynkevitch 저는 주로 C # 개발자이며 원칙은 둘 다를 고려하고 동일하기 때문에 C # 예제를 빨리 제공했습니다. :) 내 예제를 Java로 변경했습니다.
Abbas

2
@SkylarAdams 죄송합니다. Java를 아는 사람이 C #을 알고 있다고 너무 빨리 가정했습니다. 예제를 Java로 변경했는데 도움이되기를 바랍니다.
Abbas

9
이런 종류의 질문에 대해서는 Java를 사용하든 C #을 사용하든 상관 없습니다.
Thomas Junk

6

여기에 설명되어 있습니다 ( Bicycle클래스 변수 가있는 예제 클래스 사용)numberOfBicycles 와 인스턴스 변수 cadence, speed, gearid)

때로는 모든 객체에 공통적 인 변수를 원할 수도 있습니다. 이것은 static수정자를 사용하여 수행됩니다 . static선언에 수정자가있는 필드를 정적 필드 또는 클래스 변수라고합니다. 그것들은 어떤 객체가 아니라 클래스와 관련이 있습니다. 클래스의 모든 인스턴스는 클래스 변수를 공유하며 메모리의 고정 된 한 위치에 있습니다. 모든 객체는 클래스 변수의 값을 변경할 수 있지만 클래스의 인스턴스를 만들지 않고도 클래스 변수를 조작 할 수도 있습니다.

클래스 변수 (선언 static)는 모든 인스턴스에 공통적 인 위치입니다.

이 예에서 numberOfBicycles클래스 변수는 선언되었으므로static ). 모든 인스턴스와 클래스에 공통적 인 변수 (예 : 위치)는 하나뿐입니다. 수정 그래서 만약 numberOfBicycles하나의 방법으로, 다른 방법은 (심지어 다른 새로운 값을 참조 할 Bicycle객체)

대조적 gearid아르 인스턴스 변수는 (자신의 어떠한 선언이 없으므로 static개질제). 모든 Bicycle개체는 고유 한 개체를 가지고 있습니다. gear일부 Bicycle a에 대해 수정 하고 b 가 다른 인스턴스 인 경우 수정 해도 a.gear아무런 영향을 미치지 않습니다.b.gear

각 Java 객체는 일부 메타 데이터 (예 : 클래스에 대한 일부 참조) 및 자체 인스턴스 변수 (아마 수퍼 클래스에서 상 속됨)가있는 별개의 메모리 영역입니다. 그러나 클래스 변수는 클래스에 공통적이며 모든 인스턴스가 공유합니다.

객체 (컴퓨터 과학)인스턴스 변수 위키 페이지를 참조하십시오 .


4

인스턴스 변수 :

  • 인스턴스 변수는 클래스에서 선언되지만 메소드, 생성자 또는 블록 외부에 선언됩니다.
  • 인스턴스 변수는 클래스의 인스턴스에 속하거나 인스턴스 변수가 객체에 속한다고 말할 수 있습니다.
  • 인스턴스 변수에는 클래스의 각 인스턴스마다 별도의 값이 있습니다.

    Class InstanceDemo {
    
         // this instance variable is visible for any child class.
           public String name = "Testing";
    
         // count variable is visible in Demo class only.
           private int count = 2;
    }

인스턴스 변수에 액세스하는 방법 :

InstanceDemo demo = new InstanceDemo ();

System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );

출력 : 2, 테스트

클래스 변수 :

  • 클래스 변수는 클래스에 속합니다.
  • 클래스 변수는 변수 앞에 "정적"키워드를 추가하여 생성됩니다.
  • 정적 변수라고도합니다.
  • 그리고 가장 중요한 클래스 변수는 클래스의 인스턴스 객체가 존재하지 않더라도 클래스의 모든 인스턴스에 대해 단일 공유 값을 유지합니다.

        Class ClassDemo {
    
         // count variable is Same for all instance of this class
           public static int count = 2;
    }

클래스 변수에 액세스하는 방법 :

System.out.println("Access Class variable: " + ClassDemo.count );
//class variable is directly refer with class name

출력 : 2

클래스 변수와 인스턴스 변수의 간략한 차이점 :

  • 인스턴스 변수에는 클래스의 각 인스턴스마다 별도의 값이 있습니다. 클래스 변수는 해당 클래스의 인스턴스 객체가 존재하지 않더라도 클래스의 모든 인스턴스에 대해 단일 공유 값을 유지합니다.
  • static 키워드를 사용하여 인스턴스 변수를 클래스 변수로 변경합니다.
  • 인스턴스 변수와 클래스 변수는 모두 메소드가 아닌 클래스 레벨에서 선언됩니다.

3

class variablesinstance변수 의 차이점은 의 문제입니다 who knows what?.

instance variable알려진 (=되어 바인딩 이에) 구체적인 예 - 따라서 이름.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
  }

클래스의 정의는 콘크리트 객체를 만들기 위한 청사진 과 같습니다 . 아마도이 시점 약간 혼란 스럽습니다 . 그러나 이런 식으로 작성하면 모든 변수가 구체적인 객체에 바인딩됩니다. 모든 사람은 자신의 firstName을있다

반면 class variable에 A 는 이름에서 알 수 있듯이 클래스의 모든 구성원에게 알려져 있습니다. 또는 기술적으로 : 클래스 수준 에서 알려 지거나 제한 됩니다 . 전형적인 예는 것입니다 카운터 , 그것은 매우 문제가 예를 들어 있지만 - 얼마나 많은 개체를, 당신이 만든의 그러나이 초기 단계에서는 중요하지 않습니다.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
       static int numberOfPersons = 0
  }

numberOfPersons선언 static사이에 distingush하는 키워드 인 class variablesinstance variabes. 변수는 클래스 정의 내의 다른 변수와 같이 선언됩니다. 그러나 static키워드는 다르다는 신호를 보냅니다.

  • firstName, lastName있는 인스턴스 변수는 그 구체적인 인스턴스에 바인딩

  • numberOfPersons 모든 인스턴스가이 변수에 액세스 할 수 있도록 클래스에 바인딩됩니다.

tl; dr

변수가 정의되는 장소는 클래스 정의입니다.

클래스 변수는 클래스 수준에 알려져 있거나 바인딩되어 있습니다. 즉, 각 구체적인 인스턴스에 액세스 할 수 있습니다. 클래스 변수를 정의하려면 keyword를 사용하십시오 static.

인스턴스 변수는 인스턴스 레벨에서만 알려져 있습니다. 당신은없이 그들을 정의static키워드 .

Java에 대한 추가 문서는 여기에 있습니다.

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