사이먼's 코딩노트

[Java] static 본문

Java/Java

[Java] static

simonpark817 2024. 3. 12. 23:41

[static]

  • 이번에는 static에 대해서 같이 알아봅시다.
  • static은 정적이라는 고정된 의미를 가지고 있고 static 이라는 키워드를 사용하여 static 변수와 static 메서드를 만들 수 있다.
  • static으로 정의된 변수나 메서드는 객체에서 해당 변수와 메서드를 관리하는 것이 아니라 클래스 자체에서 관리를 한다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용이 가능하다.
  • 여기서 말하는 클래스의 로딩은 객체를 생성하지 않고 바로 클래스를 통한 변수 또는 메서드 호출을 의미한다.
  • static으로 정의된 정적 멤버들은 힙 영역이 아닌 static 영역에 메모리가 할당된다.
  • 간단하게 말해서 모두가 공유할 수 있는 범주(공공재)의 변수나 메서드라면 static을 붙히는 것이 좋다.
  • 종합적으로 static으로 정의된 변수와 메서드는 객체가 생성될 때 마다 추가되는 것이 아니라 클래스를 생성할 때 오직 직 하나만 가지고 상속된 클래스나 해당 클래스에서 모두 공유가 가능하다.

 

  • 아래의 예시 코드를 통해 static의 역할을 자세히 살펴봅시다.
public class Main {
    public static void main(String[] args) {
        System.out.println(수학.PI);

        System.out.println(수학.더하기(10, 20));
        // 출력 : 30
    }
}

class 수학 {
    static double PI = 3.141592;
    static int 더하기(int a, int b) {
        return a + b;
    }
}
  • Main 메서드에서 출력문을 통해 바로 수학.PI 변수와 수학.더하기(10,20) 메서드를 호출하였다.
  • 우리가 기존에 객체를 이용하여 변수나 메서드를 호출하려면 new를 통한 객체를 생성하고 해당 인스턴스 변수에 값을 저장했었다.
  • 위 코드처럼 객체 생성없이 클래스를 통한 변수와 메서드를 호출할 때 해당 정적멤버 타입 앞에 static을 작성한다.
  • 현재 PI 인스턴스 변수는 static으로 정의되어 있고 해당 변수는 모두가 하나의 의미로 공유가 가능하다.
  • 더하기() 메서드도 마찬가지로 static으로 정의되어 있고 해당 메서드는 모두가 하나의 의미로 공유가 가능하다.
  • 간단하게 말해 PI(원주율)값이나 더하기() 연산방법은 고정되어 있기 때문에 static을 적용하는 것이다.
  • 만약 더하기() 의 연산방법을 다르게 한다면 해당 메서드에 static을 적용하는 것은 올바른 방법이 아니다.

 

  • static과 관련된 문제를 간단하게 하나만 풀어봅시다.
  • 주어진 코드에서 각각의 사람이 올바른 자기소개를 하도록 코드를 완성해봅시다.
public class Main {
    public static void main(String[] args) {
        사람 a사람1 = new 사람();
        a사람1.이름 = "홍길동";
        a사람1.나이 = 22;

        a사람1.자기소개();
        // 출력 : 저는 22살 홍길동 입니다.

        사람 a사람2 = new 사람();
        a사람2.이름 = "홍길순";
        a사람2.나이 = 25;

        a사람2.자기소개();
        // 출력 : 저는 25살 홍길순 입니다.

        a사람1.자기소개();
        // 출력 : 저는 22살 홍길동 입니다.
    }
}

 

  • 추가된 사람 클래스만 작성하여 보여드립니다. (나머지는 수정된 부분이 없습니다.)
class 사람 {
    String 이름;
    int 나이;

    void 자기소개() {
        System.out.println("저는 " + 나이 + "살 " + 이름 + " 입니다.");
    }
}
  • Main 메서드에서 a사람1, a사람2 라는 래퍼런스 변수를 선언하고 사람 객체와 연결하였다.
  • 추가된 사람 클래스에는 인스턴스 변수로 이름과 나이를 가지고 있고 자기소개() 메서드도 생성하였다.
  • a사람1과 a사람2에 연결된 각 인스턴스 변수의 값은 모두 다르다.
  • 만약 사람 클래스의 이름과 나이 변수를 선언할 때 static을 작성하였다면 Main 메서드를 실행했을 때 출력문에서 마지막 a사람1.자기소개() 를 호출하면 "저는 25살 홍길순 입니다." 가 출력될 것이다.
  • 그 이유는 생각보다 간단하다. 변수 선언할 때 static을 작성하면 해당 변수를 고정값으로 만든다는 뜻이고 모든 객체 변수가 공유된 하나의 static 변수를 사용한다는 뜻이기 때문이다.
  • 만약 각 인스턴스 변수에는 그냥 자료형 타입을 사용해서 변수를 사용하고 자기소개() 메서드 앞에 static을 작성하면 해당 프로그램는 에러가 발생할 것이다.
  • 그 이유는 자기소개() 메서드는 공공재 역할로 모두에게 공유된 하나의 메서드인데 해당 메서드 안의 출력문을 보면 나이와 이름을 호출하는데 모든 사람의 나이와 이름은 같지 않기 때문에 해당 값을 가져올 수가 없기 때문이다.
  • 만약 static를 꼭 쓰고 싶다면 변수들과 메서드에 모두 써야만 프로그램이 에러가 발생하지 않을 것이다.
  • 다시 말해 Java에서 static 메서드 내에서는 직접적으로 static 변수가 아닌 인스턴스 변수들은 사용할 수 없다.

 

반응형

'Java > Java' 카테고리의 다른 글

[Java] 형변환(래퍼클래스 / Object)  (0) 2024.03.13
[Java] 문자열을 다루는 String 클래스 메서드  (2) 2024.03.13
[Java] super / final / switch  (0) 2024.03.12
[Java] 생성자 문제풀이  (0) 2024.03.12
[Java] 문제풀이(2)  (0) 2024.03.11