본문 바로가기

Java

[Java] 접근 제어자

728x90

자바에서는 코드의 접근 범위를 제한하고 관리하기 위해 다양한 접근 제어자와 개념들이 제공됩니다. 이는 코드의 안정성을 높이고, 의도치 않은 사용을 방지하며, 유지보수를 용이하게 만들어줍니다. 아래에서 각각의 개념을 자세히 설명하겠습니다.


1. 접근 제어자 (Access Modifiers)

접근 제어자는 클래스, 필드, 메소드 등 다양한 자바 구성 요소들이 외부에서 어떻게 접근될 수 있는지를 정의합니다. 자바에서는 다음과 같은 접근 제어자를 제공합니다:

  • public:
    • 모든 클래스에서 접근할 수 있습니다.
    • 클래스나 메소드 앞에 public을 선언하면 해당 클래스나 메소드는 외부에서 호출할 수 있게 됩니다.
  • protected:
    • 현재 클래스와 동일한 패키지, 또는 다른 패키지에 있는 자식 클래스에서 접근할 수 있습니다.
    • 부모 클래스에서 상속된 자식 클래스가 접근할 수 있도록 허용하는 수준입니다.
  • default (생략 가능):
    • 접근 제어자를 명시하지 않으면 기본적으로 default 접근 제어자가 설정됩니다.
    • 현재 클래스와 동일한 패키지 내에서만 접근할 수 있습니다. 외부에서 호출하는 것은 불가능합니다.
  • private:
    • 해당 클래스 내에서만 접근할 수 있습니다.
    • 다른 클래스에서 직접 접근할 수 없으며, 필드나 메소드의 접근을 제한하여 은닉화를 구현할 때 사용됩니다.

 

2. 클래스의 접근 제한

자바에서 클래스는 public 또는 default 접근 제어자만 사용할 수 있습니다.

  • public 클래스:
    • 외부에서 해당 클래스를 접근하거나 사용할 수 있습니다.
    • 파일 이름과 클래스 이름이 동일해야 하며, public 클래스는 하나의 파일에 하나만 존재할 수 있습니다.
  • default 클래스:
    • 현재 패키지 내에서만 접근할 수 있으며, 외부 패키지에서는 사용할 수 없습니다.
    • default는 접근 제어자를 생략한 상태입니다.
// public 클래스 (외부에서 접근 가능)
public class MyClass {
    // 코드
}

// default 클래스 (현재 패키지 내에서만 접근 가능)
class DefaultClass {
    // 코드
}



3. 필드의 접근 제한

필드(변수)에 대한 접근 제한은 클래스와 마찬가지로 public, protected, default, private를 모두 사용할 수 있습니다.

  • private: 다른 클래스에서는 접근 불가, 오직 해당 클래스 내에서만 접근 가능
  • public: 외부에서 직접 접근 가능
  • protected: 같은 패키지 내에서 접근 가능하거나, 다른 패키지의 자식 클래스에서 접근 가능
  • default: 같은 패키지 내에서 접근 가능

일반적으로 private 접근 제한자를 많이 사용하고, public으로 메소드를 제공하여 필드에 대한 간접 접근을 허용하는 방식이 권장됩니다. 이 방식은 **캡슐화(encapsulation)**와 정보 은닉을 촉진시킵니다.

public class Person {
    private String name; // private 필드

    // public 메소드로 name에 접근
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}



4. 메소드의 접근 제한

메소드의 접근 제어자는 public, protected, default, private 모두 사용할 수 있습니다. 메소드는 외부에서 어떻게 호출될 수 있는지를 정의합니다.

  • private 메소드: 외부에서 호출할 수 없으며, 클래스 내부에서만 사용됩니다.
  • public 메소드: 외부에서 호출 가능하며, 가장 일반적으로 사용됩니다.
  • protected 메소드: 상속 관계에 있는 클래스에서 호출 가능
  • default 메소드: 같은 패키지 내에서 호출 가능

추상 메소드(abstract)는 private으로 선언할 수 없으며, public 또는 protected로 선언하는 것이 일반적입니다.



5. 패키지 (Package)

패키지는 클래스 파일들을 체계적으로 관리하고 조직화하기 위한 디렉토리 구조입니다. 자바에서는 패키지를 사용하여 클래스의 충돌을 방지하고, 코드의 가독성과 유지보수성을 향상시킵니다.

패키지 선언:

package com.koreait.kakaotalk; // 패키지 선언



패키지를 사용하면 같은 이름을 가진 클래스가 여러 개 존재할 수 있으며, 이를 통해 이름 충돌을 방지할 수 있습니다. 일반적으로 도메인 이름을 거꾸로 써서 패키지 이름을 정하는 것이 일반적입니다. 예를 들어:

  • com.koreait.kakaotalk.network
  • com.koreait.kakaotalk.chat

✅ 패키지의 맨 뒤는 주로 패키지 안에 있는 클래스들의 역할을 작성하는 경우가 많음
    com.koreait.kakaotalk.network

 

패키지와 클래스:

package com.koreait.kakaotalk.network;

public class NetworkManager {
    // 네트워크 관련 코드
}

static

static은 클래스의 공유된 변수메소드를 정의할 때 사용합니다. static이 붙은 변수나 메소드는 모든 객체가 공유하는 특성을 가집니다. 객체를 생성하지 않고도 클래스 이름으로 직접 접근할 수 있습니다.

static이 적용된 변수:

  • 클래스 변수로 모든 객체가 동일한 값을 공유합니다
public class Counter {
    static int count = 0; // 모든 객체가 공유하는 변수

    public void increment() {
        count++;
    }

    public static void main(String[] args) {
        Counter counter1 = new Counter();
        counter1.increment();
        Counter counter2 = new Counter();
        counter2.increment();
        
        System.out.println(Counter.count); // 2 (둘 다 같은 변수를 공유)
    }
}

 

static이 적용된 메소드:

  • 클래스 메소드로, 객체 생성 없이 클래스명.메소드명으로 호출 가능합니다.
public class MathUtility {
    public static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        int result = MathUtility.add(5, 3); // 객체 생성 없이 메소드 호출
        System.out.println(result); // 8
    }
}

static 블록:

  • 클래스가 처음 로드될 때 한 번만 실행되는 코드 블록입니다. 주로 정적 초기화를 할 때 사용됩니다.
public class StaticExample {
    static {
        System.out.println("Static block is executed!");
    }

    public static void main(String[] args) {
        // static block은 클래스가 로드될 때 자동으로 실행됩니다.
    }
}

 

정리

  • 접근 제어자는 클래스, 필드, 메소드의 외부 접근 범위를 결정합니다.
  • 패키지는 클래스들을 체계적으로 관리할 수 있도록 도와줍니다.
  • static은 객체마다 별개로 존재하지 않고, 모든 객체가 공유하는 클래스 변수나 메소드를 만들 때 사용됩니다.

이러한 개념들을 잘 활용하면 자바 프로그램을 효율적으로 관리하고 유지보수할 수 있습니다.

728x90