🟨 목 차 🟨
1. 패키지는 그냥 폴더 개념이 아니예요
2. 자바의 접근 제어자
2-1. 클래스 접근 제어자 선언할 때의 유의점
◼️ 1. 패키지는 그냥 폴더 개념이 아니예요 ◼️
자바에는 패키지 라는 것이 있다. 자바에서는 우리가 작성하는 클래스들을 구분 짓는 폴더와 비슷한 개념이다.
패키지 선언을 할 때 꼭 지켜야 하는 제약사항
- 소스의 가장 첫 줄에 있어야만 한다. [ 만약 package선언 위에 주석이나 공백이 있어도 상관은 없다. 하지만, 따른 자바 문장이 하나라도 있으면 컴파일이 제대로 되지 않는다. ]
- 패키지 선언은 소스 하나에는 하나만 있어야 한다. [ 한 소스 파일이 두개의 폴더에 한번에 존재 할 수 없기 때문에 당연하다. ]
- 패키지 이름과 위치한 폴더 이름이 가아야만 한다.
- 패키지 이름을 지정할 때 java로 시작해서는 안된다.
◼️ 1-1. 패키지 이름은 이렇게 지어요.
자바 패키지 이름을 지정할 때 유의점
- 패키지 이름을 지정할 때 java로 시작하면 안된다.
- 패키지 이름은 모두 소문자로 지정해야 한다. [ 반드시는 아니지만 소문자로 사용하기로 약속이 되어 있다. 나는 패키지 이름을 대문자로 시작을 했는데, 이 사실을 알고서 대문자를 소문자로 변경을 해주었다. ]
- 자바의 예약어를 사용하면 절대 안된다. int, satic 등의 단어가 패키지 이름에 들어 있으면 안된다. 예를 들어 com.int.util과 같이 패키지 이름에 int와 같은 예약어가 포함되어 있으면 안된다.
◼️ 1-2. import를 이용하여 다른 패키지에 접근하기
자바에서는 패키지가 있을 때, 같은 패키지에 있는 클래스들과 java.lang 패키지에 있는 클래스들만 찾을 수 있다.
다른 패키지에 있는 클래스에 접근하는 방법을 알아보자.
==> 다른 패키지에 있는 클래스를 찾지 못할때 사용하는 것이 바로 import라는 예약어 이다. 예시를 들어 설명해보겠다.
[EX]
만약에 c.package라는 패키지에 위치하는 클래스가 있고, c.package.sub라는 패키지에 위치하는 클래스가 있다. 이 둘의 클래서는 서로 사용하지 못한다.
==> 만약 c.package라는 패키지에 위치하는 클래스가 c.package.sub라는 패키지에 위치하는 클래스를 사용하기 위해선
import 단어 뒤에 "패키지이름.클래스이름"을 명시해주어 사용하고 그 패키지에 있는 클래스를 사용하겠다는 말이다.
즉, import c.javapackage.sub.sub; 를 입력하여 사용한다.
import를 하는 클래스가 컴파일이 안되어서 에러가 발생될 수 있다고 생각하는데 미리 컴파일을 할때 import를 할 클래스를 컴파일을 한 후 호출을 하기때문에 걱정은 안해도 된다.
import를 사용하게 되면 c.package 패키지에 import하고 하는 클래스가 100개 일 경우 100개의 import를 해야 할 경우에는 어떻게 할까?
==> import c.package.sub.*; 을 사용하면 된다.
위의 .*의 의미는 sub 패키지에 있는 모든 패키지를 import한다.
주의할점은 import c.*; 을 한다고 해서 c패키지 밑에 있는 모든 패키지를 import 할 것이라고 생각하는데 c패키지에 선언된 클래스만 improt한다.
static한 변수와 staitic 메소드를 사용할때는 명시적으로 지정을 해야한다.[ ex) import static c.package.sub.SubStatic.subStaticMethod; ] << 여기서 SubStatic는 Static 메소드와 변수를 가진 클래스
하지만 *을 이용하면 편하게 사용할 수 있다. [ ex) import static c.package.sub.SubSatic.*; ]
static 메소드나 변수가 중복되는 상황에서는 자신의 클래스에 있는 static 변수나 메소드가 import static으로 가져온 것보다 우선이다.
import를 하지 않아도 되는 패키지
- java.lang 패키지 [ ex) String, System
- 같은 패키지
[정리]
자바 패키지에서 가장 중요한 사실은 패키지가 같은지 다른지에 따라서 Import 여부가 결정된다.
즉, 폴더 구조상 상위 패키지에 있는 클래스와 하위 패키지에 있는 클래스의 상관관계는 자바 언어상에서 전혀 없다.
◼️ 2. 자바의 접근 제어자 ◼️
자바의 접근 제어자에는 4개가 있다.
접근 제어자는 클래스, 메소드, 인스턴스 및 클래스 변수를 선언할 때 선언한다.
- public : 누구나 접근할 수 있도록 할 때 사용한다.
- protected : 같은 패키지 내에 있거나 상속받은 경우에만 접근할 수 있다.
- package-private : 아무런 접근 제어자를 적어주지 않을 때이며, 같은 패키지 내에 있을때만 접근 가능하다.
- private : 해당 클래스 내에서만 접근 가능하다.
[EX]
package part8;
public class AccessModifier {
public void publicMethod() {
}
protected void protectedMethod() {
}
void packagePrivateMethod() {
}
private void privateMethod() {
}
}
package part9;
import part8.AccessModifier;
public class AccessCall {
public static void main(String[] args) {
AccessModifier accessModifier = new AccessModifier();
accessModifier.publicMethod();
accessModifier.publicMethod();
accessModifier.protectedMethod(); //improt를 하더라도 같은 패키지나 상속받은 경우가 아니라 에러가 뜬
accessModifier.packagePrivateMethod(); //improt를 하더라도 같은 패키지나 상속받은 경우가 아니라 에러가 뜬다.
accessModifier.privateMethod(); //improt를 하더라도 같은 클래스가 아니라서 사용할 수 없다.
}
}
위의 코드를 보게되면 part9 패키지에 있는 AccessCall클래스에서 part8에 있는 AccessModifier클래스를 Import를 했다.
하지만 protectedMethod()는 improt를 하더라도 같은 패키지나 상속받은 경우가 아니라 에러가 뜬다.
packagePrivateMethod()는 improt를 하더라도 같은 패키지나 상속받은 경우가 아니라 에러가 뜬다.
privateMethod()는improt를 하더라도 같은 클래스가 아니라서 에러가 뜨게 된다.
<접근제어자>
은행을 예로 들어보면,
- public : 은행 창구
- protected : 은행 창구의 직원 자리
- package-private : 지점장실
- private : 금고
==> public은 아무나 들어갈 수 있고, protected는 직원만 들어갈 수 있고, package-privae는 회사 직원이라도 높은 사람들만 들어갈 수 있는 지점장실, private는 아무도 못들어가는 거라고 생각할 수 있다.
◼️ 2-1. 클래스 접근 제어자 선언할 때의 유의점
앞에서 배운 접근 제어자는 메소드에 대한 내용이였다. 메소드에 대한 접근 제어자는 인스턴스 변수와 클래스 변수, 클래스에도 동일하게 적용하면 된다.
클래스를 선언할 때에는 반드시 파일 이름에 해당하는 클래스가 반드시 존재해야만 한다고 했다.
만약 Profile.java라는 소스코드에 Profile이라는 클래스를 public으로 선언하지 않고, 같은 소스에 Public으로 선언된 다른 클래스가 있다면, 이 소스는 컴파일이 되지 않는다.
- pacakage-private로 클래스를 여러개 선언해도 정상적으로 컴파일이 된다.
- public 접근 제어자 클래스와 pacakage-private 접근 제어자 클래스가 같이 있어도 정상적으로 컴파일이 된다.
- public 접근 제어자 클래스를 여러개 선언을 하게 되면 정상적으로 컴파일이 되지 않는다.
==> 즉, public으로 선언된 클래스가 소스 내에 있다면, 그 소스 파일의 이름은 public인 클래스 이름과 동일해야만 한다.
'JAVA > 자바의신 1' 카테고리의 다른 글
11장 매번 만들기 귀찮은데 누가 만들어 놓은 거 쓸 수 없나요? (0) | 2022.09.08 |
---|---|
10장 자바는 상속이라는 것이 있어요 (1) | 2022.09.07 |
8장 참조 자료형에 대해서 더 자세히 알아보자. (0) | 2022.09.06 |
7장 여러 데이터를 하나에 넣을 수는 없을까?(배열) (0) | 2022.09.03 |
6장 제가 조건을 좀 따져요(if ,for, while, continue, break) (0) | 2022.09.03 |