본문 바로가기
Spec UP - Backend/나도코딩의 자바기본편

Chap_07. Final

by TIS_Ha 2023. 5. 2.
반응형

변수 앞에 final을 붙여서 상수로 선언할 수 있다.

Constants 상수 = 변하지않는 값

https://nossodia.tistory.com/186

 

Chap_01. 자료형과 변수

DataTypes 자료형 문자형, 숫자형, 불린(참/거짓) Variables 변수 int, double, float, long char, String boolean Comments 주석 //한줄 주석 (단축키 ctrl+/ ) /* 여러줄 주석 */ (단축키 ctrl + shift + / ) Constants 상수 변수 앞

nossodia.tistory.com

이번 시간에는 final을 이용하는 사례에 대해 알아보자.

final 변수 : 변수 값 변경 불가

final 메소드 : 메소드 오버라이딩 불가

final 클래스 : 해당 클래스 상속 불가

 

final의 위치 (public > abstract > static > final > ... )

ㄴpublic (final) class , public (final) void


Camera (부모) - ActionCam(자식) 클래스 예제를 이용하여 Final 에 대하여 이해해보자.

ActionCam 클래스를 생성하여 Camera 클래스를 상속받도록 선언하였다.

ActionCam은 아래와 같이 설정하였다.

  • lens 는 "광각렌즈"이다.
  • super() : 부모클래스인 Camera의 생성자를 불러와서 this.name = "액션카메라"로 설정하였다.
  • makeVideo() 메소드 생성 -> "액션카메라 : 비디오를 제작합니다" 출력

_17_Final 클래스를 생성하여 ActionCam 객체의 recordVideo()와 makeVideo() 메소드를 실행하면

각각 "액션카메라 : 동영상을 녹화합니다."와 "액션카메라: 비디오를 제작합니다"가 출력된다.

 


이번에는 위의 makeVideo() 메소드에서 어떤 렌즈로 촬영했는지도 함께 출력하도록 수정해보자.

이 때 actionCam.lens 값을 "표준렌즈"로 수정 후 makeVideo() 메소드를 실행하면 아래와 같이 변경된 값으로 렌즈 값이 출력된다. 

"액션카메라: 표준렌즈로 촬영한 영상을 통해 비디오를 제작합니다."

만약 위와 같이 렌즈의 값을 "표준렌즈"로 바꾸지 못하도록, 즉 광각렌즈로 고정되도록 하고싶다면 Final을 활용하는 방법이 있다.

public final String lens = "광각렌즈";

위와 같이 String lens 변수 앞에 final을 선언하게 되면 변하지않는 값으로 설정된다.

다른 클래스에서 actionCam.lens 값을 수정하려고 하면 오류가 발생되는 것을 확인할 수 있다.

final 로 선언하는 경우에는 해당 상수를 선언할 때 초기값을 설정하거나, 생성자 메소드 내에서 초기값을 설정할 수 있다.


이번에는 ActionCam 클래스의 자식클래스로 SlowActionCam 클래스를 생성하여 테스트해보자.

SlowActionCam 클래스에서 부모 클래스인 ActionCam의 makeVideo() 메소드를 오버라이딩하여 "슬로우모드"를 추가하였다.

그리고 slowActionCam 객체의 makeVideo() 메소드를 실행하면 "슬로우 모드 비디오를 제작합니다"가 정상 출력된다.

여기서 makeVideo() 메소드를 슬로우비디오로 만들수 없도록, 즉 오버라이딩을 못하도록 하고싶은 경우에 Final을 활용할 수 있다.

 

public final void makeVideo(){
        System.out.println(this.name + ":"+this.lens+"로 촬영한 영상을 통해 비디오를 제작합니다.");
}

위와 같이 ActionCam 클래스의 makeVideo 메소드 앞에 final을 선언하면 해당 메소드는 오버라이딩이 불가능하다.


상속 자체를 못하도록 클래스를 막아버리는 방법도 있다.

public final class ActionCam extends Camera { ... }

클래스 선언 시 앞에 final을 함께 선언하면 해당 클래스를 상속 받을 수 없게된다.

반응형

댓글