리셋 되지 말자

5일차-클래스 멤버 vs 객체 멤버 = static 멤버 vs 인스턴스 멤버 본문

Java(폐지)/Java 공부

5일차-클래스 멤버 vs 객체 멤버 = static 멤버 vs 인스턴스 멤버

kyeongjun-dev 2020. 7. 15. 19:31
  • 클래스와 객체를 간단히 구분하는 법은 '질문'을 하는것이다.
    -> 생물인 경우 "나이가 어떻게 되세요?"
    -> 무생물인 경우 "제조일자가 어떻게 되나요?"
    객체는 유일무이하게 존재하는 실체이기 때문에 속성에 값을 가지고 있고, 클래스는 개념이면서 분류 체계일 뿐이므로 속성에 값을 가질 수 없다. 그런데 아래와 같은 경우가 있다.
  • 미키마우스의 꼬리의 개수는?
  • 제리의 꼬리의 개수는?
  • 쥐의 꼬리의 개수는?
    위의 세 질문에 대한 답은 '한 개'이다. 미키마우스, 제리는 객체이므로 답이 있는게 당연하다. 그런데 쥐는 클래스 임에도 답이 있다.
    꼬리 개수는 객체의 속성이지만 모든 객체가 같은 값을 가지고 있기에 클래스를 통해 질문해도 갯수가 한개이다. 이런 경우를 T 메모리에서 살펴보면

- Mouse클래스로부터 나온 객체들 모두 같은 값을 갖는 'countOfTail'속성이 있다. 이럴 경우 Mouse 객체 수만큼 각각의 'countOfTail'이라는 메모리 공간이 필요하게 되는데 아래와 같이 '클래스의 모든 객체가 같은 값을 가지고 있는' 것처럼 클래스에 값을 저장할 수 있다.

- 이를 위한 java 코드는 아래와 같다.

package abstraction;

public class Mouse {
    public String name;
    public int age;
    public static int countOfTail = 1;

    public void sing() {
        System.out.println(name+"찍찍!!");
    }
}

- 이렇게 클래스를 구성하면, 'countOfTail' 속성은 T 메모리의 스태틱 영역에 단 하나의 저장 공간을 갖게 된다. 이 속성에 접근하기 위해서는 '객체_참조_변수.countOfTail'로 접근할 수 있으며 클래스를 이용해 '클래스명.countOfTail'로도 접근할 수 있다. 아래는 테스트 코드와 결과

package abstraction;

public class MouseDriver {
    public static void main(String[] args) {
        //클래스명이 Mouse -> 클래스명.countOfTail

        System.out.println("마우스 : " + Mouse.countOfTail);


        Mouse mickey = new Mouse();
        Mouse jerry = new Mouse();
        System.out.println("미키 : " + mickey.countOfTail);
        System.out.println("제리 : " + jerry.countOfTail);

        Mouse.countOfTail = 200;
        // 객체명.countOfTail
        System.out.println("마우스 : " + Mouse.countOfTail);
        System.out.println("미키 : " + mickey.countOfTail);
        System.out.println("제리 : " + jerry.countOfTail);


    }
}
  • 결과

클래스 멤버와 객체 멤버

  • 이렇게 static 키워드가 붙은 속성을 '클래스 멤버 속성'이라고 한다.

  • static 키워드가 붙은 속성은 '객체 멤버 속성'이라고 한다.

  • 속성 뿐만이 아니라 메서드도 static이 붙었는지에 따라 '클래스 멤버 메서드', '객체 멤버 메서드'로 분류한다.

  • main() 메서드는 항상 static 키워드가 붙어있는데, main() 메서드가 클래스 멤버 메서드이기 때문이다.
    -> sing() 메서드는 객체 멤버 메서드이다.

  • 클래스 멤버들은 static 키워드와 함께 사용되고 또 T 메모리의 static 영역에 상주하게 되므로 static(정적) 멤버라고도 한다.(클래스 멤버라는 표현보다는 정적 멤버라는 표현을 더 많이 사용한다.)

  • 객체 멤버들은 객체가 클래스의 인스터스이므로 인스턴스라고도 한다.

정적 멤버 속성

  • 정적 멤버 속성은 위와 같이 해당 클래스의 '모든 객체들이 같은 값을 가질 때' 사용하는 것이 정석이다.
    -> ex) 고양이 클래스의 다리 개수, 승용차 클래스의 바퀴 개수, 보병 클래스의 주특기번호, 남자 클래스의 주민등록번호 성별 코드
  • 반드시 정석으로만 써야만 하는것은 아니지만, 정당한 논리를 가지고 써야한다.

정적 멤버 메서드

  • 정적 메서드는 객체들의 존재 여부에 관계없이 사용할 수 있는 메서드 이므로 이 특성을 잘 고려하여 정적 멤버 메서드를 구성하도록 한다.
  • main() 메서드는 당연히 정적 메서드여야 한다.
  • 실무에서는 클래스의 인스턴스를 만들지 않고 사용하게 되는 유틸리티성 메서드를 주로 정적 메서드로 구성한다.(ex Math 클래스에 있는 수많은 정적 메서드)

UML에서의 정적 멤버 표기

  • UML 표기에서 정적 메서드의 경우, 밑줄로 표시하도록 구정한다.

  • 정적 속성의 경우 T 메모리의 스태틱 영역에 클래스가 배치될 때 클래스 내부에 메모리 공간히 확보되는 것을 볼 수 있다.
    -> 객체 속성은 속성명만 있을 뿐 실제 메모리 공간은 확보하지 않는다.

용어 정리

  • 클래스 멤버 = 정적 멤버 = 스태틱 멤버
  • 객체 멤버 = 인스턴스 멤버 = 오브젝트 멤버
  • 속성 = 프로퍼티 = 필드

지역 변수와 클래스 속성, 객체 속성의 차이

  • 지역 변수는 별도로 초기화를 해주지 않으면 쓰레기 값이 들어가있다.
  • 클래스 속성과 객체 속성은 별도로 초기화를 해주지 않아도 정수형은 0, 실수형은 0.0, 논리형은 false, 객체는 null로 초기화된다.

'Java(폐지) > Java 공부' 카테고리의 다른 글

상속과 인터페이스  (0) 2020.07.16
상속  (0) 2020.07.16
4일차 - 자바와 객체 지향  (0) 2020.07.14
3일차  (0) 2020.07.14
2일차-데이터 저장 영역의 동작  (0) 2020.07.12
Comments