인스턴스 멤버와 정적 멤버

Hyun·2023년 3월 17일
0

자바 문법

목록 보기
2/8

인스턴스 멤버

  • 객체에 소속된 멤버
  • 객체가 있어야만(객체를 생성해야만) 사용할 수 있다

정적 멤버

  • 클래스에 고정적으로 위치하는 멤버
  • 독립적인 요소로 딱 하나만 생성되어 "공유" 된다(메모리 절약, 호출 용이)
    => 공유되므로 내용이 변경되면 변경된 내용이 공유됌
  • 객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능하다
  • static 키워드를 추가해주면 된다

예시)
Num 클래스에 static 변수 stNum을 선언해주고, Main 클래스에서 해당 정적 변수 값을 변경한다음

Sub 클래스의 정적 메서드를 호출하여 변경된 값이 나오는 것을 확인함으로써 정적 멤버의 값이 공유되는것을 알 수 있다.

(들어가기 앞서)
처음에 Main 클래스에서 main 함수를 호출하여 정적 필드값을 변경한 후, 다시 Sub 클래스에서 다시 main 함수를 호출하여 해당 정적 필드값을 출력해보니 변경되지 않아 이상함을 느꼈다.

알고보니 main 함수가 각각 호출되어 서로 다른 프로세스가 동작하여 Sub에서 main 함수를 호출했을때 이전 프로세서(Main 클래스에서의 main 함수 호출)의 결과가 반영되지 않기 때문에 처음 값이 나왔던 것이다. 별개의 프로세스라 메모리도 다르다. 애초에 말이 안되는 것이었다.

이후 Sub 클래스에서 해당 정적 필드값을 출력하는 정적 메서드를 선언하고 Main 클래스에서 해당 정적 메서드를 호출하니 정상적으로 변경된 정적 필드값이 나오는 것을 확인할 수 있었다.

src/Num

public class Num {
    //인스턴스 멤버
    int insNum;

    //정적 멤버
    static int stNum = 300;

    //인스턴스 메서드
    int insPlus(int x, int y){
        return x + y;
    }

    //정적 메서드
    static int stPlus(int x, int y){
        return x + y;
    }
}

src/Sub

public class Sub {
    static void printStNum(){
        System.out.println("현재 정적 필드 stNum 값: " + Num.stNum);
        return;
    }
}

src/Main

public class Main {
    public static void main(String[] args) {

        //객체 생성 없이 먼저 인스턴스 멤버 사용해보기 => 에러 발생
        //System.out.println(Num.insNum); 
        //System.out.println(Num.insPlus);

        //인스턴스 멤버 사용, 먼저 객체(인스턴스) 생성해야 함
        Num numClass = new Num();

        System.out.println("인스턴스 필드 insNum: " + numClass.insNum);//인스턴스 멤버 출력 => 기본값인 0 출력됨
        numClass.insNum = 500;
        System.out.println("인스턴스 필드 insNum: " + numClass.insNum);//500 출력됨
        System.out.println("인스턴스 메서드 insPlus: " + numClass.insPlus(4,6));//인스턴스 메서드 호출

        //정적 멤버 사용
        System.out.println("정적 필드 stNum: " + Num.stNum);
        System.out.println("정적 메서드 stPlus: " + Num.stPlus(4,6));

        //정적 필드 값 변경
        Num.stNum = 500;
        System.out.println("정적 필드 stNum 값 변경: " + Num.stNum);
        System.out.println("변경된 정적 필드 stNum: " + Num.stNum);//다른 클래스의 정적 메서드 호출
    }
}

결과값 출력

이미지 출처
네이버 블로그 Morph's House

profile
better than yesterday

0개의 댓글