[Java]

[Java] static, final

Jarvis2304 2022. 12. 29. 12:04

▶ static 멤버

- 멤버들의 생명 주기(life cycle)와 사용 범위(scope)를 지정하는 방식

 

● 생명 주기(life cycle) - 멤버가 생성되고 삭제는 되는 주기

● 사용 범위(scope) - 멤버들의 사용 범위

 

▶ static 멤버

- 객체를 생성하지 않고도 사용할 수 있는 멤버

- 객체마다 생기는 것이 아님

- 클래스당 하나만 생성됨 (클래스 멤버라고도 부름) 

● static 멤버 특성

- 공간적 특성: static 멤버들은 클래스 당 하나만 생성

- 시간적 특성: static 멤버들은 클래스가 로딩될 때 공간 할당

- 공유의 특성: static 멤버들은 클래스의 모든 객체에 의해 공유

 

 

 

▶ non-static 멤버

- 객체가 생길 때, 객체마다 생성되는 멤버

- 각 객체마다 하나씩 생성됨 (인스턴스 멤버라고도 부름)

● non-static 멤버 특징

- 공간적 특성: 멤버들은 객체마다 독립적으로 별도 존재

- 시간적 특성: 필드와 메소드는 객체 생성 후 비로소 사용 가능

- 비공유의 특성:  멤버들은 여러 객체에 의해 공유되지 않고 배타적

 

 

 

▷ static 멤버와 non-static 멤버 비유

static 멤버(공기) - 어떤 사람(객체)이 태어나기전에 이미 존재, 모든 사람이 공유, 자신이 죽은 후에도 공기

(static 멤버는 계속 존재 (클래스 로딩시에 멤버 생성, 객체가 사라져도 계속 존재, 프로그램이 종료되때 사라짐)

 

non-static(사람의 눈) - 눈은 사람(객체)이 태어날 때 같이 생성되며 죽으면 함께 소멸

(non-static 멤버들은 객체가 생길 때 함께 생성되고, 객체가 소멸할 때 함께 소멸)

 

 

 

▶ non-static 멤버와 static 멤버의 차이

 

 

 

 

▷ static 멤버를 객체의 멤버로 접근하는 사례

- static 멤버 mf()는 s1, s2 두 객체가 생성되기 이전에 이미 생성됨

- s1과 s2객체가 생성될 때 인스턴서 멤버인 n, g(), h()만 객체마다 생성됨

 

 

 

▷ static 멤버를 클래스 이름을 접근하는 사례

 

 

 

▷ static의 활용

1) 전역 변수와 전역 함수를 만들 때 활용

- 자바의 캡슐화 원칙 지킴

- 클래스 내부에 구현해야 함

- 다른 클래스에서 공유하는 전역 변수나 전역 함수가 필요한 경우 static이 캡슐화 원칙을 지키면서(반드시 클래스 내부에 구현 해야하기때문) 이러한 문제해결

 

● static 멤버를 가진 클래스 사례

- java.lang.Math 클래스

- JDK와 함께 배포되는 java.lang.Math 클래스

- 모든 필드와 메소드가 public static 으로 선언

- 다른 모든 클래스에서 사용할 수 있음

 

 

 

 

2) 공유 멤버를 작성할 때

-  static 필드나 메소드 하나만 생성, 클래스의 객체를 공유

 

 

 

▷ static 메소드의 제약 조건 1

● static 메소드는 오직 static 멤버만 접근 가능 (non-static 멤버 접근x)

- 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에, no-static 메소드와 필드 사용 불가

 

 

 

▷ static 메소드의 제약 조건 2

● static 메소드는 this 사용불가

- static 메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하므로, 현재 객체를 가리키는 this 레퍼런스 사용불가

 

 

예제) static을 이용한 달러와 우리나라 원화 사이의 변환예제

 

 

 

▶ final 

- final 키워드는 클래스, 메소드, 필드 3가지에서 사용

 

● final 클래스 - 더 이상 클래스 상속 불가능

 

 

● final 메소드 - 더 이상 오버라이딩 불가능

 

 

final 필드 - 상수 선언

- final로 필드를 선언하면 필드는 상수가됨

 

-상수 필드는 선언 시에초기 값을 지정해야함

-상수 필드는 실행 중 값을 변경할 수 없음