본문 바로가기

WhiteShip Java Study : 자바 처음부터 멀리까지

패키지

선장님과 함께하는 자바 스터디입니다.

자바 스터디 Github

github.com/whiteship/live-study

 

whiteship/live-study

온라인 스터디. Contribute to whiteship/live-study development by creating an account on GitHub.

github.com

나의 Github

github.com/cmg1411/whiteShip_live_study

 

cmg1411/whiteShip_live_study

✍ 자바 스터디할래. Contribute to cmg1411/whiteShip_live_study development by creating an account on GitHub.

github.com

 

  • 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/

 

Java Platform SE 8

 

docs.oracle.com

 

 

 

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주차 과제에서 배운내용을 복습해보면, 자바 컴파일러는 자바 코드를 바이트코드로 컴파일하고,

클래스로더는 이 바이트코드를 보고 필요한 클래스를 동적으로 로딩하여 메모리에 올린다.

 

클래스로더는 상세히 보면 아래의 세가지 클래스로더로 구성되어 있다.

Java 8 기준이다. 상위 버전에서는 JDK 내부 모듈 구조가 바뀌었다고 한다.

  • 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

gintrie.tistory.com/67

velog.io/@jaden_94/7%EC%A3%BC%EC%B0%A8-%ED%95%AD%ED%95%B4%EC%9D%BC%EC%A7%80

parkadd.tistory.com/45

'WhiteShip Java Study : 자바 처음부터 멀리까지' 카테고리의 다른 글

예외 처리  (0) 2021.02.05
인터페이스  (0) 2021.02.04
디스패치, 다이나믹 디스패치, 더블 디스패치  (2) 2021.02.01
상속  (0) 2021.02.01
클래스  (0) 2021.01.30