Java

final

추상이 상속을 강제하는 것이라면 final은 상속/변경을 금지하는 규제다. 이 정도로 final의 용도를 기억해두고 코드를 보자.

final 필드

필드와 변수는 같은 의미라는 것 기억할 것이다. 실행되는 과정에서 한번 값이 정해진 이후에는 변수 내의 값이 바뀌지 않도록하는 규제다.

클래스 맴버와 인스턴스 맴버 토픽의 첫번째 예제를 기반으로 내용을 조금 바꾸었다.

package org.opentutorials.javatutorials.finals;

class Calculator {
    static final double PI = 3.14;
	int left, right;

	public void setOprands(int left, int right) {
		this.left = left;
		this.right = right;
		//Calculator.PI = 6;
	}

	public void sum() {
		System.out.println(this.left + this.right);
	}

	public void avg() {
		System.out.println((this.left + this.right) / 2);
	}
}

public class CalculatorDemo1 {

	public static void main(String[] args) {

		Calculator c1 = new Calculator();
		System.out.println(c1.PI);
		//Calculator.PI = 10;


	}

}

다음은 차이점이다.

위의 코드에서 주목할 점은 변수 앞에 final이 붙어있다는 점이다. 그리고 10행과 28행에 Calculator.PI를 통해서 클래스 변수 PI의 값을 변경하려고 하고 있지만 자바는 이것을 허용하지 않는다. final로 지정된 변수에는 한번 값이 할당되면 그 값을 바꿀 수 없기 때문이다.

상수가 변하지 않는 값이라고 배운 기억이 날 것이다. 그리고 위의 PI 예제는 변하지 않을 값이다. 이런 값은 변수 앞에 final을 붙여서 이 값이 변경되는 것을 규제할 수 있다. 이러한 특징은 클래스 변수의 예를 들었지만 인스턴스 변수에도 적용된다.

final 메소드

final 메소드는 final 변수 만큼 사용 빈도가 높지는 않다. 아래의 코드는 final 메소드 b를 상속하려하기 때문에 오류가 발생한다.

package org.opentutorials.javatutorials.finals;

class A{
    final void b(){}
}
class B extends A{
	void b(){}
}

final 클래스

아래 코드는 final 클래스를 상속하려하고 있다. 따라서 오류가 발생한다.

package org.opentutorials.javatutorials.finals;

final class C{
    final void b(){}
}
class D extends C{}

댓글

댓글 본문
  1. coster97
    굿
  2. wwwqiqi
    완료
  3. Alan Turing
    09/13
  4. 너굴
    20220811
  5. PassionOfStudy
    복습 4일차!
  6. 김은희
    20220615 완료
    final 내용을 바꾸거나 상속못함
  7. PassionOfStudy
    final!
  8. dogchang
    2022.05.05 1차 완료
    abstract는 내용이 없는 메소드를 선언하여 사용자가 overriding 하여 사용하도록 하는 방법.
    - 빈 술병을 팔아서 소비자가 각자 다른 담금주를 담게 하는 것과 비슷하게 생각됨.
    final은 내용을 선언하고 사용자가 바꿀 수 없도록 하는 방법.
    - 술이 담긴 오크통을 판매하여 사용자가 임의로 내용물을 바꿀 수 없게 하는 것과 비슷하게 생각할 수 있을 것 같음.

    abstract와 final은 서로 상반된 성질을 가짐.

    2차 정주행때 다시 복습.
  9. 자바잡아
    22.05.03 Final Attack Ride. Fi.Fi.Fi.Final!!!
  10. 20220429
  11. 모찌말랑카우
    22.02.17
  12. 민둥빈둥
    22.02.12
  13. aesop0207
    220208 Tue.
    확인필요) final 메소드를 포함하는 class를 상속하는 것은 가능한지?
  14. 행달
    22.02.06 완료!
  15. 드림보이
    2021.12.16. final 파트 수강완료
  16. syh712
    2021-12-09
    <Final>
    상속/변경 규제
    - 변수 앞에 final class Calculator { static final double PI = 3.14; ....
    - final 메소드 class A{ final void b(){} }
    - final 클래스 final class C
  17. 네제가해냈습니다
    211119
  18. H4PPY
    1102
  19. IaaS
    2021.11.02 수강완료
  20. 네제가해냈습니다
    211016 학습완료
  21. 베이스박
    2021.9.16 학습완료. 감사합니다.
  22. super1Nova
    210830
  23. Eunyoung Eunice Kang
    2021.8.16(월) 완료
  24. 악어수장
    2021-05-10 완료
  25. 김태현
    abstract 는 상속강제

    final
    // final class 상속불가
    // 실행되는 과정에서 한번 값이 정해진 이후에는 변수 내의 값이 바뀌지 않도록하는 규제다.
    // 오버라이딩 금지 ~ 부모 클래스 복사해서 쓰는 것 금지
  26. EunSeok Kang
    20200813 잘보고 갑니다.
  27. hvii
    20200812
  28. 김승민
    2020-04-22
    감사합니다
  29. 허공
    감사합니다!
  30. PassionOfStudy
    191008(화) - (1)
    수강완료~
  31. 홍구에몽
    20191006 완료
  32. 홍주호
    20190915 완료
  33. 다나가
    190905 - 수강완료~
  34. doevery
    수강 완료
  35. 아롱범
    메쏘드의 경우 오버라이딩은 불가해도 오버로딩은 가능할거라 생각해요. 오버로딩은 메쏘드의 매개변수의 형식이 다른 것을 이용해 동일한 이름을 가진 여러 메쏘드들을 정의하는 기법이기 때문에 상속과는 상관이 없는 반면, 오버라이딩은 상속된 자식 클래스에서 메쏘드를 재정의 하는 기법이죠. 상속을 통한 더이상의 변경을 불가하게 하겠다는 의미의 키워드인 final을생각해보면 '자식 클래스에서의 메쏘드 오버라이딩을 할 수 없다' 의미가 아닐까요? 물론, 자식클래스에서 오버로딩을 하는것도 가능한지는 테스트해봐야 할 것 같아요 ㅎㅎㅎ
  36. 6/17시작
    7월 3일 완료
  37. C++ 전공생
    final 에 대한 설명이 많이 부족해 보이네요;
  38. 데볼
    final 함수는 상수다! 절대 변하지않는값 감사합니다
  39. 라또마니
    잘 봤어요~~
  40. j-graphy
    2019. 2. 21. 학습완료
  41. 호두
    고맙습니다
  42. 호두
    final
  43. 기수니
    봤어여요, 삼성개념 에서 오버로딩이 연관 개념들 너무나도 잘 이해 할 수 있어 감사했습니다.
  44. 한라봉
    감사합니다
  45. 전민희
    감사합니다!
  46. 전하연
    2018.8.26 21:54

    감사합니다
  47. 이태호
    7/11
    abstract <ㅡ> final
  48. 5월 10일 final 완료
  49. 데이터정복
    final 완료!
  50. GoldPenguin
    감사합니다.
버전 관리
egoing
현재 버전
선택 버전
graphittie 자세히 보기