▸JAVA/기본 문법

Static, Final의 의미와 사용법

코데방 2019. 12. 10.
728x90

이전 글에서 다룬 접근 제한자와 Static, Final 개념만 알면 이제 변수와 메소드 생성에 대해서는 걱정할 필요가 없을 것 같습니다. C언어에서는 타입만 지정해주는 것에 반해 Java에서 이렇게 앞에 제한자들이 많은 이유는 역시 객체지향언어에서는 객체들을 서로 이어주는 인터페이스 부분의 기능이 많기 때문 입니다. 아직 클래스와 인스턴스의 개념이 헷갈리시는 분들은 아래 링크 글을 참조하시면 됩니다.

 

2019/12/09 - [JAVA/기본상식] - 클래스, 인스턴스, 객체의 차이

 

 


 

[ Static ]

  • C언어의 전역변수와 정적(static)변수가 합쳐지고 확장된 개념
  • C언어의 전역변수 : 해당 파일의 모든 함수에서 공유하는 변수
  • → Java의 Static : 접근제한자로 접근이 가능한 범위 내의 모든 곳에서 공유하는 필드와 메소드
  • C언어의 정적변수 : 특정 함수 내에서 생성된 변수, 프로그램 종료시까지 유지됨
  • → Java의 Static 변수 : 특정 클래스 내에서 생성된 필드와 메소드, 프로그램 종료시까지 유지됨

※ 필드란?

필드는 클래스가 가지고 있는 변수를 의미합니다. 메소드 안에 들어 있는 지역변수와는 조금 다릅니다. 기본적으로 클래스 내의 모든 메소드에서 접근할 수 있고, 접근 제한자가 허용한다면 다른 클래스나 패키지에서도 접근이 가능한 변수입니다.

 


 

이전 글에서 클래스는 컴퓨터 안에 있는 양식지에 불과하고 이를 인쇄해서 인스턴스 형태로 만들어야 실제로 사용이 가능하다고 했습니다. 하지만 Static 필드와 메소드는 약간 다릅니다.

Static의 의미는 접근 가능(접근 제한자) 범위 내에 있는 모든 클래스에서 해당 필드나 메소드를 공유한다는 뜻입니다. 즉, 인쇄물이 처음부터 한 장밖에 없고 더 이상의 복사를 허용하지 않는다는 것입니다. 인쇄물이 한 장밖에 없으므로 벽에다가 붙여둡니다. 누가 보거나 수정하게 되면 언제나 원본이 변경됩니다. 반대로 Static이 아닌 경우 복사본을 여러 개 생성해서 쓰기 때문에 각자의 종이를 수정하더라도 원본이나 다른 사람의 것에는 영향을 미치지 않습니다.

따라서 새로운 인스턴스를 생성할 때는 클래스 내의 Static 필드나 메소드는 복사하지 않습니다. 최초에 Static이 들어 있는 클래스가 로드되면 그 때 Static 필드나 메소드들은 따로 메모리에 올라가게 됩니다. 그냥 간단히 Static을 쓰면 인스턴스로 복사를 못하고 딱 하나만 생성돼있기 때문에 바로 호출해서 쓴다고 생각하면 됩니다.

 

 

반대로 Static을 쓰지 않은 경우는 컴퓨터 속에 양식지(클래스)만 있는 상태고 실제 종이가 없습니다. 이 경우에는 인쇄(인스턴스 생성)를 꼭 해줘야 사용이 가능합니다.

참고로 Static 필드와 메소드의 경우 인스턴스와 다르게 프로그램 종료시까지 메모리에 상주하고 있기 때문에 너무 많이 사용하면 그만큼 성능이 저하될 수 있습니다. 인스턴스의 경우 C언어처럼 우리가 직접 Free시켜주는 기능은 없지만 JVM의 '가비지 컬렉터(청소부)'가 주기적으로 사용을 다 한 인스턴스를 메모리에서 지워 줍니다.

 


 

[ Final ]

  • C언어의 Const 또는 매크로('#define)과 비슷하지만 확장된 개념
  • Final 변수 : 변수 값을 변경할 수 없음
  • Final 클래스 : 상속이 불가
  • Final 매소드 : 오버라이딩 (자식 클래스에서 메소드의 실행내용을 바꾸는 것) 불가

Final은 간단하게 "못 바꾸게 막아둔다"라는 의미입니다. 변수의 경우 값이 될 것이고, 메소드의 경우 실행내용(정의)가 됩니다. 클래스의 경우 상속을 못하게 막아둡니다. 예를 들어 남한테 제가 짠 코드를 가져다 쓸 수 있게 public 클래스로 하나 생성해서 알려줬는데, 그 친구가 얍삽하게 제가 짠 코드를 그대로 상속받아 쓰는게 밉다면 해당 클래스에 final을 걸어버리면 됩니다. 상속이 불가해지는 것이죠.

728x90

'▸JAVA > 기본 문법' 카테고리의 다른 글

애노테이션(annotation)  (0) 2019.12.10
추상 (abstract) 클래스와 메소드  (0) 2019.12.10
클래스 상속 (extends)  (0) 2019.12.10
생성자와 this  (0) 2019.12.10
접근 제한자 (Public, Protected, Default, Private)  (0) 2019.12.10

댓글

💲 추천 글