자료구조

+) [JAVA] static변수, static메서드, 일반 변수/메서드 차이점 이해하기

나는나는용 2023. 5. 6. 09:51
728x90

일반 변수 & static 변수

편하게 생각하자면, static변수는 모오오오오든 객체에서 이 값을 공유하는 즉, 공용주방냉장고 라고 생각하면 된다.
'셰어하우스에서 내 방 냉장고에서 꺼내먹은 라면 - 일반'
'셰어하우스 공용주방 냉장고에서 꺼내먹은 라면 - static'

 

일반 method & static method

  • 일반: 객체를 만들어줘야 호출이 가능하고, 일반변수와 static변수 둘 다 사용가능.
  • static: 객체를 사용하지 않아도 되지만, static변수만 호출 가능.

<값의 변경>

객체2에서 '객체2.static변수A'의 값을 바꿔주면, 객체1에서의 '객체1.static변수A'의 값도 바뀐다.
객체2에서 '객체2.일반변수B'의 값을 바꿔줘도, 객체1에서의 '객체1.일반변수B'의 값은 그대로이다.

 

예시

package staticExam;

public class staticExample {

    int month = 4;
    static int date = 19;

    // static 메서드~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // static 메서드이기 때문에 객체 사용하지 않아도 사용 가능함.
    static void birth() {

        // static메서드에서는 static 변수만 호출할 수 있다. -> month 호출 불가
        // System.out.println(month);

        // date는 static변수이므로 호출할 수 있다.
        System.out.println("태어난 날짜는 " + date);
    }

    // 그냥 메서드~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public void birthDate() {
        // 일반 메서드에서는 일반 변수와 static 변수 둘 다 사용 가능
        System.out.println("객체를 만들어줘야 호출 가능" + month + date);
    }

    public static void main(String[] args) {
        User user1 = new User();
        User user2 = new User();

        User.name = "상우"; 
        // 일단 초기화는 상우로 되어있으니까 둘 다 상우라고 나옴
        System.out.println(user1.name); // 상우
        System.out.println(user2.name); // 상우

        // 1만 인경이라고 바꿔줬으나 name은 static이므로 2도 인경이라고 바뀜
        user1.name = "인경";
        System.out.println(user1.name); // 인경
        System.out.println(user2.name); // 인경

        // user1의 age는 1로, user2의 age는 2로 초기화
        user1.age = 1;
        user2.age = 2;
        // 각각 초기화한 값으로 나올 것
        System.out.println(user1.age); // 1
        System.out.println(user2.age); // 2

        // user1의 age를 바꿔도 user2의 age는 바뀌지 않음.
        user1.age = 12;
        System.out.println(user1.age); // 12
        System.out.println(user2.age); // 2

        // user2의 age를 바꿔도 user1의 age는 바뀌지 않음.
        user2.age = 24;
        System.out.println(user1.age); // 12
        System.out.println(user2.age); // 24

        // static 메서드는 객체를 만들어주지 않아도 호출 가능.
        birth();
        // 그냥 메서드는 객체를 만들어줘야 호출 가능.
        // birthDate();
        staticExample sE = new staticExample();
        sE.birthDate();
    }
}

class User {

    static String name;
    int age;
    String school;
}
728x90