[Book Review] JAVA의 신 (5)

Tony Kim·2021년 10월 13일
0
post-thumbnail

[Book Review] JAVA의 신 (5)

CH9. 패키지와 접근 제어자

1) 패키지

클래스를 구분짓는 폴더의 개념
java패키지라는 폴더 만들고 그 폴더에서 dir 명령어
package java파일 컴파일
자바는 해당 패키지의 가장 상위 디렉토리 (root 디렉토리)에서 실행해야만함

패키지 선언문

package c.javapackeag;

조건

  • 소스의 가장 첫 줄에 있어야만 한다
    만약 packeage선언 위에 주석이나 공백이 있어도 상관은 없다. 하지만, 다른 자바 문장이 하나라도 있으면 컴파일이 제대로 되지 않는다.
  • 패키지 선언은 소스 하나에는 하나만 있어야한다.
    한 소스 파일이 두개의 폴더에 한 번에 존재할 수 없기 때문에
  • 패키지 이름과 위치한 폴더 이름이 같아야만 한다. 만약 자바파일 만들어놓고 폴더의 이름과 선언된 패키지 이름이 다를 경우 javac로 컴파일하려고 하면 파일 찾지 못해 컴파일 되지 않음
  • 패키지 이름이 java로 시작해서는 안됨

패키지 이름
1. java : 자바 기본 패키지
2. javax : 자바 확장 패키지
3. org : 일반적으로 비영리단체(오픈소스) 패키지
4. com : 일반적으로 영리단체(회사) 패키지

대부분의코드는 패키지 이렇게 시작. 대표적으로 오픈소스 그룹 아파치 코드들은 모두 org.apache로 시작

자바 패키지 이름 지정시 유의점

  • 패키지 이름 모두 소문자
  • 자바의 예약어를 사용하면 안됨.
  • 그 다음 하위 패키지
    catalina, coyote, el, jasper, juli, naming, tomcat 등의 여러 패키지 존재

import를 이용하여 다른 패키지에 접근하기

자바에서 패키지 있을 때 같은 패키지에 있는 클래스들과 java.lang패키지에 있는 클래스들만 찾을 수 있음.
다른 패키지에 있는 클래스 접근 = import

ex. 
package c.javapackage;
ㅤ
import c.javapackage.sub.Sub; 
// 자바 패키지 하위 sub 패키지의 클래스 Sub import

or

import c.javapackage.sub.* 
// 클래스가 너무 많은 경우
public class Package {
  public static void main(String[] args) {
  Sub sub = new Sub ();
  sub.subClassMethod(): 
  }
}

static 변수 접근하거나 static 메소드 사용할 때 import static 사용

a) import static 없다면

package c.javapackage;
ㅤ
import c.javapackage.sub.SubStatic;
ㅤ
public class PackageStatic {
  public static void main(String[] args) {
    SubStatic.subStaticMethod();
    System.out.println(SubStatic.CLASS_NAME);
  }
}

b) import static 한다면

package c.javapackage;
ㅤ
import static c.javapackagesub.SubStatic.subStaticMethod;
import static c.javapackage.sub.SubStatic.CLASS_NAME;
// or imort static c.javapackage.sub.SubStatic.*;
ㅤ
public class PackageStatic {
  public static void main(String[] args) {
    subStaticMethod();
    System.out.println(CLASS_NAME); 
  }
}

Q. 만약 package 클래스에 import한 동일한 이름의 static변수나 static메소드가 자신의 클래스에 있다면?
A. static 메소드나 변수가 중복되는 상황에서는자신의 클래스에 있는 static변수나 메소드가 import static으로 가져온 것보다 우선이다.

*import 하지 않아도 되는 패키지

  • java.lang 패키지
  • 같은 패키지




2) 자바의 접근 제어자 (Access Modifier)

접근 제어자 4개 (클래스 / 메소드 / 인스턴스 / 클래스변수 선언시)

package c.javapackage.sub;
ㅤ
public class AccessModifier {
  public void publicMethod() {  // 누구나 접근할 수 있음
  }
  protected void protectedMethod() { // 같은 패키지 내에 있거나 상속받은 경우
  }
  void packagePrivateMethod() { // 아무런 접근 제어자를 적어주지 않음 = package-private / 같은 패키지 내에 있을때만 접근할 수 있음
  }
  private void privateMethod() {  // 해당 클래스 내에서만 접근 가능
  }
}

Accessmodifier
클래스에 이 절의 시작부분에 있는 네 개의 메소드를 호출하는 클래스

package c.javapackage;
ㅤ
import c.javapackage.sub.AccessModifier;
ㅤ
public class AccessCall {
  public static void main(String args[]) {
  AccessModifier accessModifier = new AccessModifier();
  accessModifier.publicMethod();
  accessModifier.protectedMethod();
  accessModifier.packagePrivateMethod();
  accessModifier.privateMethod();
}

에러메세지 : 각 메소드에 대한 접근권한 얘기
접근 제어자 만든 이유?
ex. 메소드 구현했는데 그 메소드는 클래스 내에서만 호출할 수 있고 다른 클래스에서 절대 가져다 쓰면 안되는 경우 public (X) -> 접근 제어자로 통제

변수의 경우 직접 접근해서 변수를 변경 못하게 하고 꼭 메소드를 통해 변경이나 조회만 할 수 있도록 할 때 접근 제어자 많이 사용
ex. MemberDTO에서 name이라는 변수를 조회만 할 수 있도록 하려면 name이라는 변수는 private으로 선언하고, name값을 조회하는 메소드만 만들어 놓으면 됨. 그러면 값을 생성자로만 선언하고 아무도 그 값을 변경하지 못할 것

public class MemberDTO {
  private String name;
  public MemberDto(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
}

ㅤㅤㅤㅤ해당클래스안에서 같은패키지에서 상속받은클래스에서 import한클래스에서
publicㅤㅤㅤㅤㅤOㅤㅤㅤㅤㅤOㅤㅤㅤㅤㅤㅤㅤㅤㅤOㅤㅤㅤㅤㅤㅤㅤㅤㅤO
protectedㅤㅤㅤOㅤㅤㅤㅤㅤOㅤㅤㅤㅤㅤㅤㅤㅤㅤOㅤㅤㅤㅤㅤㅤㅤㅤㅤX
(package private)OㅤㅤㅤㅤㅤOㅤㅤㅤㅤㅤㅤㅤㅤㅤXㅤㅤㅤㅤㅤㅤㅤㅤㅤX
privateㅤㅤㅤㅤㅤOㅤㅤㅤㅤㅤXㅤㅤㅤㅤㅤㅤㅤㅤㅤXㅤㅤㅤㅤㅤㅤㅤㅤㅤX

public 누구나 / private 자기 클래스만

클래스 접근 제어자 선언할 때 유의점

  • 이외에 접근 제어자를 사용할 수 있는 곳은 클래스 선언문
  • 클래스 선언할 떄 반드시 파일 이름에 해당하는 클래스가 존재해야하는데 만약 Profile.java라는 소스코드에 Profile이라는 클래스를 public으로 선언하지 않고 같은 소스에 public으로 선언된 다른 클래스가 있다면, 이 소스는 컴파일되지 않음
    -> public으로 선언된 클래스가 소스 내에 있다면, 그 소스파일의 이름은 public인 클래스 이름과 동일해야함
profile
Back-end-dev

0개의 댓글