본문 바로가기

객체 지향 프로그래밍 - 클래스

접근 제한자

접근 제한자

  • 중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성을 유지하기 위해서 접근 제한자 사용


    출처, 이것이 자바다


  • 접근 제한자는 public, protected, private의 세 가지 종류


    출처, 이것이 자바다



    출처, 이것이 자바다


클래스의 접근 제한

  • 클래스를 선언할 때 public 접근 제한자를 생략하면 클래스는 다른 패키지에서 사용할 수 없음


    출처, 이것이 자바다


  • 클래스를 선언할 때 public 접근 제한자를 붙이면 클래스는 같은 패키지뿐만 아니라 다른 패키지에서도 사용할 수 있음


    출처, 이것이 자바다


package ch06.sec13.exam01.package1;
//동일한 패키지안에서는 public 키워드를 사용하지 않아도 참조가 가능하다.

class A {

}

package ch06.sec13.exam01.package1;

public class B {
    //필드 선언
    A a; //정상참조. 동일한 패키지일 경우에는 접근자 상관없이 참조가능
}

package ch06.sec13.exam01.package2;

import ch06.sec13.exam01.package1.B;

public class C {
    //필드선언
//    A a; //참조불가능
    B b; //import문사용 참조가능
}

생성자의 접근 제한

  • 생성자는 public, default, private 접근 제한을 가질 수 있음


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch06.sec13.exam02.package1;

/*
 * 생성자 : 힙영역의 기억장소에 초기값
 * 생성자 접근제한자 : public, 생략 - default, private
 */

public class A {

    //클래스 내부에서 자기자신의 클래스를 객체생성가능(중요)
    //클래스 내부에서는 접근자가 의미가 있다.
    //필드선언
    A a1 = new A(true);
    A a2 = new A(1);
    A a3 = new A("문자열");

    //public 접근 제한 생성자 선언, 모든 패키지에서 접근가능
    public A(boolean b) {

    }
    //default 접근 제한 생성자 선언, 동일한 패키지에서 접근가능
    A(int b) {

    }
    //private 접근 제한 생성자 선언, 클래스 내부에서만 접근가능
    private A(String s) {

    }
}

package ch06.sec13.exam02.package1;

//동일한 패키지 입장에서 사용하는 예제
//A클래스의 생성자를 사용하는 경우

public class B {

    //필드선언
    A a1 = new A(true); //참조가능 public
    A a2 = new A(1); //참조가능 동일패키지이므로default가 public
//    A a3 = new A("문자열"); //참조불가능 private 이므로
}

package ch06.sec13.exam02.package2;

import ch06.sec13.exam02.package1.A;

//다른 패키지 입장에서 사용하는 예제
//A클래스의 생성자를 사용하는 경우

public class C {

    //필드선언
    A a1 = new A(true);//참조가능 public 모든 패키지에서 가능
//    A a2 = new A(1); //참조불가능 default는 다른 패키지인 경우는 private
//    A a3 = new A("문자열"); //참조불가능 private 이므로
}

필드와 메소드의 접근 제한

  • 필드와 메소드는 public, default, private 접근 제한을 가질 수 있음


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch06.sec13.exam03.package1;

/*
 * 필드, 메소드에 접근제한자 사용.
 * 클래스 내부에서는 접근자는 의미가 없다.
 */
public class A {

    public int field1;

    int field2; //default

    private int field3;

    public A() {
        field1 = 1; //참조가능
        field2 = 1; //참조가능
        field3 = 1; //참조가능

        method1(); //참조가능
        method2(); //참조가능
        method3(); //참조가능
    }

    public void method1() {

    }

    //default
    void method2() {

    }

    private void method3() {

    }
}

package ch06.sec13.exam03.package1;

public class B {

    public void method() {
        //객체생성
        A a = new A();

        //필드값 변경
        a.field1 = 1;
        a.field2 = 1; //default 동일패키지이므로 public반응과 동일
//        a.field3 = 1; //private이기 때문에 참조 불가능

        //메소드 호출
        a.method1(); //참조가능
        a.method2(); //참조가능 default 동일패키지이므로 public반응과 동일
//        a.method3(); //private이기 때문에 참조 불가능
    }

}

package ch06.sec13.exam03.package2;

import ch06.sec13.exam03.package1.*;

public class C {

    public C() {
        A a = new A();

        a.field1 = 1;
//        a.field2 = 1; default 필드 접근 불가(컴파일에러)
//        a.field3 = 1; private 필드 접근 불가(컴파일에러)

        a.method1();
//        a.method2(); default 필드 접근 불가(컴파일에러)
//        a.method3(); private 필드 접근 불가(컴파일에러)
    }


}

'객체 지향 프로그래밍 - 클래스' 카테고리의 다른 글

싱글톤 패턴  (0) 2023.01.17
Getter와 Setter  (0) 2023.01.17
패키지  (0) 2023.01.17
final 필드와 상수  (0) 2023.01.16
정적 멤버  (0) 2023.01.16