[Java] μ μ΄μ - static, final, abstract
μ μ΄μλ?
μ μ΄μ(modifier)λ ν΄λμ€, λ³μ λλ λ©μλμ μ μΈλΆμ ν¨κ» μ¬μ©λμ΄ λΆκ°μ μΈ μλ―Έλ₯Ό λΆμ¬νλ€.
μ κ·Ό μ μ΄μ public, protected, default, private
κ·Έ μΈ static, final, abstract, native, transient, synchronized, volatile, strictfp
μ μ΄μλ ν΄λμ€λ λ©€λ²λ³μμ λ©μλμ μ£Όλ‘ μ¬μ©λλ©°, νλμ λμμ λν΄μ μ¬λ¬ μ μ΄μλ₯Ό μ‘°ν©νμ¬ μ¬μ©νλ κ²μ΄ κ°λ₯νλ€.
static - ν΄λμ€μ, 곡ν΅μ μΈ
staticμ΄ μ¬μ©λ μ μλ κ³³ → λ©€λ²λ³μ, λ©μλ, μ΄κΈ°ν λΈλ
μΈμ€ν΄μ€λ³μλ νλμ ν΄λμ€λ‘λΆν° μμ±λμλλΌλ κ°κΈ° λ€λ₯Έ κ°μ μ μ§νμ§λ§,
ν΄λμ€λ³μ(static λ©€λ²λ³μ)λ μΈμ€ν΄μ€μ κ΄κ³μμ΄ κ°μ κ°μ κ°λλ€.
βμβ
νλμ λ³μλ₯Ό λͺ¨λ μΈμ€ν΄μ€κ° 곡μ νκΈ° λλ¬Έμ΄λ€.
static λ©μλλ‘ νλ κ²μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ νΈμΆμ΄ κ°λ₯ν΄μ λ νΈλ¦¬νκ³ μλλ λ λΉ λ₯΄λ€.
public class MathUtil {
// μ μ (static) λ©μλ: λ μλ₯Ό λνλ λ©μλ
public static int add(int a, int b) {
return a + b;
}
// μ μ (static) λ©μλ: λ μλ₯Ό κ³±νλ λ©μλ
public static int multiply(int a, int b) {
return a * b;
}
}
public class Main {
public static void main(String[] args) {
int sum = MathUtil.add(5, 3); // MathUtil ν΄λμ€μ add λ©μλ νΈμΆ
System.out.println("Sum: " + sum); // Sum: 8
int product = MathUtil.multiply(4, 6); // MathUtil ν΄λμ€μ multiply λ©μλ νΈμΆ
System.out.println("Product: " + product); // Product 24
}
}
final - λ§μ§λ§μ, λ³κ²½λ μ μλ
finalμ΄ μ¬μ©λ μ μλ κ³³ → ν΄λμ€, λ©μλ, λ©€λ²λ³μ, μ§μλ³μ
- λ³μμ μ¬μ©λλ©΄ κ°μ λ³κ²½ν μ μλ μμκ° λ¨
- λ©μλμ μ¬μ©λλ©΄ μ€λ²λΌμ΄λ©μ ν μ μμ
- ν΄λμ€μ μ¬μ©λλ©΄ μμ μ νμ₯νλ μμ ν΄λμ€λ₯Ό μ μνμ§ λͺ»νκ² λ¨
β λ©μλμ μ¬μ©λλ©΄ μ€λ²λΌμ΄λ©μ ν μ μμ β
class Parent {
// final λ©μλ: νμ ν΄λμ€μμ μ€λ²λΌμ΄λ©ν μ μμ
public final void display() {
System.out.println("This is a final method.");
}
}
class Child extends Parent {
// μ»΄νμΌ μ€λ₯: final λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν μ μμ
public void display() { // μλ¬λ¨
System.out.println("This method cannot be overridden.");
}
}
λ©μλλ₯Ό finalλ‘ μ€μ νλ©΄ μμμ μ€λ²λΌμ΄λ©μ λͺ»ν¨
β ν΄λμ€μ μ¬μ©λλ©΄ μμ μ νμ₯νλ μμ ν΄λμ€λ₯Ό μ μνμ§ λͺ»νκ² λ¨ β
final class Parent {
// ν΄λμ€μ final ν€μλ μ¬μ©: λ μ΄μ μμλ μ μμ
public void display() {
System.out.println("This is a final class.");
}
}
// μ»΄νμΌ μ€λ₯: final ν΄λμ€λ₯Ό μμν μ μμ
class Child extends Parent {
// ...
}
μμ±μλ₯Ό μ΄μ©ν finalλ©€λ² λ³μμ μ΄κΈ°ν
finalμ΄ λΆμ λ³μλ μμμ΄λ―λ‘ μΌλ°μ μΌλ‘ μ μΈκ³Ό μ΄κΈ°νλ₯Ό λμμ νμ§λ§, μΈμ€ν΄μ€λ³μμ κ²½μ° μμ±μμμ μ΄κΈ°ν λλλ‘ ν μ μλ€.
μ) μΉ΄λ → κ° μΉ΄λλ§λ€ λ€λ₯Έ μ’ λ₯μ μ«μλ₯Ό κ°λλ°, μΌλ¨ μΉ΄λκ° μμ±λλ©΄ μΉ΄λμ κ°μ΄ λ³κ²½λμ΄μλ μ λ¨
class Card {
final int NUMBER;
final String KIND;
static int width = 100;
static int height = 250;
Card(String kind, int num){
KIND = kind;
NUMBER = num; // μ΄κΈ°νλ₯Ό μ¬κΈ°μ ν μ μμ
}
public String toString() {
return KIND + " " + NUMBER;
}
}
class FinalCardTest {
public static void main(String args[]) {
Card c = new Card("HEART", 10);
System.out.println(c.KIND); // HEART
System.out.println(c.NUMBER); // 10
System.out.println(c.); // HEART 10
}
}
abstract - μΆμμ, λ―Έμμ±μ
abstractκ° μ¬μ©λ μ μλ κ³³ → ν΄λμ€, λ©μλ
λ©μλμ μ μΈλΆλ§ μμ±νκ³ μ€μ μνλ΄μ©μ ꡬννμ§ μμ μΆμ λ©μλλ₯Ό μ μΈνλλ° μ¬μ©λλ€.
import java.io.*;
abstract class Parent {
public abstract void f1();
public void f2(){
System.out.println("Parent f2()");
}
}
class Child extends Parent{
@Override
public void f1(){
System.out.println("Childμμ f1() μΆμλ©μλ ꡬν");
}
public void f3() {
System.out.println("Childμμ f3()");
}
}
public class Main {
public static void main(String[] args) throws IOException {
Parent parent = new Parent(); // μ»΄νμΌ μλ¬. μΆμν΄λμ€ μ체λ μΈμ€ν΄μ€ν λΆκ°λ₯
Child c = new Child();
c.f1();
c.f2();
c.f3();
Parent p = new Child();
p.f1();
p.f2();
((Child)p).f3();
}
}
/*
Childμμ f1() μΆμλ©μλ ꡬν
Parent f2()
Childμμ f3()
Childμμ f1() μΆμλ©μλ ꡬν
Parent f2()
Childμμ f3()
*/
μΆμν΄λμ€ μ체λ‘λ μΈμ€ν΄μ€ν ν μ μλ€.
μ κ·Ό μ μ΄μ(access modifier)
μ κ·Ό μ μ΄μκ° μ¬μ©λ μ μλ κ³³ - ν΄λμ€, λ©€λ²λ³μ, λ©μλ, μμ±μ
private → κ°μ ν΄λμ€ λ΄μμλ§ μ κ·Όμ΄ κ°λ₯νλ€.
default → κ°μ ν¨ν€μ§ λ΄μμλ§ μ κ·Όμ΄ κ°λ₯νλ€.
protected → κ°μ ν¨ν€μ§ λ΄μμ, κ·Έλ¦¬κ³ λ€λ₯Έ ν¨ν€μ§μ μμν΄λμ€μμ μ κ·Όμ΄ κ°λ₯νλ€.
public → μ κ·Ό μ νμ΄ μ ν μλ€.
μ κ·Ό μ μ΄μλ₯Ό μ΄μ©ν μΊ‘μν
βν΄λμ€λ λ©€λ², μ£Όλ‘ λ©€λ²μ μ κ·Ό μ μ΄μλ₯Ό μ¬μ©νλ μ΄μ β
→ ν΄λμ€ λ΄λΆμ μ μΈλ λ°μ΄ν°λ₯Ό 보νΈνκΈ° μν΄μ
→ μΈλΆμλ λΆνμν, λ΄λΆμ μΌλ‘λ§ μ¬μ©λλ, λΆλΆμ κ°μΆκΈ° μν΄μ
λ°μ΄ν°κ° μ μν κ°μ μ μ§νλλ‘, λλ λΉλ°λ²νΈμ κ°μ λ°μ΄ν°λ₯Ό μΈλΆμμ ν¨λΆλ‘ λ³κ²½νμ§ λͺ»νλλ‘ νκΈ° μν΄μλ μΈλΆλ‘λΆν°μ μ κ·Όμ μ ννλ κ²μ΄ νμνλ€.
→ μ΄κ²μ΄ λ°μ΄ν° κ°μΆκΈ°(data hiding)μ΄λΌκ³ νλ©°, κ°μ²΄μ§ν₯κ°λ μ μΊ‘μνμ ν΄λΉνλ λ΄μ©μ΄λ€.