final
클래스의 구성요소가 더 이상 변경되지 않길 바랄 때 final을 사용합니다. 클래스에서 final을 사용하면 상속할 수 없고, 메소드에서 사용하면 오버라이딩할 수 없습니다.
클래스에서 사용
final로 선언된 클래스는 절대로 상속될 수 없습니다. 클래스 앞에 final를 붙여주면 됩니다.
final class 클래스명{
}
두 개의 클래스를 만들어서 상속 여부를 확인해 보겠습니다.
먼저 FinalA라는 클래스를 만들고 소스 코드를 입력합니다.
package com.bluedayj;
public class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
}
그러고 나서 FinalB 클래스를 만들고 FinalA 클래스를 상속해 보도록 하겠습니다.
package com.bluedayj;
public class FinalB extends FinalA{
public FinalB(String name, int age) {
super(name, age);
}
}
위와 같이 FinalB 클래스에서 FinalA를 상속해도 오류가 없습니다.
package com.bluedayj;
public final class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
}
※ FinalA 클래스에 final이 추가되면 FinalB 클래스에서 상속받질 못해 오류가 발생합니다.
메소드에서 사용
메소드에서 final을 사용하면 메소드를 오버라이딩할 수 없습니다. 메소드의 기능이 하위 클래스에서 변치 않기를 바랄 때 사용할 수 있습니다.
package com.bluedayj;
public class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
}
package com.bluedayj;
public class FinalB extends FinalA{
public FinalB(String name, int age) {
super(name, age);
}
public String getName() {
return name;
}
}
정상적으로 사용할 수 있는 소스입니다.
package com.bluedayj;
public class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
public final String getName() {
return name;
}
}
부모 클래스의 메소드에 final을 입력합니다.
※ 상속받은 클래스에서 같은 이름의 메소드를 사용할 수 없는걸 확인할 수 있습니다.
변수에서 사용
변수에 final을 사용하면 변수가 아닌 상수로의 기능을 가지게 됩니다. 그래서 변수값을 변경시킬 수 없습니다.
int age; //변수기능 사용가능
final int age; //상수기능 초기값이 미설정 - 오류
final int age = 20; //상수 기능 초기값 설정
예제를 보도록 하겠습니다. Variable 클래스를 생성합니다.
자바기본편
자바 클래스와 객체 #4
프로파일
BLUEDAYJ ・ 2020. 7. 6. 18:00 ・ 비공개
URL 복사 통계
© sctgrhm, 출처 Unsplash
final
클래스의 구성요소가 더 이상 변경되지 않길 바랄 때 final을 사용합니다. 클래스에서 final을 사용하면 상속할 수 없고, 메소드에서 사용하면 오버라이딩할 수 없습니다.
클래스에서 사용
final로 선언된 클래스는 절대로 상속될 수 없습니다. 클래스 앞에 final를 붙여주면 됩니다.
final class 클래스명{
}
두 개의 클래스를 만들어서 상속 여부를 확인해 보겠습니다.
먼저 FinalA라는 클래스를 만들고 소스 코드를 입력합니다.
package com.bluedayj;
public class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
}
그러고 나서 FinalB 클래스를 만들고 FinalA 클래스를 상속해 보도록 하겠습니다.
package com.bluedayj;
public class FinalB extends FinalA{
public FinalB(String name, int age) {
super(name, age);
}
}
위와 같이 FinalB 클래스에서 FinalA를 상속해도 오류가 없습니다.
package com.bluedayj;
public final class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
}
FinalA 클래스에 final이 추가되면 FinalB 클래스에서 상속받질 못해 오류가 발생합니다.
메소드에서 사용
메소드에서 final을 사용하면 메소드를 오버라이딩할 수 없습니다. 메소드의 기능이 하위 클래스에서 변치 않기를 바랄 때 사용할 수 있습니다.
package com.bluedayj;
public class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
}
package com.bluedayj;
public class FinalB extends FinalA{
public FinalB(String name, int age) {
super(name, age);
}
public String getName() {
return name;
}
}
정상적으로 사용할 수 있는 소스입니다.
package com.bluedayj;
public class FinalA {
protected String name;
protected int age;
public FinalA(String name, int age) {
this.name = name;
this.age = age;
}
public final String getName() {
return name;
}
}
부모 클래스의 메소드에 final을 입력합니다.
상속받은 클래스에서 같은 이름의 메소드를 사용할 수 없는걸 확인할 수 있습니다.
변수에서 사용
변수에 final을 사용하면 변수가 아닌 상수로의 기능을 가지게 됩니다. 그래서 변수값을 변경시킬 수 없습니다.
int age; //변수기능 사용가능
final int age; //상수기능 초기값이 미설정 - 오류
final int age = 20; //상수 기능 초기값 설정
예제를 보도록 하겠습니다. Variable 클래스를 생성합니다.
package com.bluedayj;
class MyInfo{
protected final String name;
protected final int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Variable {
public static void main(String[] args) {
MyInfo myInfo = new MyInfo();
System.out.println("이름 : " + myInfo.getName());
System.out.println("나이 : " + myInfo.getAge());
}
}
위 소스 코드를 보면 final 다음 변수에 초깃값을 설정하지 않아서 오류가 발생합니다.
그리고 눈치 빠르신 분은 클래스에서 변수 지정 후 getter&setter로 get/set 메소드를 만들 수 있는데 여기에서는 get메소드만 만들어졌습니다. 이유는 final 사용 시 변수명을 변경(set) 할 수 없기 때문입니다.
하지만 final 변수가 선언된 이후에 값을 설정할 수 있는 방법이 있습니다.
생성자에서 변수의 값을 초기화하는 것입니다.
하지만 final 변수가 선언된 이후에 값을 설정할 수 있는 방법이 있습니다.
생성자에서 변수의 값을 초기화하는 것입니다.
package com.bluedayj;
class MyInfo{
protected final String name;
protected final int age;
public MyInfo(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Variable {
public static void main(String[] args) {
MyInfo myInfo = new MyInfo("홀길동", 20);
System.out.println("이름 : " + myInfo.getName());
System.out.println("나이 : " + myInfo.getAge());
}
}
package com.bluedayj;
class MyInfo{
protected final String name = "홍길동";
protected final int age = 20;
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Variable {
public static void main(String[] args) {
MyInfo myInfo = new MyInfo();
System.out.println("이름 : " + myInfo.getName());
System.out.println("나이 : " + myInfo.getAge());
}
}
두 소스 코드의 결과값은 같습니다. 하지만 두 번째 소스 코드처럼 하면 변수가 바뀔 때마다 name과 age를 수정해야 하는 점이 있습니다.
package com.bluedayj;
class MyInfo{
protected final String name;
protected final int age;
public MyInfo(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Variable {
public static void main(String[] args) {
MyInfo myInfo = new MyInfo("홀길동", 20);
System.out.println("이름 : " + myInfo.getName());
System.out.println("나이 : " + myInfo.getAge());
MyInfo myInfo2 = new MyInfo("홍길동 아부지", 50);
System.out.println("이름 : " + myInfo2.getName());
System.out.println("나이 : " + myInfo2.getAge());
}
}
'프로그래밍 언어 > 자바' 카테고리의 다른 글
자바 클래스와 객체 #6 (0) | 2022.09.12 |
---|---|
자바 클래스와 객체 #5 (0) | 2022.09.12 |
자바 클래스와 객체 #3 (0) | 2022.09.11 |
자바 클래스와 객체 #2 (0) | 2022.09.11 |
자바 클래스와 객체 #1 (0) | 2022.09.11 |