[Java] static, final
▶ 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 멤버 m과 f()는 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로 필드를 선언하면 필드는 상수가됨

-상수 필드는 선언 시에초기 값을 지정해야함
-상수 필드는 실행 중 값을 변경할 수 없음
