정적 멤버

맥모닝·2023년 11월 8일
0

Java

목록 보기
4/7

정적 멤버(클래스 멤버)

💡 Kotlin : companion object로 생성된 멤버로, 클래스 당 하나의 값을 가지며 인스턴스를 생성하지 않고도 클래스 내부 정보에 접근해야 하는 필드와 메소드를 관리할 때 사용하는 객체로서, 해당 클래스가 로드되면 초기화가 이루어진다.

  • static이라는 키워드가 붙은 필드(전역 변수) 또는 메소드가 정적 멤버이다.

정적 멤버 선언

  • 정적 필드 : static 타입 필드 [= 초기값]; static int a
  • 정적 메소드 : static 리턴 타입 메소드([매개 변수]) { .. } static void sum() { .. }

정적 필드

  • static으로 생성된 필드(전역 변수)는 static이라는 메모리 영역에 저장되어 프로그램이 종료될 때까지 메모리상에 남아있는다.
  • 따라서 몇 개의 인스턴스를 생성하든 클래스 당 단 1개의 값을 갖는다.
public class StaticMemberEx01 {
    static int a; // 정적 필드
    int b; // 인스턴스 필드

    StaticMemberEx01(int a, int b) {
        this.a = a; // 매개값 할당
        this.b = b;
    }

    public String print() {
        String value = "a : " + a + ", b : " + b;
        return value;
    }

    public static void main(String[] args) {
        StaticMemberEx01 sm = new StaticMemberEx01(1, 2);
        StaticMemberEx01 sm1 = new StaticMemberEx01(2, 3);
        StaticMemberEx01 sm2 = new StaticMemberEx01(3, 4);

        System.out.println(sm.print()); // a : 3, b : 2
        System.out.println(sm1.print()); // a : 3, b : 3
        System.out.println(sm2.print()); // a : 3, b : 4
    }
}
  • static을 붙이는 가장 중요한 이유는 공유를 하기 위해서이고 쉽게 호출하기 위해서이다.
  • 공유의 의미는 여러 인스턴스들이 동일한 데이터를 사용해야 할 때를 의미하고 쉽게 호출한다는 것은 인스턴스를 생성하지 않고 클래스로 바로 접근(클래스.변수명)이 가능하도록 하는 것을 의미한다.
import java.util Scanner;

class Circle {
    static /*final*/ double PI = 3.14; // 정적 필드
}

public class StaticMemberEx02 {
    public static void main(String[] args) {
        System.out.println("반지름을 입력하시오.");
        Scanner sc = new Scanner(System.in);
        
        double r = sc.nextDouble();
        System.out.println("원 둘레 : " + 2 * r * Circle.PI);
        System.out.println("원 넓이 : " + r * r * Circle.PI);
        System.out.println("원 부피 : " + 4 / 3 * r * r * r * Circle.PI);
    }
}

정적 메소드

  • 정적 메소드 또한 정적 필드와 사용하는 이유는 동일하다. 공유를 목적으로 하고 호출하기가 쉽다. 인스턴스 생성 없이 클래스로 호출(클래스.메소드명();)이 가능하다.
    • 따라서 인스턴스들의 데이터와 관계없이 동일한 로직(메소드)을 사용해야 할 때 정의를 해주는게 좋다.
  • 주의사항
    1. 정적 메소드에서는 정적 필드만 사용이 가능하고 정적 메소드만 호출이 가능하다.
      • 즉, 인스턴스 멤버를 사용하려면 인스턴스를 생성 후 호출해야 한다.
    2. this 키워드를 사용할 수 없다.
    3. 메소드 오버라이딩이 불가능하다.
class A {
    int instanceField = 1; // 인스턴스 필드
    static int staticField = 1; // 정적 필드

    public void instanceMethod() { // 인스턴스 메소드
        this.instanceField = 1; // this 사용 가능
        instanceField = 1; // 인스턴스 필드 사용 가능
        staticField = 1; // 정적 필드 사용 가능
    }

    public static void staticMethod() {
        // this.instanceField = 5; // this 사용 불가(컴파일 에러)
        // instanceField = 1; // 인스턴스 필드 사용 불가(컴파일 에러)
        staticField = 1; // 정적 필드 사용 가능
    }

    public class StaticMemberEx03 {
        public static void main(String[] args) {
            A.staticField = 1; // A클래스 정적 필드 사용 가능
            // A.instanceField = 1; // A클래스 인스턴스 필드 사용 불가(필요시 인스턴스 생성 후 호출)
            A.staticMethod(); // A클래스 정적 메소드 사용 가능
            // A.instanceMethod(); // A클래스 인스턴스 메소드 사용 불가(필요시 인스턴스 생성 후 호출)
        }
    }
}

참고 사이트

profile
필요한 내용을 공부하고 저장합니다.

0개의 댓글