지구정복

[JAVA] 패키지와 접근 제한자 본문

데이터 엔지니어링 정복/JAVA & JSP

[JAVA] 패키지와 접근 제한자

eeaarrtthh 2020. 10. 28. 21:28
728x90
반응형

 패키지는 폴더와 같다. 뿐만 아니라 클래스를 유일하게 만들어주는 식별자 역할도 한다.

 

자바는 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다.

 

구조는 다음과 같다.

상위패키지.하위패키지.클래스

 

ㅁ패키지 선언

클래스를 작성할 때 해당 클래스가 어떤 패키지에 속할 것인지를 선언하는 것을 패키지 선언이라고 한다.

 

또한 패키지는 클래스의 일부이다. 그 이유는 클래스만 따로 복사해서 다른 곳으로 이동하면 클래스를 사용할 수 없다.

패키지도 같이 복사해줘야 한다.

 

양식은 아래와 같다.

package 상위패키지.하위패키지;

public class CalssName { ... }

 

*참고

만약 회사들 간에 협업해서 자바로 프로그램을 만든다고 하면 패키지명은 회사이름으로 하는 것이 관례이다.

com.samsung.projectName
com.hyundai.projectName
com.lg.projectName

 

 

ㅇimport 문

사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면, import문으로 해당 패키지의 클래스 또는 

 

인터페이스를 가져와 사용해야 한다. 양식은 아래와 같다.

import 상위패키지.하위패키지.클래스이름;

import 상위패키지.하위패키지.*;    //패키지의 모든 클래스를 가져오는 명령어

 

주의할 점은 상위패키지를 import했다고해서 하위 패키지까지 import되는 것이 아니다.

 

자바는 패키지 전체 이름으로 패키지를 식별하기 때문에

 

com.hankook과 com.hankook.project 는 서로 다른 패키지이다. 이 둘다 사용하려면 import문을 두 번 써줘야 한다.

 

 

ㅁ접근제한자

접근제한자는 접근을 제한하기 위해 사용된다.

 

접근이란 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 의미한다.

 

종류로는 아래와 같다.

  • public : 외부 클래스가 자유롭게 사용할 수 있다.
  • protected : 같은 패키지 또는 자식 클래스에서만 사용할 수 있다.
  • private : 개인적인 것이라 외부에서 사용될 수 없다.
  • default : 위 세 가지 접근제한자가 적용 안되면 적용되고, 같은 패키지에 소속된 클래스에서만 사용가능하다.

 

 

ㅁ클래스의 접근 제한

해당 클래스를 같은 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 것인지 결정해야 한다.

 

ㅇdefault 접근 제한

클래스 선언 시 접근 제한자 생략되면 default 가 자동적으로 된다.

 

같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한된다.

package sec06.exam03.package1;

    class A { }  //default 접근 제한


package sec06.exam03.package1;   //같은패키지

    public class B {
        A a;   // 사용가능, A클래스 접근가능
    }

 

ㅇpublic 접근 제한

클래스를 선언할 때 public 접근 제한자를 붙이면 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한없이

 

사용할 수 있다. 클래스를 다른 개발자가 사용할 수 있도록 라이브러리 클래스로 개발한다면 반드시 public 접근 제한을

 

갖도록 해야 한다.

package sec06.exam03.package1;

    class A { }  //default 접근 제한


package sec06.exam03.package1;   

    public class B {
        A a;   
    }
    
package sec06.exam03.package2;   //패키지가 위와 다름

    public class C {
        A a;   // 사용불가, A클래스는 default
        B b;   // 사용가능, B클래스는 public
    }

 

ㅁ생성자의 접근 제한

객체를 생성하기 위해서는 new 연산자로 생성자를 호출한다.

 

생성자는 네 개의 접근 제한자를 갖는다.

 

먼저 package1에서 클래스 A를 만들고 같은 패키지에서 클래스 B를 만들어서 A클래스를 사용한다.

현재 a3는 private 접근 제한이므로 클래스 B에서 사용할 수 없다.

다음으로 다른 패키지 package2에서 클래스 C를 만들어서 A클래스를 import한다음 사용한다.

a2와 a3는 각각 default, private 접근제한이므로 사용할 수 없고 public 접근 제한인 a1만 사용가능하다.

 

 

 

 

ㅁ필드와 메소드의 접근 제한

필드와 메소드를 선언할 때도 클래스 내부에서만 사용할 것인지 아니면 패키지 내에서만 사용할 것인지 아니면

 

다른 패키지에서도 사용할 것인지 결정해야 한다.

 

네 가지 접근 제한자를 갖는다.

 

아래 코드예시를 보면 먼저 A 클래스에서 같은 패키지 내에서 public, default, private 모두 사용 가능함을 알 수 있다.

같은 패키지 내에 있는 B 클래스에서는 private 필드와 메소드만 사용할 수 없다.

다른 패키지에서 클래스 C를 만들어서 사용해보자. A클래스를 import하면

여기서는 public 필드와 메소드만 사용할 수 있다.

 

 

 

ㅁGetter와 Setter 메소드

객체 지향 프로그래밍에서는 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막는다. 

 

그 이유는 외부에서 마음대로 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있기 때문이다.

 

이를 해결하기 위해 객체 지향 프로그래밍에서는 메소드를 통해서 필드를 변경하는 방법을 선호한다.

 

필드는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 필드에 접근한다.

 

그 이유는 메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있기 때문이다.

 

이러한 메소드가 Setter 이다.

 

 

외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다.

 

왜냐하면 필드값을 직접 사용하면 부적절한 경우도 있기 때문이다. 이런 경우 메소드로 필드값을 가공한 후

 

외부로 전달하는데 이런 메소드가 Getter 이다.

 

 

클래스를 선언할 때 가능하다면 필드를 private로 선언해서 외부로부터 보호하고, 필드에 대한 Setter와 Getter

 

메소드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋다.

 

 

만약 외부에서 필드값을 읽을 수만 있고 변경하지 못하도록 하려면(읽기전용) Getter 메소드만 선언하거나

 

Setter 메소드를 private 접근 제한을 갖도록 선언한다.

 

* 참고

이클립스에서 Getter/Setter 자동생성하기

필드 선언한 후 [Source] - [Generate Getter and Setter] 메뉴 선택 - 선언된 필드에 대한 자동 생성 대화상자 실행

 

 

아래는 예제 코드이다.

 

 

 

 

 

[참고] 혼자공부하는자바 - 신용권

728x90
반응형

'데이터 엔지니어링 정복 > JAVA & JSP' 카테고리의 다른 글

[JAVA] 타입변환과 다형성  (0) 2020.11.03
[JAVA] 상속  (0) 2020.10.28
[JAVA] 인스턴스 멤버와 정적멤버  (0) 2020.10.27
[JAVA] 메소드  (0) 2020.10.26
[JAVA] 생성자  (0) 2020.10.26
Comments