최종 및 기타 Java 키워드 - 1

"안녕, 아미고!"

"안녕, 빌라보!"

"오늘은 Java의 여러 키워드에 대해 말씀드리겠습니다. 하지만 가장 흥미로운 키워드인 final부터 시작하겠습니다. "

" 변수, 메서드 또는 클래스를 선언할 때 final 키워드를 사용할 수 있습니다 ."

"그리고 왜 결승전이 필요합니까?"

"매우 간단합니다. 변수를 최종으로 표시하면 변경할 수 없게 됩니다."

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"알겠어요."

"메서드를 최종으로 표시하면 파생 클래스에서 메서드를 재정의하는 것이 금지됩니다."

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

"알겠습니다. 그런데 왜 메서드 재정의를 금지해야 합니까?"

"음, 예를 들어, 프로그래머가 메소드에 많은 중요한 코드를 작성했고 그의 클래스를 상속하는 모든 클래스가 지정된 동작을 갖도록 보장하기를 원한다고 가정합니다."

"그리고 마지막으로 세 번째 사용법입니다."

"final 키워드로 클래스를 표시하면 클래스를 상속할 수 없습니다."

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

"그리고 왜 우리는 클래스가 상속되는 것을 막을까요?"

"우리가 상속을 성가시게 막는 것이 아니라 보안과 코드 무결성을 위해서라는 것을 이해해야 합니다. 클래스 상속이 금지되지 않으면 허용된다는 의미입니다. 그리고 클래스의 디자이너는 이 클래스의 개체와 파생 클래스의 개체에 대해 제대로 작동합니다."

"하지만 개발자가 자신의 클래스를 조금만 변경해도 모든 것이 예상대로 작동하지 않는다는 것을 알게 된다면 상속을 금지하는 것이 좋습니다."

"예를 들어 String 클래스는 모든 기본 유형인 Integer, Boolean, Double, Character와 마찬가지로 final로 선언됩니다."

"아, 알겠습니다. String 클래스는 불변 클래스로 만들어졌는데 갑자기 변경 가능해지면 많은 작업이 중단될 것입니다."

"음, 거의. 이렇게 표현해 봅시다: 모든 것이 거의 이전처럼 작동하지만 때로는 찾고 이해하기 매우 어려운 오류가 있을 수 있습니다. 따라서 어떤 경우에는 클래스나 메서드를 상속하는 것이 실제로 죄가 아닙니다. 하지만 금지하면 나중에 잡을 수 있는 오류가 줄어듭니다."

"마지막을 어디에서 사용할 수 있습니까?"

"함수 매개변수 이전과 메서드의 변수 이전에 final을 사용할 수 있습니다. 예를 들면 다음과 같습니다."

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

"그게 무슨 소용이야?"

"음, 두 가지가 있습니다. 첫째, 다른 개발자에게 이 값이 단순한 변수가 아니라 특정 상수임을 알리고 싶다면 변수를 최종 변수로 선언합니다."

예를 들어 가격을 기준으로 판매세를 계산하려고 합니다.

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"그리고 둘째, 로컬 또는 익명 내부 클래스를 작성할 때 이러한 유형의 변수가 필요합니다. 이러한 유형의 클래스에 대해 곧 알려 드리겠습니다. 하지만 오늘은 아닙니다."

"좋아, 지금까지 너무 복잡한 것은 없었어."

"변수가 참조할 수 있는 개체가 아니라 변수만 변경할 수 없게 된다는 점에 유의하십시오. 개체는 여전히 변경할 수 있습니다."

"실은 그것에 대해 물어보려던 참이었어요. 그리고 물체를 불변으로 만드는 방법은 없나요?"

"아니요, 변경할 수 없는 클래스를 작성하지 않는 한."

"최종 변수의 값은 변경할 수 없으므로 초기 값을 즉시 지정해야 합니다."

이 코드는 컴파일됩니다 이 코드는 컴파일 되지 않습니다
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"그러나 Java는 생성자까지 클래스의 최종 변수 초기화를 지연시킬 수 있습니다."

이 코드는 컴파일됩니다 이 코드는 컴파일 되지 않습니다
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"또한 다른 생성자는 다른 값으로 최종 변수를 초기화할 수 있습니다. 이것은 매우 편리합니다."

이 코드는 컴파일됩니다
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"그건 정말 흥미로운 주제였고 모든 것이 이치에 맞습니다. 감사합니다, Bilaabo!"