본문 바로가기
프로그래밍 언어/자바

자바 클래스와 객체 #4

by 블루데이제이 2022. 9. 11.
728x90
반응형

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());
	}
}

728x90
반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 클래스와 객체 #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