데이터 과학

public, private, 그리고 static 본문

프로그래밍 언어론/JAVA 기초

public, private, 그리고 static

티에스윤 2023. 3. 27. 22:45

public, private, 그리고 static은 자바에서 객체 지향 프로그래밍의 세 가지 기본 개념 중 일부입니다.

public: public은 해당 클래스, 메서드 또는 변수가 어디에서든 접근 가능하다는 것을 나타냅니다. 즉, 다른 클래스에서도 접근할 수 있습니다. 이는 객체 지향 프로그래밍에서 모듈성과 재사용성을 높이는 데 도움이 됩니다.

private: private는 해당 클래스 내부에서만 접근 가능하다는 것을 나타냅니다. 다른 클래스에서는 해당 클래스의 private 멤버에 직접적으로 접근할 수 없습니다. 이는 클래스의 내부를 보호하여 안정성을 높이는 데 도움이 됩니다.

static: static은 해당 클래스의 인스턴스를 만들지 않고도 해당 메서드나 변수에 접근할 수 있다는 것을 나타냅니다. 이는 클래스 수준에서 변수를 공유하고 메서드를 호출할 수 있게 해 줍니다. static 변수는 모든 인스턴스에서 공유되므로, 해당 변수의 값을 변경하면 모든 인스턴스에서 변경된 값을 공유합니다. static 메서드는 인스턴스 생성 없이 호출할 수 있으며, 인스턴스 변수에 액세스 할 수 없습니다.

따라서, public, private, static 키워드는 자바에서 객체 지향 프로그래밍의 세 가지 기본 개념을 표현하며, 코드의 안정성과 재사용성을 높이는 데 중요한 역할을 합니다.

 

아래는 자바에서 public과 private 키워드의 예제입니다.

public class Example {
    // public 변수
    public int publicVar = 10;

    // private 변수
    private int privateVar = 20;

    // public 메서드
    public void publicMethod() {
        System.out.println("This is a public method.");
    }

    // private 메서드
    private void privateMethod() {
        System.out.println("This is a private method.");
    }

    public static void main(String[] args) {
        Example example = new Example();
        
        // public 변수와 메서드에 접근
        System.out.println(example.publicVar);
        example.publicMethod();

        // private 변수와 메서드에 접근 (컴파일 오류 발생)
        // System.out.println(example.privateVar);
        // example.privateMethod();
    }
}


위의 코드에서 Example 클래스는 public으로 선언되어 다른 클래스에서 접근할 수 있습니다. Example 클래스 내부에는 public 변수 publicVar과 public 메서드 publicMethod()가 선언되어 있으며, 다른 클래스에서 이 변수와 메서드에 접근할 수 있습니다.

반면, private으로 선언된 변수 privateVar과 메서드 privateMethod()는 Example 클래스 내부에서만 접근 가능합니다. 따라서, 위의 main() 메서드에서 privateVar와 privateMethod()에 접근하려고 하면 컴파일 오류가 발생합니다.

따라서, public과 private 키워드는 다른 클래스와의 상호작용에 있어서 접근 권한을 제한하고, 클래스의 내부를 보호하기 위해 사용됩니다.

 

 

static과 instance 

 

static에 대한 제목을 강한 볼드체로 표시해 놨는데 그 이유는 static으로 지정할 경우 객체(object)를 만들 수 없습니다.

 

statice은 정적의 의미로 메소드를 정의할 경우 object instance가 될 때 생성되는 개념이 아니라 reference의 접근이 가깝습니다. 그래서 객체 이름으로 접근 할 때 그렇게 할 이유가 없습니다.

 

하나의 예를 들어 설명해 보겠습니다. 

 

 

public class MyClass {
    static double c;
    public static void main(String args[]) {
      
      Myclass s=new Myclass();
      s.doublerate(10.123);
      
    }
    
    public static double doublerate(double b){
        System.out.println("static sample");
        double a=b;
        System.out.println(a);
        return c;
    }
}

 

위 예제에서  Myclass s=new Myclass();
                     s.doublerete(10.123);

 

이 부분은 일반적인 객체 선언하는 부분입니다. s라는 객체이름을 만들어서 객체 생성 이후 참조해서 doublerate(double b) 메소드에 접근하는 방법인데 doublerate(double b)는 static으로 정의되어 있어서 객체를 생성해서 접근할 수 없어서 에러가 나옵니다. 

 

 

 

소스를 수정해 보겠습니다. 객체를 생성(instance) 하지 않고 직접 접근하는 방법으로 클래스안에 메소드를 접근하는 방법으로 코드를 수정했습니다. 

 

public class MyClass {
    static double c;
    public static void main(String args[]) {
      
      double d=MyClass.doublerate(1.23456);
      System.out.println(d);
    }
    
    public static double doublerate(double b){
        System.out.println("static sample");
        double a=b;
        System.out.println(a);
        return c;
    }
}

 

MyClass라는 클래스를 통해 doublerate() 메소드에 접근하는 코드를 작성했습니다. 객체이름은 없습니다. 

 

                                 double d=MyClass.doublerate(1.23456);

 

이렇게 인자값(argument)으로 1.23456을 doublerate 메소드에 전달을 하면 a 변수가 값을 받아 실수값으로 출력물은 나타냅니다.

문제는 그 다음줄에 있는 System.out.println(d); 명령어의 결과입니다. 

 

실수값으로 초기화가 되어 0.0이 나옵니다. 

 

 

static sample
1.23456
0.0

 

 

static을 객체 생성 할 수 없기에 클래스 이름으로 접근해야 합니다. 

 

 

'프로그래밍 언어론 > JAVA 기초' 카테고리의 다른 글

this 키워드  (1) 2023.05.16
객체지향  (19) 2023.04.15
부동소수점 연산 - BigDecimal  (0) 2023.03.20
static 메소드  (0) 2023.03.19
인터페이스 (interface)  (0) 2022.11.13