JAVA

[ Java ] - Static과 final 키워드

algml0703 2022. 9. 5. 22:13
반응형

Static

프로그램이 메모리에 적재될 때 데이터 영역의 메모리에 생성된다. 여러 인스턴스가 공유하는 값을 선언할 때는 static을 사용한다. static 키원드를 통해 생성된 변수 등은 static 영역에 할당된다. static으로 선언된 것을 클래스 변수 또는 정적필드라 한다. 정적필드는 해당 클래스명을 통해 접근할 수 있다.

** static으로 선언된 변수는 전역데이터로 클래스로드시 공간을 할당한다.

** static으로 선언된 메서드는 클래스 로딩시 공간을 할당하며, 인스턴스의 생성이 불가하다.

Student 클래스

package staticEx;

public class Student {
	private static int serialNum = 10000;
	int studentID;
	String studentName;
	
	public Student() {
		serialNum++;
		studentID = serialNum;
	}
	

}

StudentTest 클래스

package staticEx;

public class StudentTest1 {
	public static void main(String[] args) {
		Student studentJ = new Student();
		//System.out.println(studentJ.serialNum);
		// 일반적으로 static으로 선언한 것을 인스턴스를 통해 사용하지 않고, 클래스 명으로 사용한다.
		System.out.println(Student.serialNum);
		
		Student studentI = new Student();
		System.out.println(studentJ.studentID);
		System.out.println(studentI.studentID);
	}

}

* 상수의 경우 이름을 대문자로 하는것이 일반적이다.

* static으로 선언한 경우 인스턴스를 생성하지 않고, 클래스명을 통해 해당 값을 참조할 수 있다.

* static으로 선언된 메서드는 인스턴스 필드에는 접근할 수 없고, 정적 필드에만 접근 가능하다.


 

final

기본적으로 final 키워드는 값을 설정 한 후 다른 값으로 재할당하지 못하도록 하는 키워드이다. final 키워드는 클래스, 필드, 메서드, 지역변수, 파라미터에 적용가능한다.

‣ final 변수는 값을 설정한 이후 추가적인 값 변경이 불가능함을 의미한다. final 변수의 초기화는 필드 선언시, 초기화블록에서, 생성자 함수를 통해 3가지 방법이 있다. 어떤 방법으로든 값이 초기화 된 이후에는 다른 값이 할당될 수 없다.
‣ 다만 객체에 final 키워드 적용시 재할당은 불가능하지만 객체 내부의 값은 변경할 수 있다. 
‣ 리스트의 경우에도 재할당은 불가능하지만, add나 remove 등의 내장 메서드를 추가하거나, 지우는 것은 가능하다.
‣ final로 선언한 메서드는 하위클래스에서 오버라이딩이 불가능하다.
‣ final로 선언한 클래스는 상속이 불가능하다.

ex1)

class Person {
	private String personName;
	
	public Person (String personName){
		this.personName = personName;
	}

	public String getPersonName() {
		return personName;
	}

	public void setPersonName(String personName) {
		this.personName = personName;
	}
}

public class Ex {
	public static void main(String[] args) {
		final Person oh = new Person("oh");	
		// oh = new Person("he");
		oh.setPersonName("he");	
	}
}

ex2) 프로젝트에서 여러 파일에서 공유되어야 하며, 고정값으로 사용되는 변수들(즉 상수)의 경우 해당 상수들을 별도의 클래스에 모아 관리할 수 있다.

package template;

class Define {
	public static final int MIN = 1;
	public static final int MAX = 99999;
	public static final int ENG = 1001;
	public static final int MATH = 2001;
	public static final double PI = 3.14;
	public static final String GOOD_MORNING = "Good morning";
}

public class ConstClass {

	public static void main(String[] args) {
		System.out.println(Define.MIN);
		System.out.println(Define.MAX);
		System.out.println(Define.ENG);
		System.out.println(Define.MATH);
		System.out.println(Define.PI);
		System.out.println(Define.GOOD_MORNING);
	}

}

ex3)

public class FinalExam {
    //private final String message = "Final Message";
    private final String message;
    {
        message ="final Message";
    }
    private final String message2;
    public FinalExam(){
        this.message2 = "final Message";
    }

    public final void showMessage() {
        System.out.println(message);
        System.out.println(message2);
    }
    public void showMessage (final String message) {
        //message = "test";
        System.out.println(message);
    }
}

 

* static과 final 키워드가 함께 사용된 변수를 사용자 정의 상수라 하며 한 번 값이 할당된 이후 해당 값을 고정하여 사용할 때 이용된다. 일반적으로 사용자 정의 상수는 INIT_NAME이와 같은 식으로 변수명을 정하게 된다.

출처

https://www.youtube.com/watch?v=TzINBAwTCKc&list=PLOSNUO27qFbtjCw-YHcmtfZAkE79HZSOO&index=13

https://advenoh.tistory.com/13

반응형

'JAVA' 카테고리의 다른 글

[ Java ] - 인터페이스  (0) 2022.09.06
[ Java ] - 추상클래스 / 템플릿 메서드  (0) 2022.09.05
[ Java ] - 상속과 다형성  (0) 2022.09.04
[ Java ] - 이클립스에서 디버깅 하는 법  (0) 2022.09.04
[ Java ] - 배열과 ArrayList  (0) 2022.09.04