non-static 멤버와 static 멤버

GoldenDusk·2023년 11월 25일
0

CS지식

목록 보기
18/26
post-thumbnail

1. non-static 멤버와 static 멤버

객체 지향 프로그래밍에서 클래스와 객체를 설계하고 관리하는 데 중요

non-static 멤버(instance 멤버)

  1. 객체 별로 다른 상태 유지: 각 객체는 non-static 멤버의 복사본을 가지고 있으므로, 각 객체는 서로 다른 상태를 유지할 수 있습니다. 예를 들어, Dog 클래스의 name 필드가 non-static이면, 각 Dog 인스턴스는 서로 다른 이름을 가질 수 있다.
  2. 메모리 사용: 인스턴스 멤버는 객체가 생성될 때마다 메모리에 할당된다. 따라서 많은 객체를 생성하면 그만큼 더 많은 메모리가 사용된다.
  3. 접근 방법: non-static 멤버는 객체의 인스턴스를 통해서만 접근할 수 있다. 즉, 먼저 객체를 생성한 후, 해당 객체를 통해 멤버에 접근한다.
Dog myDog = new Dog();
myDog.bark(); // non-static 메소드 호출

🍈 공간적 특성

  • 객체마다 다른 상태 유지
  • 해당 멤버는 객체마다 별도로 존재한다.
  • 인스턴스 멤버라고 부른다.
  • 각 객체는 non-static 멤버의 복사본을 가지고 있으므로, 각 객체는 서로 다른 상태를 유지할 수 있다. 예를 들어, Dog 클래스의 name 필드가 non-static이면, 각 Dog 인스턴스는 서로 다른 이름을 가질 수 있다.

🍈 시간적 특성

  • 객체 생성시 멤버가 생성된다.
  • 객체가 생성될 때, 멤버가 생성되므로 객체 생성 후에 멤버 사용이 가능.
  • 객체가 사라지면 해당 멤버도 사라진다.

🍈 공유의 특성

공유되지 않는다.

  • 멤버는 객체 내에 각각 독립된 공간을 유지하므로 공유되지 않는다.

🍈 Non-static 멤버 (인스턴스 멤버) 선언

Non-static 멤버는 클래스의 각 인스턴스에 속한 멤버로, 객체를 생성할 때마다 각 객체에 별도로 할당된다. 이들은 static 키워드 없이 선언되며, instanceFieldinstanceMethod는 non-static 멤버이므로, MyClass의 각 인스턴스는 이들의 자체 복사본을 가지게 된.

javaCopy code
public class MyClass {
    // Non-static 필드
    int instanceField;

    // Non-static 메소드
    void instanceMethod() {
        // ...
    }
}

static 멤버(class 멤버)

  1. 클래스 단위로 공유: static 멤버는 해당 클래스의 모든 인스턴스에 의해 공유된다. 클래스 당 하나만 존재하기 때문에, 한 인스턴스에서 static 멤버의 값을 변경하면, 그 변경사항이 모든 인스턴스에 영향을 미친다.

  2. 메모리 효율성: static 멤버는 프로그램이 시작할 때 한 번만 메모리에 할당되고, 모든 인스턴스에서 공유되기 때문에 메모리 사용 면에서 더 효율적일 수 있다.

  3. 접근 방법: static 멤버는 클래스 이름을 통해 직접 접근할 수 있으므로, 객체를 생성하지 않고도 사용할 수 있다.

    Dog.bark(); // static 메소드 호출 => 생성하지 않아도 사용 가능
  4. 생명주기: static 멤버는 클래스가 메모리에 로드될 때 생성되고, 프로그램이 종료될 때까지 남아있다. 따라서 애플리케이션의 생명주기와 밀접하게 연결되어 있다.

🍈 공간적 특성

  • 해당 멤버는 클래스 당 하나만 생성된다.
  • 해당 멤버는 객체 내부가 아닌 별도의 공간에 생성된다.
  • 클래스 멤버라고 부른다.

🍈 시간적 특성

클래스 로딩 시에 멤버가 생성된다.

  • 객체가 생성되기 전에 이미 생성되므로 객체를 생성하지 않고도 사용 가능.
  • 객체가 사라져도 해당 멤버가 사라지지 않는다.
  • 해당 멤버는 프로그램이 종료될 때, 사라진다.

🍈 공유의 특성

  • 동일한 클래스의 모든 객체들에 의해 공유된다
  • 하나의 클래스로부터 생성된 여러 객체가 공유한다.

**Static 멤버 (클래스 멤버) 선언**

public class MyClass {
    // Static 필드
    static int staticField;

    // Static 메소드
    static void staticMethod() {
        // ...
    }
}

위 예에서 staticFieldstaticMethod는 static 멤버이므로, MyClass의 모든 인스턴스가 이들을 공유한다. 이 멤버들은 클래스 이름을 통해 직접 접근할 수 있다 (예: MyClass.staticMethod()).

사용 상의 고려사항

  • 상태 의존성: 객체의 상태에 의존하는 멤버는 non-static으로 선언하는 것이 적합하다.
  • 유틸리티나 공유 자원: 공통된 기능이나 공유 자원을 제공하는 멤버는 static으로 선언하는 것이 좋습니다. 예를 들어, 유틸리티 메소드나 상수 값은 보통 static으로 선언된다.
  • 메모리 관리: 불필요하게 많은 객체를 생성하지 않도록 주의하고, 필요한 경우 static 멤버를 사용하여 메모리를 효율적으로 관리해야 한다.

사용 예시

public class MyClass {
    int instanceField; // Non-static 필드
    static int staticField; // Static 필드

    void instanceMethod() {
        // 인스턴스 메소드에서는 인스턴스 필드와 static 필드 모두 접근 가능
        instanceField = 5;
        staticField = 10;
    }

    static void staticMethod() {
        // Static 메소드에서는 static 필드만 직접 접근 가능
        // instanceField = 5; // 이 코드는 오류를 발생시킴
        staticField = 10;
    }
}

public class TestClass {
    public static void main(String[] args) {
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();

        obj1.instanceField = 5;
        obj2.instanceField = 10;

        // obj1과 obj2는 instanceField에 대해 서로 다른 값을 가짐
        System.out.println(obj1.instanceField); // 5 출력
        System.out.println(obj2.instanceField); // 10 출력

        MyClass.staticField = 15;

        // 모든 인스턴스는 staticField에 대해 같은 값을 공유
        System.out.println(MyClass.staticField); // 15 출력
        System.out.println(obj1.staticField); // 15 출력
        System.out.println(obj2.staticField); // 15 출력
    }
}
profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글