선장님과 함께하는 자바 스터디입니다.
자바 스터디 Github
github.com/whiteship/live-study
나의 Github
github.com/cmg1411/whiteShip_live_study
- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- -classpath 옵션
- 접근지시자
package
- 패키지는 서로 연관성있는 클래스나 인터페이스들을 모아놓은 폴더이다.
- 하나의 프로젝트에서 다른 패키지라면 같은 이름의 클래스를 만들 수 있는 이유는 패키지가 클래스를 유일하게 하기 때문이다.
- Car 이라는 이름의 클래스를 scr/main/java 의 com.whiteship.white_ship_study 에 week7 이라는 패키지를 만들고 그안에 클래스를 만들었다고 치자.
- 그럼 그 Car의 풀 네임은 아래와 같다. 또, 이를 FQCN 이라 한다. (Fully Qualified Class Name)
com.whiteship.white_ship_study.week7.Car
- 클래스를 작성하는 창에서, 해당 클래스가 어떤 패키지에 정의되었는지 package 키워드를 사용하여 파일 제일 위에 선언한다.
- package 구문은 한 파일당 한번만 사용 가능하다.
- 패키지 이름은 모두 소문자로 하는 것이 컨벤션이다.
package com.whiteship.white_ship_study.week7.fqcn; // 현재 클래스의 패키지
public class Main {
public static void main(String[] args) {
java.lang.Integer age = 27; // FQCN 으로 Integer 클래스 정의
}
}
자바의 모든 클래스는 반드시 하나 이상의 패키지에 포함되어야 한다.
패키지를 명시하지 않은 클래스는 모두 unnamed package 에 포함된다.
따라서 컴파일시 패키지를 명시하지 않은 패키지와 인터페이스들은 같은 패키지에 위치하게 된다.
Built-in-package
패키지는 두 종류로 나뉜다.
1. built in package 2. user-defined package
2번은 사용자가 만든 패키지이다.
1번 빌트인 패키지는 자바가 제공하는 패키지이다. 이 패키지에는 자바가 제공하는 사용자가 많이 사용하는 클래스들이 들어 있다.
docs.oracle.com/javase/8/docs/api/
import
- 하나의 자바 파일에서 다른 클래스를 이용할 수 있다.
- 만약 사용하려는 클래스가 같은 패키지라면 그냥 사용할 수 있겠지만, 다른 클래스라면 클래스의 이름을 FQCN 으로 정의해야 한다.
package com.whiteship.white_ship_study.week7.fqcn;
public class Main {
public static void main(String[] args) {
org.springframework.web.method.HandlerMethod handlerMethod;
}
}
- 하지만 매번 이런 풀네임을 적기는 너무 번거롭고, 코드도 더러워진다.
- 이때 import 라는 것을 사용해야 한다.
- import 구문에 FQCN 으로 클래스를 정의하면 그 클래스 이름만으로 사용할 수 있다.
package com.whiteship.white_ship_study.week7.fqcn;
import org.springframework.web.method.HandlerMethod;
public class Main {
public static void main(String[] args) {
HandlerMethod handlerMethod;
}
}
import * (와일드카드)
- 해당 패키지의 모든 클래스를 한꺼번에 임포트하고 싶다면, * 와일드카드를 쓰면 된다.
import com.whiteship.white_ship_study.week7.fqcn.*;
public class WildCard {
public static void main(String[] args) {
Phone p = new Phone();
Car c = new Car();
}
}
- 팀이나 회사에 따라 이 와일드카드를 쓰자, 쓰지말자의 컨벤션을 정하는 경우가 많으므로 팀에 맞게 사용하자.
Java.lang
- 특별히 빌트인 패키지 중 java.lang 패키지의 클래스들은 사용자들이 엄청 많이 사용하므로, import 구문을 쓰지 않아도 사용 가능하다.
Static import
- static import 는 조금 의미가 다르다.
- 정적인 요소들은 JVM 이 구동될 때 읽어져서 Method Area 에 올라가 에플리케이션 전반에서 사용가능하다고 배웠다.
- 그런데 이 정적인 요소들을 쓸 때, 다른 패키지라면 패키지명을 붙여줘야 한다.
package com.whiteship.white_ship_study.week7.fqcn;
public class Util {
public static final String NAME = "Mingeor";
private int age;
public Util(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public static void print() {
System.out.println("Hello");
}
}
package com.whiteship.white_ship_study.week7.importEx;
public class StaticImport {
public static void main(String[] args) {
System.out.println(com.whiteship.white_ship_study.week7.fqcn.Util.NAME);
com.whiteship.white_ship_study.week7.fqcn.Util.print();
}
}
위 처럼 말이다. 하지만 이 클래스에서 NAME 변수를 여러번 써야 한다면?
이 패키지를 다 쓰라고? 너무 불편하지.
그래서 이 정적 요소들을 위한 static import 가 있다 !
package com.whiteship.white_ship_study.week7.importEx;
import com.whiteship.white_ship_study.week7.fqcn.Util;
import static com.whiteship.white_ship_study.week7.fqcn.Util.NAME;
import static com.whiteship.white_ship_study.week7.fqcn.Util.print;
// import static com.whiteship.white_ship_study.week7.fqcn.Util.*;
public class StaticImport {
public static void main(String[] args) {
Util u = new Util(10);
System.out.println(NAME);
print();
}
}
메서드던 필드던 static으로 선언된 요소들을 import static 패키지/클래스/요소이름 으로 static import 를 하면 이후 코드작성에서 패키지이름을 적지 않아도 된다.
이때도 와일드 카드를 선언할 수 있는데, import 에서는 패키지 이후 * 로 모든 클래스를 임포트했다면,
static import 는 클래스이후 * 를 적어서, 그 클래스의 모든 정적 요소들을 임포트할 수 있다.
클래스패스 (classpath)
1주차 과제에서 배운내용을 복습해보면, 자바 컴파일러는 자바 코드를 바이트코드로 컴파일하고,
클래스로더는 이 바이트코드를 보고 필요한 클래스를 동적으로 로딩하여 메모리에 올린다.
클래스로더는 상세히 보면 아래의 세가지 클래스로더로 구성되어 있다.
- rt.jar 파일에는 우리가 자주 쓰는 io, lang, math, util 패키지를 포함하여 많은 패키지의 클래스들이 있다.
- 이 JDK 의 클래스들은 BootStrap ClassLoader 가 자동으로 메모리에 적재시키기 때문에 사용자가 외부 다운로드 없이 사용할 수 있는 것이다.
여기서 세번째 클래스로더인 Application ClassLoader.
JVM이 바이트코드를 실행할 때, 임포트한 클래스들의 바이트코드가 필요할 것이다.
classpath 는 이 임포트한 클래스들, 즉 바이트코드를 실행할 때 필요한 .class 파일들이 위치한 경로이다.
클래스로더는 classpath라는 경로를 보고 그 경로에서 필요한 바이트코드를 로딩하게 된다.
현재 클래스패스 보기
public class ClassPath {
public static void main(String[] args) {
String classPath = System.getProperty("java.class.path");
System.out.println(classPath);
}
}
CLASSPATH 환경변수
CLASSPATH 를 환경변수로 설정하면, 컴퓨터의 모든 자바 어플리케이션이 이 경로를 참고하여 클래스로더를 실행하게 된다.
하지만 이렇게 되면 다른 컴퓨터에서 자바 에플리케이션을 실행할 때 전에 설정한 classpath 경로를 설정해줘야 한다.
요즘은 IDE 에서 classpath 를 설정해주기 때문에 환경변수 설정은 굳이 필요하지 않다.
-classpath 옵션
명령창에서 javac, java 로 컴파일과 실행할 때, 이 옵션을 주면 그 경로를 참고해서 컴파일하고 실행시킬 수 있다.
줄여서 -cp 로도 가능하다.
접근지정자
접근지정자는 캡슐화를 할 수 있는 핵심 키워드다.
클래스, 메서드, 필드의 접근 범위를 적절하게 제한하여 정보를 제공할 수 있다.
1. public : 모든 접근을 허용. 어떠한 클래스가 접근을 하든 모두 허용됩니다.
2. protected : 상속받은 클래스 or 같은 패키지에서만 접근이 가능.
3. default(package-private)(비워두는 경우) : 기본 제한자, 자신 클래스 내부와 같은 패키지 내에서만 접근이 가능.
4. private : 외부에서 접근이 불가능. 같은 클래스 내에서만 접근이 가능.
- 클래스는 Public, default 접근 지시자만 사용할 수 있다.
- java 8 의 interface 의 추상메서드는 public 만 가능하다. (java 9 부터는 private 도 지원)
- 추상 클래스의 추상메서드는 private 빼고 가능하다.
참고 :
kils-log-of-develop.tistory.com/430
www.notion.so/ed8e346f88f54849a06ff968b1877ca5
velog.io/@jaden_94/7%EC%A3%BC%EC%B0%A8-%ED%95%AD%ED%95%B4%EC%9D%BC%EC%A7%80
'WhiteShip Java Study : 자바 처음부터 멀리까지' 카테고리의 다른 글
예외 처리 (0) | 2021.02.05 |
---|---|
인터페이스 (0) | 2021.02.04 |
디스패치, 다이나믹 디스패치, 더블 디스패치 (2) | 2021.02.01 |
상속 (0) | 2021.02.01 |
클래스 (0) | 2021.01.30 |