클래스를 구분짓는 폴더의 개념
java패키지라는 폴더 만들고 그 폴더에서 dir 명령어
package java파일 컴파일
자바는 해당 패키지의 가장 상위 디렉토리 (root 디렉토리)에서 실행해야만함
패키지 선언문
package c.javapackeag;
조건
패키지 이름
1. java : 자바 기본 패키지
2. javax : 자바 확장 패키지
3. org : 일반적으로 비영리단체(오픈소스) 패키지
4. com : 일반적으로 영리단체(회사) 패키지
대부분의코드는 패키지 이렇게 시작. 대표적으로 오픈소스 그룹 아파치 코드들은 모두 org.apache로 시작
자바 패키지 이름 지정시 유의점
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 하지 않아도 되는 패키지
ㅤ
ㅤ
ㅤ
ㅤ
접근 제어자 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 자기 클래스만
클래스 접근 제어자 선언할 때 유의점