# μ œμ–΄μž(modifier)

written by sohyeon, hyemin πŸ’‘


# 1. μ œμ–΄μžλž€?

μ œμ–΄μž(modifier)λŠ” 클래슀, λ³€μˆ˜ λ˜λŠ” λ©”μ„œλ“œμ˜ 선언뢀에 ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ 뢀가적인 의미λ₯Ό λΆ€μ—¬ν•œλ‹€.

μ ‘κ·Ό μ œμ–΄μž : public, protected, default, private
κ·Έ μ™Έ : static, final, abstract, native, transient, synchronized, volatile, strictfp

μ ‘κ·Ό μ œμ–΄μžλŠ” ν•˜λ‚˜μ˜ λŒ€μƒμ— λŒ€ν•΄μ„œ publicκ³Ό private λ“± λ„€ 가지 쀑 ν•˜λ‚˜λ§Œ μ„ νƒν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.


# 2. static - 클래슀의, 곡톡적인

μΈμŠ€ν„΄μŠ€λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±λ˜μ—ˆλ”λΌλ„ 각기 λ‹€λ₯Έ 값을 μœ μ§€ν•˜μ§€λ§Œ, ν΄λž˜μŠ€λ³€μˆ˜(staticλ©€λ²„λ³€μˆ˜)λŠ” μΈμŠ€ν„΄μŠ€μ— 관계없이 같은 값을 κ°–λŠ”λ‹€.
κ·Έ μ΄μœ λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

static이 μ‚¬μš©λ  수 μžˆλŠ” κ³³ - λ©€λ²„λ³€μˆ˜, λ©”μ„œλ“œ, μ΄ˆκΈ°ν™” λΈ”λŸ­

μ œμ–΄μž λŒ€μƒ 의미
static λ©€λ²„λ³€μˆ˜ - λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” ν΄λž˜μŠ€λ³€μˆ˜κ°€ λœλ‹€.
- ν΄λž˜μŠ€λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
- ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ μƒμ„±λœλ‹€.
static λ©”μ„œλ“œ - μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ 호좜이 κ°€λŠ₯ν•œ static λ©”μ„œλ“œκ°€ λœλ‹€.
- staticλ©”μ„œλ“œ λ‚΄μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 멀버듀을 직접 μ‚¬μš©ν•  수 μ—†λ‹€.
  • μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œλŠ” static을 λΆ™μ—¬μ„œ staticλ©”μ„œλ“œλ‘œ μ„ μ–Έν•  것
  • static λ©”μ„œλ“œλ‘œ ν•˜λŠ” 것이 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ 호좜이 κ°€λŠ₯ν•΄μ„œ 더 νŽΈλ¦¬ν•˜κ³  속도도 더 λΉ λ₯΄λ‹€.

# ex) 예제

class StaticTest {
    static int width = 200;          // 클래슀 λ³€μˆ˜ (staticλ³€μˆ˜)
    static int height = 120;         // 클래슀 λ³€μˆ˜ (staticλ³€μˆ˜)

    static {                         // 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­
        // staticλ³€μˆ˜μ˜ λ³΅μž‘ν•œ μ΄ˆκΈ°ν™” μˆ˜ν–‰
    }

    static int max(int a, int b) {   // 클래슀 λ©”μ„œλ“œ(staticλ©”μ„œλ“œ)
        return a > b ? a : b;
    }
}

# 3. final - λ§ˆμ§€λ§‰μ˜, 변경될 수 μ—†λŠ”

final은 λ§ˆμ§€λ§‰μ˜ λ˜λŠ” 변경될 수 μ—†λŠ”μ˜ 의미λ₯Ό 가지고 μžˆλ‹€.

final이 μ‚¬μš©λ  수 μžˆλŠ” κ³³ - 클래슀, λ©”μ„œλ“œ, λ©€λ²„λ³€μˆ˜, μ§€μ—­λ³€μˆ˜

μ œμ–΄μž λŒ€μƒ 의미
final 클래슀 - 변경될 수 μ—†λŠ” 클래슀, ν™•μž₯될 수 μ—†λŠ” ν΄λž˜μŠ€κ°€ λœλ‹€.
κ·Έλž˜μ„œ final둜 μ§€μ •λœ ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀의 쑰상이 될 수 μ—†λ‹€.
final λ©”μ„œλ“œ - 변경될 수 μ—†λŠ” λ©”μ„œλ“œ. final둜 μ§€μ •λœ λ©”μ„œλ“œλŠ” μ˜€λ²„λΌμ΄λ”©μ„ 톡해 μž¬μ •μ˜ 될 수 μ—†λ‹€.
final λ©€λ²„λ³€μˆ˜, μ§€μ—­λ³€μˆ˜ - λ³€μˆ˜ μ•žμ— final이 λΆ™μœΌλ©΄, 값을 λ³€κ²½ν•  수 μ—†λŠ” μƒμˆ˜κ°€ λœλ‹€.

# ex) 예제

final class FinalTest {             // 쑰상이 될 수 μ—†λŠ” 클래슀
    final int MAX_SIZE = 10;        // 값을 λ³€κ²½ν•  수 μ—†λŠ” λ©€λ²„λ³€μˆ˜(μƒμˆ˜)

    final void getMaxSize() {       // μ˜€λ²„λΌμ΄λ”©ν•  수 μ—†λŠ” λ©”μ„œλ“œ(λ³€κ²½λΆˆκ°€)
        final int LV = MAX_SIZE;    // 값을 λ³€κ²½ν•  수 μ—†λŠ” μ§€μ—­λ³€μˆ˜(μƒμˆ˜)
        return MAX_SIZE;
    }
}

# μƒμ„±μžλ₯Ό μ΄μš©ν•œ final멀버 λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”

final이 뢙은 λ³€μˆ˜λŠ” μƒμˆ˜μ΄λ―€λ‘œ 일반적으둜 μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”λ₯Ό λ™μ‹œμ— ν•˜μ§€λ§Œ, μΈμŠ€ν„΄μŠ€λ³€μˆ˜μ˜ 경우 μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™” λ˜λ„λ‘ ν•  수 μžˆλ‹€.

클래슀 내에 λ§€κ°œλ³€μˆ˜λ₯Ό κ°–λŠ” μƒμ„±μžλ₯Ό μ„ μ–Έν•˜μ—¬, μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ final이 뢙은 λ©€λ²„λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ”λ° ν•„μš”ν•œ 값을 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œλΆ€ν„° μ œκ³΅λ°›λŠ”λ‹€.

# ex) 예제

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

    Card() {
        this("HEART", 1);
    }
}

# 4. abstract - μΆ”μƒμ˜, λ―Έμ™„μ„±μ˜

abstractλŠ” λ―Έμ™„μ„±μ˜ 의미λ₯Ό 가지고 μžˆλ‹€.

abstractκ°€ μ‚¬μš©λ  수 μžˆλŠ” κ³³ - 클래슀, λ©”μ„œλ“œ

μ œμ–΄μž λŒ€μƒ 의미
abstract 클래슀 - 클래슀 내에 좔상 λ©”μ„œλ“œκ°€ μ„ μ–Έλ˜μ–΄ μžˆμŒμ„ μ˜λ―Έν•œλ‹€.
abstract λ©”μ„œλ“œ - μ„ μ–ΈλΆ€λ§Œ μž‘μ„±ν•˜κ³  κ΅¬ν˜„λΆ€λŠ” μž‘μ„±ν•˜μ§€ μ•Šμ€ 좔상 λ©”μ„œλ“œμž„μ„ μ•Œλ¦°λ‹€.

# ex) 예제

abstract class AbstractTest {  // μΆ”μƒν΄λž˜μŠ€(μΆ”μƒλ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•œ 클래슀)
    abstract void move();      // 좔상 λ©”μ„œλ“œ(κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œ)
}

이 클래슀 μžμ²΄λ‘œλŠ” μ“Έλͺ¨κ°€ μ—†μ§€λ§Œ, λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 이 클래슀λ₯Ό μƒμ†λ°›μ•„μ„œ μΌλΆ€μ˜ μ›ν•˜λŠ” λ©”μ„œλ“œλ§Œ μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ λœλ‹€λŠ” μž₯점이 μžˆλ‹€.


# 5. μ ‘κ·Ό μ œμ–΄μž(access modifier)

μ ‘κ·Όμ œμ–΄μžλŠ” 멀버 λ˜λŠ” ν΄λž˜μŠ€μ— μ‚¬μš©λ˜μ–΄, ν•΄λ‹Ήν•˜λŠ” 멀버 λ˜λŠ” 클래슀λ₯Ό μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 μ œν•œν•˜λŠ” 역할을 ν•œλ‹€.

ν΄λž˜μŠ€λ‚˜ λ©€λ²„λ³€μˆ˜, λ©”μ„œλ“œ, μƒμ„±μžμ— μ ‘κ·Ό μ œμ–΄μžκ°€ μ§€μ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄, μ ‘κ·Ό μ œμ–΄μžκ°€ defaultμž„μ„ λœ»ν•œλ‹€.

μ ‘κ·Ό μ œμ–΄μžκ°€ μ‚¬μš©λ  수 μžˆλŠ” κ³³ - 클래슀, λ©€λ²„λ³€μˆ˜, λ©”μ„œλ“œ, μƒμ„±μž
private : 같은 클래슀 λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.
default : 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.
protected : 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œ, 그리고 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ† ν΄λž˜μŠ€μ—μ„œ 접근이 κ°€λŠ₯ν•˜λ‹€.
public : μ ‘κ·Ό μ œν•œμ΄ μ „ν˜€ μ—†λ‹€.

# λŒ€μƒμ— 따라 μ‚¬μš©ν•  수 μžˆλŠ” μ ‘κ·Ό μ œμ–΄μž

# μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ΄μš©ν•œ μΊ‘μŠν™”

μΊ‘μŠν™”(encapsulation) : 객체지ν–₯κ°œλ…μ—μ„œ 데이터가 μœ νš¨ν•œ 값을 μœ μ§€ν•˜λ„λ‘, λ˜λŠ” λΉ„λ°€λ²ˆν˜Έμ™€ 같은 데이터λ₯Ό μ™ΈλΆ€μ—μ„œ ν•¨λΆ€λ‘œ λ³€κ²½ν•˜μ§€ λͺ»ν•˜λ„둝 μ™ΈλΆ€λ‘œλΆ€ν„°μ˜ 접근을 μ œν•œν•˜λŠ” 것

μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜λŠ” 이유
- μ™ΈλΆ€λ‘œλΆ€ν„° 데이터λ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•΄μ„œ
- μ™ΈλΆ€μ—λŠ” λΆˆν•„μš”ν•œ, λ‚΄λΆ€μ μœΌλ‘œλ§Œ μ‚¬μš©λ˜λŠ” 뢀뢄을 감좔기 μœ„ν•΄μ„œ

# ex) 예제

public class Time {  // λ©”μ†Œλ“œλ₯Ό ν†΅ν•œ μ ‘κ·Ό ν—ˆμš©
    private int hour;
    private int minute;
    private int second;  // μ ‘κ·Ό μ œμ–΄μžλ₯Ό private으둜 ν•˜μ—¬ μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 ν•œλ‹€.

    public int getHour() { return hour; }
    public void setHour(int hour) {
        if(hour < 0 || hour > 23) return;
        this.hour = hour;  // λ©€λ²„λ³€μˆ˜μ˜ 값을 읽고 λ³€κ²½ν•  수 μžˆλŠ” public λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•¨μœΌλ‘œμ¨ κ°„μ ‘μ μœΌλ‘œ λ©€λ²„λ³€μˆ˜μ˜ 값을 λ‹€λ£° 수 μžˆλ„λ‘ ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.
    }

    public int getMinute() { return minute; }
    public void setMinute(int minute) {
        if(minute < 0 || minute > 59) return;
        this.minute = minute; 
    }

    public int getSecond() { return second; }
    public void setSecond(int second) {
        if(second < 0 || second > 59) return;
        this.second = second; 
    }
}

# μƒμ„±μžμ˜ μ ‘κ·Ό μ œμ–΄μž

μƒμ„±μžμ˜ μ ‘κ·Ό μ œμ–΄μžλ₯Ό private으둜 μ§€μ •ν•˜λ©΄, μ™ΈλΆ€μ—μ„œ μƒμ„±μžμ— μ ‘κ·Όν•  수 μ—†μœΌλ―€λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€.
κ·Έλž˜λ„ 클래슀 λ‚΄λΆ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€.

λŒ€μ‹  μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ„œ λ°˜ν™˜ν•΄μ£ΌλŠ” publicλ©”μ„œλ“œλ₯Ό μ œκ³΅ν•¨μœΌλ‘œμ¨ μ™ΈλΆ€μ—μ„œ 이 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•œλ‹€.
이 λ©”μ„œλ“œλŠ” public인 λ™μ‹œμ— static이어야 ν•œλ‹€.

# ex) 예제

class Singleton {
    ...
    private static Singleton s = new Singleton(); // getInstance()μ—μ„œ μ‚¬μš©λ  수 μžˆλ„λ‘ μΈμŠ€ν„΄μŠ€κ°€ 미리 μƒμ„±λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ static이어야 ν•œλ‹€.
    
    private Singleton() {
        ...
    }
    
    // μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ ν˜ΈμΆœν•  수 μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ static 이어야 ν•œλ‹€.
    public static Singleton getInstance() {
        return s;
    }
    ...
}

# 6. μ œμ–΄μž(modifier)의 μ‘°ν•©

# λŒ€μƒμ— 따라 μ‚¬μš©ν•  수 μžˆλŠ” μ œμ–΄μž

# μ œμ–΄μžλ₯Ό μ‘°ν•©ν•΄μ„œ μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  사항

1. λ©”μ„œλ“œμ— staticκ³Ό abstractλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†λ‹€.
    - static λ©”μ„œλ“œλŠ” λͺΈν†΅μ΄ μžˆλŠ” λ©”μ„œλ“œμ—λ§Œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.
2. ν΄λž˜μŠ€λŠ” abstract와 final을 λ™μ‹œμ— μ‚¬μš©ν•  수 μ—†λ‹€.
    - ν΄λž˜μŠ€μ— μ‚¬μš©λ˜λŠ” final은 클래슀λ₯Ό ν™•μž₯ν•  수 μ—†λ‹€λŠ” 의미이고, abstractλŠ” 상속을 ν†΅ν•΄μ„œ μ™„μ„±λ˜μ–΄μ•Ό ν•œλ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ μ„œλ‘œ λͺ¨μˆœλ˜κΈ° λ•Œλ¬Έμ΄λ‹€.
3. abstractλ©”μ„œλ“œλŠ” μ ‘κ·Ό μ œμ–΄μžκ°€ private일 수 μ—†λ‹€.
    - abstractλ©”μ„œλ“œλŠ” μžμ†ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”λ° μ ‘κ·Ό μ œμ–΄μžκ°€ private이면, μžμ† ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
4. λ©”μ„œλ“œμ— privateκ³Ό final을 같이 μ‚¬μš©ν•  ν•„μš”λŠ” μ—†λ‹€.
    - μ ‘κ·Ό μ œμ–΄μžκ°€ private인 λ©”μ„œλ“œλŠ” μ˜€λ²„λΌμ΄λ”©λ  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

# Reference & Additional Resources

https://csw7432.tistory.com/entry/Java-μ ‘κ·Όμ œμ–΄μž-Access-Modifier/

Last Updated: 12/5/2020, 11:36:44 AM