Skip to content

Latest commit

Β 

History

History
128 lines (108 loc) Β· 3.56 KB

[20210807]_final.md

File metadata and controls

128 lines (108 loc) Β· 3.56 KB

final

In the Java programming language, the final keyword is used in several 
contexts to define an entity that can only be assigned once.
  • ν•œ 번만 ν• λ‹Ή κ°€λŠ₯ν•œ μ—”ν‹°ν‹°λ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©.

πŸ‘‰ Final classes

public final class MyFinalClass {...}

public class ThisIsWrong extends MyFinalClass {...} // forbidden
  • 상속 λΆˆκ°€λŠ₯ν•œ 클래슀
  • λŒ€ν‘œμ μΈ final class 둜 String이 μžˆλ‹€.

μ–Έμ œ ν΄λž˜μŠ€μ— final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν• κΉŒ?

  • ꡳ이 상속할 ν•„μš”κ°€ μ—†λŠ” μƒμˆ˜ 클래슀
public final class Tags {
    public static final int INSTANCE_UID = 1;
    public static final int CLASS_UID = 2;
}
  • μœ ν‹Έ 클래슀
public final class FileUtils {
    public static void createDirectories(String filename) {
    	// ...
    }
}

πŸ‘‰ Final methods

  • 상속 받은 μžμ‹ ν΄λž˜μŠ€μ—μ„œ overriding λΆˆκ°€
public class Base
{
    public       void m1() {...}
    public final void m2() {...}

    public static       void m3() {...}
    public static final void m4() {...}
}

public class Derived extends Base
{
    public void m1() {...}  // OK, overriding Base#m1()
    public void m2() {...}  // forbidden

    public static void m3() {...}  // OK, hiding Base#m3()
    public static void m4() {...}  // forbidden
}

μ–Έμ œ λ©”μ†Œλ“œμ— final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν• κΉŒ?

  • λ©”μ†Œλ“œμ˜ λ‚΄μš©μ„ μž¬μ •μ˜/λ³€κ²½ν•˜κ³  싢지 μ•Šμ„ λ•Œ
  • 일관성 μžˆλŠ” μ‹€ν–‰ λ‚΄μš©μ„ 보μž₯ν•˜κ³  싢을 λ•Œ

πŸ‘‰ Final variables

  • ν•œ 번만 μ΄ˆκΈ°ν™” κ°€λŠ₯ν•˜μ§€λ§Œ λ°˜λ“œμ‹œ μ„ μ–Έ μ‹œμ μ—μ„œ μ΄ˆκΈ°ν™”ν•  ν•„μš”λŠ” μ—†λ‹€. (blank final)

μ›μ‹œ νƒ€μž…

final int x = 1;

x = 3;  // 🚨 cannot assign a value to final variable x

객체 νƒ€μž…

final Fruit fruit = new Fruit();

fruit = new Fruit();  // 🚨 cannot assign a value to final variable fruit
  • 객체의 λΆˆλ³€μ„±μ„ 보μž₯ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.
final Fruit fruit = new Fruit();

fruit.setName("apple");
fruit.setName("grape");  // 객체 자체의 λΆˆλ³€μ„±μ„ 보μž₯ν•˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ— 속성은 λ³€κ²½ κ°€λŠ₯.

멀버 λ³€μˆ˜

class Fruit {
    private final String name;
    private String color;

    public Fruit(String name, String color) {
    	this.name = name;
    	this.color = color;
    }

    public String getName() {
    	return name;
    }
    public String getColor() {
    	return color;
    }
    public void setName(String name) {
    	this.name = name;  // 🚨 cannot assign a value to final variable name
    }
    public void setColor(String color) {
    	this.color = color;
    }
}

λ©”μ†Œλ“œ νŒŒλΌλ―Έν„°

public void print(final String str) {
    str = "changed";  // 🚨 final parameter str may not be assigned
}

κ·Έλž˜μ„œ, μ–Έμ œ μ‚¬μš©?

  • final μ‚¬μš©μ— λ”°λ₯Έ μž₯단점이 λͺ¨λ‘ μžˆμœΌλ―€λ‘œ νŒ€κ³Ό ν”„λ‘œμ νŠΈμ— 따라 λ‹¬λΌμ§ˆ 수 μžˆλ‹€.
  • κ°€λŠ₯ν•œ λ§Žμ€ λ³€μˆ˜λ₯Ό final둜 ν‘œμ‹œν•˜λ©΄ μ–΄λ–€ 객체가 λ°”λ€” 수 있고 μ—†λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ ꡬ뢄 κ°€λŠ₯.
    • κ·ΈλŸ¬λ‚˜ 이것이 객체의 λΆˆλ³€μ„±μ„ 보μž₯ν•˜μ§€λŠ” μ•ŠμŒ.
  • 더 λ§Žμ€ μ½”λ“œκ°€ 좔가될 수 μžˆλ‹€.
  • final이 μ“Έλͺ¨μ—†λŠ” κ²½μš°λ„ μžˆλ‹€. (e.g 좔상 λ©”μ†Œλ“œμ˜ νŒŒλΌλ―Έν„°)
  • (μ°Έκ³  : μ±… βŒœμ‹€μ „ μžλ°” μ†Œν”„νŠΈμ›¨μ–΄ 개발⌟ p25 2.4.1 final λ³€μˆ˜ - ν•œλΉ›λ―Έλ””μ–΄)

κ²°λ‘ 

  • (final의 λͺ¨λ“  μƒν™©μ—μ„œ μ™„μ „ν•œ λΆˆλ³€μ„±μ„ 보μž₯ν•˜μ§€λŠ” μ•Šμ§€λ§Œ)
  • μ–΄λ–€ 클래슀/λ©”μ†Œλ“œ/λ³€μˆ˜κ°€ λ³€κ²½λ˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ”μ§€λ₯Ό μ»΄νŒŒμΌλŸ¬μ™€ κ°œλ°œμžλ“€μ—κ²Œ μ•Œλ¦¬κ³  싢을 λ•Œ μ“°μž.