안녕하세요! 최근에 불변 객체에 대해서 학습을 하다가, final 키워드에 대한 이해가 부족하다고 판단되 다시 한번 공부를 해보았
습니다.
먼저, final 키워드는 변수(variable), 메서드(method), 또는 클래스(class)에 사용될 수 있습니다.
final 키워드는 위와같이 여러 곳에서 사용될 수 있지만, 공통적으로 가지고 있는 의미가 있는데,
이는 바로 무언가를 제한한다 라는 의미입니다.
먼저, 변수(variable)에 대하여 알아보겠습니다.
변수(variable)
변수에 final을 붙이면 이 변수는 수정할 수 없다는 의미를 가집니다.
하지만, 변수가 기본형 변수냐 아니면, 참조형 변수인 것인가에 따라서 달라집니다.
public class Phone {
final int useAge = 1;
final Screen screen = new Screen(640,480);
// public void setUseAge(int useAge) {
// this.useAge = useAge;
// }
}
public class Screen {
private int horizontalPixels;
private int verticalPixels;
public Screen (int horizontalPixels, int verticalPixels){
this.horizontalPixels = horizontalPixels;
this.verticalPixels = verticalPixels
}
// getter, setter ...
}
setUseAge 메서드는 컴파일 에러가 납니다. 왜냐하면, 변수에 final을 붙였기 때문입니다.
public class PhoneTest {
public static void main(String args[]){
Phone phone = new Phone();
// phone.getUseAge() = 2; -> 컴파일 에러(값에 값 대입 불가)
// phone = new Screen(800,600); -> 컴파일 에러
phone.screen.setHorizontalPixels(1000);
}
}
위의 예에서 알 수 있듯이, 기본형 변수의 경우에 값을 변경하는 것을 불가능합니다.
참조형 변수 역시 참조형 변수가 가리키는 객체는 변경하지 못 합니다.
하지만, 참조형 변수가 가리키는 객체의 값은 변경할 수 있습니다.
정리하자면, final은 수정할 수 없는 범위를 그 변수의 값에 한정하는 것을 알 수 있습니다.
다음으로는 메서드(method)에 대해서 알아보겠습니다.
메서드(method)
메서드에 final을 붙이면 override를 제한할 수 있습니다.
public class Phone {
private final String madeBy;
private final Screen screen;
private int useAge;
public Phone(String madeBy, Screen screen, int useAge) {
this.madeBy = madeBy;
this.screen = screen;
this.useAge = useAge;
}
public final void speech(){
System.out.println(" === ");
}
}
public class FolderPhone extends Phone{
public FolderPhone(String madeBy, Screen screen, int useAge) {
super(madeBy, screen, useAge);
}
@Override
// public void speech(){
// System.out.println(" === ");
// }
}
마지막으로 클래스(class)에 대해서 알아보겠습니다.
클래스(Class)
final 키워드를 클래스에 붙이면 그 클래스는 상속 불가능한 클래스가 됩니다.
public final class Integer extends Number
implements Comparable<Integer>, Constable, ConstantDesc {
}
지금가지 final에 대해서 공부해보았습니다.
모두 열공하세요~
'JAVA' 카테고리의 다른 글
불변 객체(Immnutable Object)란?? (1) | 2023.05.27 |
---|---|
String vs StringBuilder vs StringBuffer (0) | 2023.05.27 |
정적 팩토리 메서드 (1) | 2023.05.23 |
인터페이스 default 메서드와 static 메서드 (0) | 2023.04.27 |
enum 이 자식!! (2) | 2023.03.01 |