π™ΉπšŠπšŸπšŠ

[Java] μ œμ–΄μž - static, final, abstract

ν•΄λ²„λ‹ˆ 2024. 5. 7. 16:31
λ°˜μ‘ν˜•

μ œμ–΄μžλž€?

μ œμ–΄μž(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)이라고 ν•˜λ©°, 객체지ν–₯κ°œλ…μ˜ μΊ‘μŠν™”μ— ν•΄λ‹Ήν•˜λŠ” λ‚΄μš©μ΄λ‹€.

 

 

 

 

 

 

 

λ°˜μ‘ν˜•