관리 메뉴

공부한것들을 정리하는 블로그 입니다.

final과 static의 용도 및 용어정리(변수, 메소드, 클래스) 본문

JAVA/공부

final과 static의 용도 및 용어정리(변수, 메소드, 클래스)

호 두 2017. 7. 30. 18:16
반응형



1.  static 용어정리(정적변수, 정적메소드)



먼저 자바의 정적변수와 정적메소드에 대한 용어들부터 살펴보겠습니다.



        • 정적 변수

= static variables(static fields)

= class variables

= 클래스 변수

예제)   static int a;



        • 정적 메소드

= static methods

= class methods

= 클래스 메소드

예제)   static void move( ) {...}



정적 변수와 정적 메소드를 통틀어서 Static Members 라고 하기도 한다. 이렇게 정리하고 보니 우리가 흔히 쓰는 일반 변수와 일반 메소드도 여러가지 다른 용어로 많이 쓰이는데 말나온김에 비교할겸 적어보기로 하겠다.



        • 일반 변수

= instance variables

= 인스턴스 변수

= 멤버 변수

= 필드 변수

예제)   int a;



        • 일반 메소드

= instance methods

= 인스턴스 메소드

= 멤버 메소드

= 필드 메소드

예제)   void move( ) {...}










2. final과 static의 용도




기존의 코드를 유지보수하다 보면 

static과 final이 변수, 메소드, 클래스에 다양하게 사용되어 있는것을 발견하실 수 있을겁니다(가령 final로 선언되어 있는 클래스라던가..)

이때 기존 코드 개발자의 주석없이도 작성 의도를 파악하려면 static과 final의 기능을 파악하고 있는것이 좋습니다.



요약 : 


  • final은 상속불가 또는 불변의 상수 선언에 사용됨


  • final 변수 : 
  1. final로 선언된 변수는, 값의 초기화만 가능하고 그 값의 변경 및 새로운 할당이 불가능한 상수가 됨(반드시 초기화 해 주어야함).
  2. 일반적으로 final이 붙은 상수 변수는 static을 함게 붙여서 사용함.
  3. final 상수로 선언된 변수에 값을 넣어주면 error가 발생함.


  • final 클래스: 
  1. 상속 불가 클래스를 의미.
  2. 클래스에 붙는 예약어로 final과 abstract은 함께 사용할 수 없음(abstract클래스 : abstract 메소드가 1개 이상인 클래스) : abstract는 추상클래스를 생성할 때 사용하므로 상속이 강제적이므로 상속 불가를 나타내는 final과는 쓸 수 없음.


  • final 메소드: 
  1. final메소드가 포함 된 클래스를 부모로 상속받은 자식클래스는, 해당 final메소드(부모클래스의 메소드)를 오버라이딩을 통해 재정의 할 수 없음(메소드가 불변성을 띄게 됨).






  • static은 공용의 변수를 만들때 사용하는 예약어


  • static변수 : 
  1. static변수는 클래스변수가 된다(클래스의 모든 객체가 공유할 수 있게됨 : 일반적인 멤버변수는 하나의 객체 내에서만 전역 변수처럼 사용됨)
  2. static변수는 클래스 객체의 생성 없이도 호출하여 사용할 수 있음 : 

다른 클래스에서 접근하려는 경우에는 [ 클래스명.static변수명 ] 의 형태로 접근 가능


클래스명.a=100;   //객체생성없이 클래스명으로 정적변수에 접근가능

객체명.a=100;   //물론 객체생성후 얻은 인자로도 정적변수에 접근가능


클래스명.move( );   //객체생성없이 클래스명으로 정적메소드에 접근가능

객체명.move( );   //물론 객체생성후 얻은 인자로도 정적메소드에 접근가능



  • static 클래스: 
  1. 상속 불가 클래스를 의미.


  • static 메소드: 
  1. static메소드는 클래스메소드가 된다. 어느 객체의 내용에도 의존적이지 않은 하나의 작업을 수행하기 때문(일반적으로 main메소드가 static으로 선언됨 : public static void main(String[] args){} )
  2. static메소드가 포함 된 클래스를 부모로 상속받은 자식클래스는, 해당 static메소드(부모클래스의 메소드)를 오버라이딩을 통해 재정의 할 수 없음(final메소드와 비슷하지만, static메소드는 메소드 숨김이 일어난다).
  3. static메소드는 클래스메소드답게, 객체의 레퍼런스를 통한 call이 아닌 클래스의 이름으로 메소드를 호출할 수 있음(static변수와 유사)

  • static 초기화블록: 
  1. 클래스에서 static 키워드만을 사용하여 초기화 블록으로 사용 가능. 이때 static 초기화블록은 클래스가 초기화 될 때 수행되고, main()메소드보다 먼저 수행됨( : static{} -> main(){} )

  • static import: 
  1. 다른 클래스에 존재하는 static 멤버들을 불러와서 사용하기 위해 선언( : import static PackageName.ClassName.StaticMemberName   또는  import static PackageName.ClassName.*)




출처 : 

http://ojava.tistory.com/m/50

http://unabated.tistory.com/entry/용어정리





오늘 작성내용은 final과 static에 관한 내용입니다.


우선적으로 final과 static의 일반적인 쓰임에 대해서 보면

final은 상속불가 또는 변할 수 없는 상수 선언에 사용되고, static은 공용의 변수를 만들 때 사용되는 예약어라서 

완전 반대의 성격을 띄고 있어 보이는데 이 두가지 예약어가 사용되는 형태가 어떠한지 어떻게 사용해야 하는 지 알아봅시다.

 


 

final

final의 사용범위는 크게 세 가지입니다. 

변수와 메소드, 그리고 클래스에 사용할 수 있습니다.

 



가장 먼저 제일 많이 사용되는 부분인, 변수 선언에서의 final!

final이라는 뜻이 가지고 있는 것처럼 ‘마지막’ 값이 되도록 만들어 줍니다.

final로 선언된 변수는 값을 초기화만 할 수 있고, 그 값의 변경 및 새로운 할당이 불가능 한 상수가 됩니다. 

(반드시! 초기화하여야 합니다.)


일반적으로 final이 붙은 상수 변수는 static을 함께 붙여서 사용합니다.

 

public class Test {

static final int thisIsFinal = 10;

static int notFinal = 15;


public static void main (String [] args) {

    thisIsFinal = 50;   // 여기서 문제가 발생합니다.

          notFinal = 5;

}

}



위와 같이 정의되어 있는 경우에는

final 상수로 선언한 thisIsFinal에는 값의 새 할당이 불가능하기 때문에

thisIsFinal = 50; 의 라인에서 에러가 발생하게 됩니다.


에러의 내용은 다음과 같습니다.


ð  Test.java:6: cannot assign a value to final variable thisIsfinal

 


 



다음은 클래스명 앞에 final을 붙여서 사용하는 final 클래스

클래스에 final을 사용하게 되면 상속 불가 클래스를 의미합니다.

 

사용방법은 

[final] [접근제한자클래스명

 

Final 클래스를 상속받으려는 클래스는 컴파일 시 다음과 같은 에러가 발생합니다.

ð  Cannot inherit from final class

 

또한 class에 붙는 예약어로는 final과 abstract를 함께 사용할 수 없습니다.

Final은 상속 불가를 나타내는데, abstract는 추상 클래스를 생성할 때 사용하는 내용이므로 

상속이 필수적 (상속 강제) 이기 때문에 서로 배타적인 내용이 됩니다. 

따라서 이 역시 final, abstract를 함께 사용하게 되면 컴파일 시에 에러가 발생합니다.

ð  Illegal combination of modifiers : abstract and final

 






마지막 final의 사용 영역은 final 메소드입니다.

메소드에 final을 선언하게 되면 그 메소드가 포함된 클래스를 상속받은 클래스에서 

오버라이딩을 통해 재정의 할 수 없는 메소드가 됩니다. 이 역시 final 메소드에 오버라이딩을 시도할 경우 에러가 발생합니다.

 

class PapaClass {

int age = 40;


final String name() {

                   return “아빠!”;

}

}


public class FatherClass extends PapaClass {

String name() { // 여기서 에러 발생

return “아버지~”;

}

}



ð  FatherClass.java:10: name() in FatherClass cannot override name() in PapaClass; overridden method is final

 

 




static

static 역시 세 가지의 용도로 사용됩니다.

 



먼저 익숙하게 사용하고 있는 static 변수의 사용형태에 대해서 봅시다.

일반적인 멤버 변수는 하나의 객체 내에서만 전역 변수처럼 사용되지만, 

static이 붙은 변수는 클래스의 모든 객체가 공유할 수 있다고 해서 클래스 변수라고도 불립니다.

또한 static 변수는 클래스 객체의 생성 없이도 호출하여 사용할 수 있다는 장점이 있습니다. 

다른 클래스에서 접근하려는 경우에는, static 변수가 존재하는 클래스 명 뒤에 

점 (.) 을 찍고 static 변수의 명을 써주면 접근이 가능합니다.

 

 



static 메소드도 존재합니다.

static이 붙은 메소드 역시 클래스 메소드로 불리기도 합니다. 

이는 어느 객체의 내용에도 의존적이지 않은 하나의 작업을 수행하기 때문인데요. 

static이 선언된 메소드는 오버라이딩 되지 않고 메소드 숨김이 일어나 상속 받은 클래스에서 사용이 불가능합니다.

클래스 메소드라고 불리는 static 메소드답게, 객체의 레퍼런스를 통한 call이 아닌 클래스의 이름으로 메소드를 호출할 수 있습니다.

 

 



static 초기화블록 (static initial block) 의 형태도 static의 한 형태입니다.

클래스에서 static 키워드만을 사용하여 초기화 블록으로 사용할 수 있습니다.

static 초기화 블록은 클래스가 초기화 될 때 수행되고, main() 메소드보다 먼저 수행된다는 것이 큰 특징입니다.

프로그램 실행 시, 가장 먼저 수행되는 것은 main으로 알고 있었는데

그보다 먼저 수행되는 내용이 있을 수 있다는 것이 신기했습니다~

 

static {

 // 초기화 할 내용 선언

 // main() 보다도 더 먼저 수행되는 내용이 들어갑니다.

}




그리고 추가적으로 static의 사용 형태에 대해서 알게 된 내용이라 덧붙여 써봅니다.


STATIC IMPORT

static import는 다른 클래스에 존재하는 static 멤버들을 불러와서 사용하기 위해 선언합니다. 

이전에 클래스명.static멤버명 과 같이 사용했다면, static import를 통해서 불러왔기 때문에 

클래스명과 점을 통한 호출이 필요 없이 바로 사용할 수 있게 됩니다.


ex) import static packageName.ClassName.staticMemberName


위와 같이 불러들일 특정 static 멤버만을 지정해도 되고,


ex) import static packageName.ClassName.* 

위와 같이 * 를 사용하여 모든 static 멤버를 불러와도 됩니다.



반응형
Comments