[Java] 인스턴스 변수 vs 클래스 변수

2022. 1. 7. 22:19·TIL/Java
728x90
반응형

클래스 변수란?

지금까지는 인스턴스에 해당되는 '인스턴스 변수'와 '인스턴스 메소드'를 사용했습니다.

 

Person p1 = new Person("문종모", 25, 50000);
BankAccount a1 = new BankAccount(100000);

a1.setOwner(p1);      // a1에 대한 인스턴스 메소드
a1.withdraw(20000);   // a1에 대한 인스턴스 메소드

 

하지만, 인스턴스에 해당되지 않고, 클래스에 해당되는 '클래스 변수'도 존재합니다. 이 둘의 차이점을 정확히 이해해야, 좋은 객체 지향 코드를 작성할 수 있습니다. '클래스 변수'가 무엇인지, '인스턴스 변수'와는 어떻게 다른지, 같은 기능을 두 가지 방식으로 구현해 보면서 알아봅시다.

 

인스턴스 변수 버전

현재는 Person 클래스에 count라는 인스턴스 변수가 있습니다. count는 현재 총 몇 개의 Person 인스턴스가 있는지 보관합니다.

public class Person {
    int count;
}

 

그런데 새로운 Person 인스턴스를 생성할 때마다 각 인스턴스의 count 변수를 바꿔줘야 하는 굉장히 번거로운 작업을 해야합니다.

 

public static void main(String[] args) {
    Person p1 = new Person();
    p1.count++;

    Person p2 = new Person();
    p1.count++;
    p2.count = p1.count;

    Person p3 = new Person();
    p1.count++;
    p2.count++;
    p3.count = p2.count;

    Person p4 = new Person();
    p1.count++;
    p2.count++;
    p3.count++;
    p4.count = p3.count;

    System.out.println(p1.count);
    System.out.println(p2.count);
    System.out.println(p3.count);
    System.out.println(p4.count);
}

 

 

4
4
4
4

 

클래스 변수 버전

이런 문제를 해결할 수 있는 게 바로 클래스 변수입니다. 클래스 변수를 정의하기 위해서는 static이라는 키워드를 붙여주면 됩니다.

public class Person {
    static int count;
}

 

이제 count는 특정 인스턴스에 해당되는 게 아니라, Person 클래스 전체에 해당되는 것입니다. 따라서 count를 부를 때는 대문자로 쓴 클래스 이름을 사용해서 Person.count를 써주면 됩니다.

 

public static void main(String[] args) {
    Person p1 = new Person();
    Person.count++;

    Person p2 = new Person();
    Person.count++;

    Person p3 = new Person();
    Person.count++;

    Person p4 = new Person();
    Person.count++;

    System.out.println(Person.count);
}

 

4

 

그런데 아직도 반복적인 코드가 많습니다. Person.count++를 매번 해줘야 한다는 것인데요. 반복적인 코드는 안 좋은 것이기 때문에 개선시킬 방법이 필요합니다. 새로운 인스턴스를 생성할 때마다 Person.count를 1씩 늘려주고 있습니다. 그러면 아예 생성자에 이 줄을 넣으면 됩니다.

 

public class Person {
    static int count;

    public Person() {
        count++;
    }
}

 

public static void main(String[] args) {
    Person p1 = new Person();
    Person p2 = new Person();
    Person p3 = new Person();
    Person p4 = new Person();

    System.out.println(Person.count);
}

 

4

 

이런 식으로 변수가 클래스 자체에 해당될 때에는 static을 써서 클래스 변수로 만들어주면 된다. 

 

+ 클래스 변수의 용도(22.01.16)

  • 인스턴스에 따라서 변하지 않는 값이 필요한 경우(ex. pi > 이런 경우 final을 이용해서 상수로 선언하는 것이 바람직하다)
  • 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
  • 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우

 

상수

final을 공부할 때 상수를 보긴 했지만, 상수를 더 상수답게 쓰려면 static과 함께 쓰는 것이 좋다. 상수는 인스턴스에 해당되는 것이 아니며, 여러 복사본 대신 한 값만 저장해두는 것이 맞기 때문입니다.

상수 이름은 보통 모두 대문자로 쓰고, 단어가 여러 개인 경우 _로 구분 짓습니다.

 

public class CodeitConstants {
    public static final double PI = 3.141592653589793;
    public static final double EULERS_NUMBER = 2.718281828459045;
    public static final String THIS_IS_HOW_TO_NAME_CONSTANT_VARIABLE = "Hello";

    public static void main(String[] args) {
        System.out.println(CodeitConstants.PI + CodeitConstants.EULERS_NUMBER);
    }
}

 

5.859874482048838
728x90
반응형

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

[Java] 단위 변환기  (0) 2022.01.08
[Java] 인스턴스 메소드 vs 클래스 메소드  (0) 2022.01.07
[Java] 예외(Exception) - 코드 안전하게 만들기(try-catch 예외 처리)  (0) 2022.01.07
[Java] 변수를 안전하게 만드는 법: final  (0) 2022.01.07
[Java] 기본형vs참조형 / null 퀴즈  (0) 2022.01.07
'TIL/Java' 카테고리의 다른 글
  • [Java] 단위 변환기
  • [Java] 인스턴스 메소드 vs 클래스 메소드
  • [Java] 예외(Exception) - 코드 안전하게 만들기(try-catch 예외 처리)
  • [Java] 변수를 안전하게 만드는 법: final
야리니
야리니
오늘보다 내일 더 성장하는 개발자가 되기 위한 야리니 블로그입니다 :)
    반응형
    250x250
  • 야리니
    야리니의 step by step
    야리니
  • 링크

    • GitHub
    • Linkedin
  • 전체
    오늘
    어제
    • 분류 전체보기 (482) N
      • TIL (381) N
        • Java (97)
        • Kotlin (28)
        • JPA (16)
        • Spring (37)
        • Oracle (22)
        • JDBC (7)
        • Web(HTML, CSS, JS, jQuery) (90)
        • View Template (31)
        • AWS (7)
        • HTTP (7)
        • CS (6) N
        • Linux, Unix (2)
        • Python (20)
        • Project (1)
      • Trouble Shooting(Error) (39) N
      • Algorithm (15)
      • Git,GitHub (8)
      • Diary (24)
      • 독서 (9)
      • Etc (6)
        • Mac (1)
        • 학원준비과정 (2)
  • 블로그 메뉴

    • 방명록
    • 태그
  • 공지사항

    • 안녕하세요 :)
  • 인기 글

  • 태그

    백엔드 개발자
    java기초
    java
    국비지원학원
    HTML
    oracle
    쌍용교육센터
    CSS
    코틀린
    Kotlin
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
야리니
[Java] 인스턴스 변수 vs 클래스 변수
상단으로

티스토리툴바