[3단원]클래스 멤버 vs. 객체 멤버 = static 멤버 vs. 인스턴스 멤버

클래스와 객체의 구분

  • 생물에게는 나이가 어떻게 되나요
  • 무생물에게는 제조일자가 어떻게 되나요?

위 2가지 질문으로 클래스와 객체를 구분할수 있다는데..

객체와 클래스 차이

  • 객체
    • 실제로 존재하는 유일무이한 실체
    • 특정한 속성에 값을 가지고 있음.
  • 클래스
    • 개념적인 분류 체계
    • 속성 자체에는 값을 가질 수 없다.

예외 상황

  • 하지만..
    • 제리의 꼬리가 몇개?
      • 1개
    • 쥐의 꼬리는 몇개?
      • 1개
    • 미키마우스의 꼬리는 몇개?
      • 1개
    • 모두 답이 한 개이다.
    • 제리미키마우스 는 객체이기에 꼬리 개수에 답이 존재하는 것이 당연하지만..
    • 는 클래스 인데도 꼬리 개수에 대한 답이 존재한다.

    이는 꼬리 개수가 객체의 속성이지만, 모든 객체가 동일한 값을 가지는 경우, 클래스에서도 해당 값을 알 수 있게 되기 때문이다.

  • 그렇다면, 객체마다 모두 같은 값을 가진다고 확신한 순간.
  • 클래스 자체에 해당 값을 저장하는게 메모리적으로 효율적이라고 생각될 수 있다.

클래스에서의 속성의 관리

  • 그렇다면 countOfTail 을 클래스에서 관리한다고 생각해보자!
public class Mouse {
    public String name;
    public int age;
    public static int countOfTail = 1;
    
    public void sing() {
        System.out.println("찍찍");
    }

}
  • T메모리 상의 스태틱 영역에 하나의 저장 공간을 가지게 됨.
public class MouseDriver {
    public static void main(String[] args) {
        
        Mouse.countOfTail = 1;
        
        Mouse mickey = new Mouse();
        Mouse jerry = new Mouse();
        Mouse mightyMouse = new Mouse();
        
        System.out.println("mickey = " + mickey.countOfTail);
        System.out.println("jerry = " + jerry.countOfTail);
        System.out.println("mightyMouse = " + mightyMouse.countOfTail);
        
        System.out.println(Mouse.countOfTail);
    }
}
  • 출력
mickey = 1
jerry = 1
mightyMouse = 1
1

Static 키워드

  • 클래스 멤버
    • 클래스 멤버는 static 키워드를 사용하여 정의됨
    • 이를 통하여 Mouse.countOfTail 같은 형식으로 접근 가능하며
    • main() 메서드도 static 키워드를 포함하므로 클래스 멤버 메서드
    • static 영역에 저장되며, 프로그램의 모든 객체에서 동일한 값 공유
  • 객체 멤버
    • static 키워드 없이 정의
    • 객체 참조변수를 통해 접근
    • 각 객체마다 독립적인 값을 가짐
    • Mouse.java 코드상의 sing() 메서드

정적 멤버와 인스턴스 멤버

  • 클래스 멤버 == static 멤버 == 정적 멤버
  • 객체 멤버 == 인스턴스 멤버

정적 멤버 속성의 활용

  • 사람 클래스의 인구
  • 고양이 클래스의 다리개수
  • 승용차 클래스의 바퀴 개수 등…

이러한 속성들은 모든 객체에서 공통적으로 사용되기에, 정적 멤버로 선언하는 적합지만..

사용할땐 주의해야한다..!

정적 메서드?

  • 객체의 존재여부와 관계없이 사용가능한 메서드

정적 메서드의 특징

정적 메서드의 독립성

  • 정적 멤버들은 객체보다 클래스에 속해 있음.
  • 따라서, 객체의 존재 여부에 관계없이 사용가능
  • JVM 구동시 T 메모리의 정적 영역 == 클래스 영역 == static 영역 에 바로 배치됨

메인 메서드의 특성

  • main() 메서드는 JVM 이 시작할 때 호출되는 진입점
  • JVM 구동 시 객체는 존재하지 않기에, main() 메서드는 정적 메서드여야함.

정적 메서드의 활용

  • 함수 분할
    • main() 메서드의 로직을 여러 함수로 나누어 관리하는 경우
  • 접근자와 설정자 메서드
    • 정적 변수를 위한 getter | setter 메서드로 활용가능
  • 유틸리티성 메서드
    • 인스턴스 생성 없이 메서드를 사용하려는 경우
    • Math 클래스의 수학관련 정적 메서드들

UML 상의 정적 변수 혹은 메서드

  • 정적 속성의 메모리 할당
    • T 메모리 스태틱 영역에 클래스가 배치될 시, 메모리 공간이 확보됨

다양한 변수의 유형 및 용어

  • 용어의 혼용
    • 클래스 멤버 == 정적 멤버 == 스태틱 멤버
    • 객체 멤버 == 오브젝트 멤버 == 인스턴스 멤버
    • 필드 == 속성 == 프로퍼티
    • 함수 =?= 메서드 (사실상 혼용임)
    • 변수 공간 =?= 메모리 공간
  • 지역 변수와 초기화
    • 지역 변수
      • 스택 영역에 저장
      • 초기화되지 않는 경우 쓰레기 값이 저장됨
      • 자바 컴파일러는 지역변수 초기화를 무조건 강제함
    • 멤버 변수와 초기화
      • 멤버 변수는 클래스 || 객체에 속함
      도의 초기화 없이도 기본값으로 설정됨
      • 왜??
        • 멤버 변수가 다수의 메서드나 객체 내에서 공유됨.
        • 객체 변수는 객체 내에서
        • 클래스 변수는 프로그램 어디서든 접근 가능한 공유 변수로 동작

변수의 유형

이름다른 이름사는 곳(T 메모리)
static 변수클래스 [멤버] 속성, 정적 변수, 정적 속성스태틱 영역
인스턴스 변수객체[멤버] 속성, 객체 변수힙 영역
local 변수지역변수스택 영역(스택 프레임)

Uploaded by N2T