패키지

반응형
반응형

패키지

- 클래스의 묶음
 - 클래스 파일을 한곳에 모아두는 역할을 한다.
 - 디렉토리 개념(폴더)

패키지를 만드는 방법

 

인텔리제이 기준 : mac => command + n
                            win => alt + insert 

결과

특징

 1. 패키지를 만들지 않는 상태에서, 클래스를 만들시, 기본 패키지라고 한다.

패키지가 등장하지 않는다,


 2. 패키지는 디렉토리처럼 하위 패키지를 만들 수 있다.

'.'으로 구분한다.


 3. 다른 패키지에 있을 경우, 동일한 이름의 클래스 파일을 만들 수 있다.
    - Basic이라는 자바 파일을 계속 만들었다.
 4. for,if등 이미 자바에서 사용된 예약어는 패키지로 사용이 불가능하다.
 

만드는 것은 가능하나, 패키지와 생긴것이 다르다,
클래스 파일을 만들 지 못한다.

import 키워드

 다른 패키지에 존재하는 자바 파일을 호출 할 때 사용한다.

준비
One 클래스 호출

- import문은 여러개 사용이 가능하다.
- 패키지.클래스 형식으로 표현된다.

결과

- 패키지.* 형식으로 표현할 수 있다.

같은 패키지에 있어야 생략 가능!

static import

 - 클래스 변수를 import할때 사용된다.
 - 대표적으로 Math가 있다.

기본사용

- static import를 사용될시, 메소드 명만 입력해도 호출이 가능!
- 일반 import와 큰 차이점은 메소드까지 들어간다. (메소드 *으로 생략가능)

static import import
패키지.클래스 패키지.클래스.메소드

주의점

  - 같은 이름으로 자바파일을 만들시

first에도 Client를 만들고,
자바소스에 패키지.클래스 형식으로 작성됨

- 임포트는 하지 않는다.

접근지시자

접근지시자에는 public, protected, default, private로 구분 되어있으며,
다음과 같은 그림으로 이해할 수 있다.

코드와 함께 비교해 가며 설명하자.

public

   - 접근지시자 중 최상층을 당담한다.
   - 모든 클래스에 접근이 가능하다.

예를 들어,

public class Public {
    public int a = 0;
}

위와 같은 코드가 있다고 가정하자.
모든 클래스에 접근이 가능하다고 했으니...

public class Client {
    public static void main(String[] args) {
        Public aPublic = new Public();
        aPublic.a = 3;
        System.out.print(aPublic.a);
    }
}

이렇게 한다면 a를 조작했으니 3이 나와야 한다.
괴연 그럴까?

결과

예상대로 3이 나왔다.
현재는 변수에만 사용했지만, 메소드, 클래스에도 모두 사용이 가능하다.
다만, 클래스는 딱 한개의 public만 사용이 가능하다.

하지만 이 접근지시자는 제한(limit)가 없기 때문에, 주의해서 사용해야한다.

protected 

 - 접근지시자 중 2번째를 당담한다.
 - 상속 상태이거나 같은 패키지에서는 public처럼 동작한다.

이것도 public과 똑같이 코드를 작성해보자.

public class Protected {
    protected int a = 0;
}

과연 이것은 정상적으로 실행될까?

public class Client {
    public static void main(String[] args) {
        Protected aProtected = new Protected();
        aProtected.a = 3;
        System.out.print(aProtected.a);
    }
}

이 코드 역시 정상적으로 실행된다. 
그 이유는 패키지가 같기 때문이다.

그렇다면 패키지가 다르다면 어떻게 될까?

컴파일 에러가 발생한다.

이 키워드도 메소드에는 사용이 가능하다.
클래스는 사용 불가

+) 상속일때는 다른 패키지도 가능하다.

public class Sub extends Protected {
    public Sub() {
        a = 3;
     }
}

public class Client{
    public static void main(String[] args) {
        Sub sub = new Sub();
        System.out.println(sub.a);
    }
}

default

 - 접근 지시자중 3번째를 당담한다.
 - 접근 지시자를 입력하지 않는 상태를 default라 한다.
 - 같은 패키지에 존재한다면 public처럼 동작한다.

상속을 사용할 때 주의할점이 있다.
같은 패키지에서 테스트하는 것은 의미 없다.

어차피 같은 패키지내에서는 접근이 가능하기 때문이다. 그래서 다른 클래스로 테스트 해봤다.

역시 되지 않는다.

default는 클래스, 메소드에 사용이 가능하다.
사용시, 다른 패키지에서는 사용이 불가능하다.

private

 - 접근 지시자중 마지막을 당담한다.
- 같은 클래스에서만 접근이 가능하다.

다른 곳에 호출이 불가능하다.

정보은닉화, 캡슐화등에서 사용된다.

메소드에만 사용이 가능하다.


생성자에서는 this사용이 불가능하다.

만약 this키워드를 사용하고 싶다면 메소드를 이용해야한다.

생성자에 private 접근 지시자를 사용할 경우,
생성이 불가능하게 만들 수 있다.
이 방법을 응용하면 디자인 패턴의 싱글톤 패턴을 만들 수 있다.

  같은 클래스 같은 패키지  상속 받은 클래스
 (다른 패키지)
다른 패키지
public 가능
protected 가능 불가능
(default) 가능 불가능
private 가능 불가능

클래스 패스

   컴파일된 class 파일들의 위치 경로

 *클래스 로더 : 실행 시에 필요한 클래스를 동적으로 메모리에 할당하는 역할을 한다.

  classpath 환경 변수

   mac에서 classPath 환경 변수 설정

      1. jdk설치
      2. vi ~/.bash_profile

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.9.jdk/Contents/Home
export PATH=${PATH}:$JAVA_HOME/bi

      3. source ~/.bash_profile
      4. echo $PATH

결과

-classpath 옵션

java -classpath <경로>< 클래스>

public class App {
    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.hello();
    }
}
public class Hello {
    public void hello() {
        System.out.println("Hello world");
    }
}

 

 

이렇게 2가지 코드를 작성하였다.

이를 실행하면 다음처럼 출력된다는 것을 알 수 있다.

이제 -classpath옵셥을 이용해서 이용해서 출력해보자.

java -classpath /Users/개인정보입니다/Desktop/intelij/whiteship/target/classes study.whiteship.homework7.App

처음에는 javac을 이용해서 컴파일 한뒤, 실행하려 했지만, 왜인지는 모르겠으나 실행이 되지 않았다.(이유를 알았다.)

더보기

참고로 위 정보는 인텔리제이에서 정보를 찾았다. 조금 길긴 하지만... 올려 보자.

java -classpath /Users/개인정보/Desktop/intelij/whiteship/target/classes:/Users/개인정보/.m2/repository/org/kohsuke/github-api/1.116/github-api-1.116.jar:/Users/개인정보/.m2/repository/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar:/Users/
개인정보/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.11.3/jackson-databind-2.11.3.jar:/Users/개인정보/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.11.3/jackson-annotations-2.11.3.jar:/Users/개인정보/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar:/Users/개인정보/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar:/Users/개인정보/.m2/repository/org/springframework/boot/spring-boot-starter/2.4.0/spring-boot-starter-2.4.0.jar:/Users/개인정보/.m2/repository/org/springframework/boot/spring-boot/2.4.0/spring-boot-2.4.0.jar:/Users/개인/.m2/repository/org/springframework/spring-context/5.3.1/spring-context-5.3.1.jar:/Users/개인/.m2/repository/org/springframework/spring-aop/5.3.1/spring-aop-5.3.1.jar:/Users/개인/.m2/repository/org/springframework/spring-beans/5.3.1/spring-beans-5.3.1.jar:/Users/정보/.m2/repository/org/springframework/spring-expression/5.3.1/spring-expression-5.3.1.jar:/Users/개인/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.4.0/spring-boot-autoconfigure-2.4.0.jar:/Users/정보/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.4.0/spring-boot-starter-logging-2.4.0.jar:/Users/개인/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/정보/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/개인/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar:/Users/정보/.m2/repository/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar:/Users/개인/.m2/repository/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar:/Users/정보/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/개인/.m2/repository/org/springframework/spring-core/5.3.1/spring-core-5.3.1.jar:/Users/정보/.m2/repository/org/springframework/spring-jcl/5.3.1/spring-jcl-5.3.1.jar:/Users/개인/.m2/repository/org/yaml/snakeyaml/1.27/snakeyaml-1.27.jar:/Users/정보/.m2/repository/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar study.whiteship.homework7.App

우리가 필요한 classpath를 제외한 나머지는 전부 지웠다. 
위 코드?를 살펴보면 jar도 classpath에 지정할 수 있구,
: 문자도 확인할 수 있다. 잘 모르겠지만 아마도 연결고리 느낌인듯 싶다.

자 이제 우리가 필요한 건 마지막 줄이다.
줄을 읽어보면

java -classpath /Users/개인정보/Desktop/intelij/whiteship/target/classes study.whiteship.homework7.App

이렇다는 것을 알 수 있다.

이는...

코드와 사진을 비교해보면,
../intelij/whiteship/target/calsses => ../ 인텔리제이 프로그램/프로젝트명/target/classes라는 것을 알 수 있고,

study.whiteship.homework7.App은 패키지와 클래스의 집합임을 알 수 있다.

위에서 javac으로 만들었을 때 안되는 문제점을 확인했다.
그것은...

패키지와자바파일은 앞에 두면 안되었다. 

java -classpath /Users/개인정보/Desktop/intelij/whiteship/target/classes study.whiteship.homework7.App

즉, 자바에서 만든 것은 패키지.클래스 형식으로 표시해야된다는 사실을 알 게 되었다.
그리고 자바에서 생성되지 않은 모든 폴더는 경로표시하는 방법을 따라야 했다.

 

참고
velog.io/@noyo0123/맥에서-자바-설치-82k3oh0d83    
인텔리제이 ♥ 

 

 

 

 

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

리플렉션  (0) 2021.01.01
Mockito 사용해보기  (0) 2020.12.31
Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test  (0) 2020.12.29
상속  (1) 2020.12.24
클래스  (0) 2020.12.15

댓글

Designed by JB FACTORY