모르는게 많은 개발자

[JAVA] final, static 키워드 정리 본문

자바

[JAVA] final, static 키워드 정리

Awdsd 2020. 7. 19. 23:29
반응형

이번 포스팅에서 final, static에 대해 정리해보려 한다.


1. final

final 키워드는 변수, 메소드, 클래스에 사용할 수 있다.

변수
  • 변수에 final 키워드를 붙이면 그 변수는 한번만 초기화 가능 및 수정 불가능
public class Main {
    public static void main(String[] args){
        final int a = 1;		//1로 초기화
        final int b;
        b = 2;		//b를 선언하고 2로 초기화
        a = 2;      //이미 선언되었기 때문에 Error
    }
}
  • 클래스 변수에 final을 사용하면 생성자를 통해 값을 할당 가능
public class Sample {
    private final int test;
    private int test1;
    
    //생성자를 통해 값할당
    public Sample(int test){
        this.test = test;
        this.test1 = test1;
    }
    
    //set함수를 통해 값할당 불가능
    public void setTest(int test){
        this.test = test;		//Error
    }
    
    public void setTest1(int test1) {
        this.test1 = test1;
    }
}
  • 객체 변수에도 final을 사용하면 한번만 객체 할당이 가능
  • 할당된 객체의 값을 변경가능
public class Main {
    public static void main(String[] args){
        final Sample sample = new Sample(1, 2);
        sample = new Sample(1, 2);		//Error 
        sample.setTest1(3);			//final이라도 할당된 객체의 값은 변경 가능
    }
}
메소드
  • 메소드에 final을 붙이게 되면 그 메소드는 오버라이드가 불가능
  • 메소드의 기능을 수정하지 못하게 할 때 사용
public class Sample {
    public Sample(){
    }
    public final void print(){
    }
}
public class SampleSub extends Sample{

    public SampleSub(){
        super();
    }
    
    //override가 안되기 때문에 Error
    public void print(){
    }
}
클래스
  • 클래스에 final을 사용하면 그 클래스는 상속이 불가능
public final class Sample {
    public Sample(){
    }

}
public class SampleSub extends Sample{    //에러

    public SampleSub(){
        super();
    }
}

2. static

static을 쓴다는 것은 static을 사용한 필드의 메모리 할당을 컴파일 시간에 한다는 뜻

static 멤버 변수
  • 클래스의 변수에 static을 붙이게 되면 해당 클래스의 인스턴스들은 이 변수의 메모리를 공유
  • 클래스 멤버라고도 불림
  • 인스턴스를 생성하지 않고 사용가능 (ex: class.변수)
public class Main {
    public static void main(String[] args){
        Sample b = new Sample();
        Sample c = new Sample();

        b.print();		//static 변수 1증가
        c.print();
    }
}
public class Sample {
    public static int a = 1;

    public void print(){
        System.out.println(a);
        a++;
    }
}

출력
1
2
static 메소드
  • 클래스 메소드라 불림
  • 클래스이름을 통해 실행 가능 (ex: class.메소드이름)
  • static변수와 마찬가지로 인스턴스 생성없이 실행 가능
  • static메소드에서는 일반 변수를 사용할 수 없음
  • 오버라이드 불가능
public class Main {
    public static void main(String[] args){
        Sample.print();
        Sample.print();
    }
}
public class Sample {
    public static int a = 1;
    public static void print(){
        System.out.println(a);
        a++;
    }

}

출력
1
2

 

반응형
Comments