다른 패키지의 클래스를 호출하기

유사한 역할을 갖고있는 녀석들을 묶어 우리는 하나의 '패키지'로 관리하는것은 아실겁니다.

 

WorkSpace에서 확인해보면, 실제로도 별도의 폴더를 갖는 것을 볼 수 있습니다.

 

만약 위와같은 형태로 구조가 되어있고, LangMain.java에서 sample.java에 존재하는 클래스를 하나 갖고와 사용하려고 한다고 가정하겠습니다.

 

먼저 sample.java의 코드입니다.

 

간단하게 Sample이라는 클래스에 data라는 변수가 존재하는 것을 볼 수 있습니다.

 

이녀석을 LangMain.java에서 불러오기 위해서는 [ import ]를 통해 먼저 호출을 해줘야합니다.

 

import를 통해 호출하는 방식은 아래와 같습니다.

 

  • 특정 패키지의 하나의 클래스 호출하기

특정 클래스만 호출하기

 

  • 특정 패키지의 모든 클래스 호출하기

 

모든을 의미하는 별(*)을 이용하면 특정 패키지 이하의 모든 클래스를 호출합니다.

 

이렇게 호출된 클래스는 해당 코드에 존재하는 클래스와 동일한 방식으로 사용할 수 있습니다.

 

 

다만, 만약여러개의 클래스가 호출된 상태에서 클래스의 이름이 동일할 경우 import에서 단일 클래스를 호출했던것과 마찬가지로 패키지명을 포함한 모든 경로를 적어줘야합니다.

  1. ds3goj 2020.11.20 20:03

    도움되는 글 매우 잘 배우고 가요

1. Final 필드

Java에서는 Final이라는 통해 한번 정의된 변수의 값이 수정되지 못하도록 만들 수 있습니다.

 

class Math{

    final pi = 3.14;

    //final [타입] [필드명];

}

 

위와같은 형태로 만들어 줄 수 있습니다. 만약 클래스 내에서 필드(변수)를 초기화하지 않았다면, 단 한번 변수를 초기화 할 수 있습니다.

 

일반적으로 이와같은 녀석을 '상수'라고 부르는 경우가 종종있습니다.

 

왜냐하면, 수정이 불가능하기 때문이죠.

 

하지만, C언어에서 '상수'를 사용해본 경험이 있으신 분이라면, 조금 이상하다는 느낌을 받을 수 있습니다.

 

왜냐하면, 일반적으로 '상수'라는 녀석은 '전역변수'처럼 사용되기 때문입니다.

 

 

즉, 위와같이 클래스 내에서 final이라는 녀석을 통해 선언된 필드의 값은 클래스의 객체별로 서로 다른 값을 갖을 수 있다는 문제가 있습니다.

 

 

 

2. Static Final

위의 문제점을 해결하기 위하여 앞에 Static이라는 녀석을 붙여줍니다.

 

이전장에서, 그리고 처음 [JVM 메모리 관리]부분에서 언급했던것처럼 static이라는 녀석은 [메소드 영역]에서 관리되기 때문에 전역변수처럼 사용됩니다.

 

즉, static final로 선언된 값은 코드 전역에서 불편의 값을 갖는 필드, 즉 '상수'라고 불릴만한 자격을 갖게됩니다.

 

 

 

상수를 선언할 때에는 항상 

 

static final 필드 (=초기값);

 

위와같은 형태로 만들어줄 것! 꼭 기억합시다.

1. 인스턴스 멤버

인스턴스 멤버라고 불리는 녀석들은 클래스와 같은 객체를 생성했을 때, 함께 따라오는 '필드'와 '메소드'를 말합니다.

 

때문에 일반적인 '필드'와 '메소드'를 '인스턴스 필드'와 '인스턴스 메소드'라고 불러도 상관없습니다.

 

 

인스턴스 멤버가 갖고있는 특징은, [ 객체가 생성된 후 사용할 수 있다 ]라는 것입니다.

 

즉, Car라는 클래스가 존재하고, 여기에 'name'이라는 필드와 'go()'라는 메소드가 존재한다고 가정하면,

 

Car bmw = new Car(); 

 

라는 코드를 통해 객체를 생성한 후

 

bmw.name 또는 bmw.go() 라는 형태를 통해 접근이 가능하다는 특징을 갖고있습니다.

 

또한 [ Car benz = new Car(); ]라는 녀석을 통해 새로운 객체를 만들었다면, 당연하게도 benz가 참고하고있는 객체의 인스턴스 멤버는 bmw가 참조하는 인스턴스 멤버와 서로 다를수 있습니다.

 

 

 

2. 정적 멤버

일반적으로 'Static'이라는 녀석이 붙은 '필드'와 '메소드'를 정적 멤버라고 부릅니다.

 

public class Car {

    static String name;

    static void go() {...}

}

 

위와같은 클래스가 존재한다면, static으로 선언된 name과 go라는 필드와 메소드는 '정적멤버'입니다.

 

이 녀석들의 특징은 '객체'에 소속된 녀석들이 아닌, 클래스라는 녀석에 소속된 녀석들입니다.

 

즉, 위의 Car라는 클래스에 소속된 녀석이기 때문에 Car라는 클래스를 사용하는 모든 객체들은 동일한 필드와 메소드를 공유한다는 의미입니다.

 

또한, Static으로 선언된 녀석들은 앞서 [ JVM의 메모리 관리 ]부분에서 말씀드린것처럼 '클래스로더'가 코드를 읽는 과정에서 [메소드영역]에 올라가기 때문에 프로그램의 시작지점부터 호출될 수 있으며, 어디서든 호출이 가능하다는 특징을 갖고있습니다.

 

 

 

 

더보기

추가적으로 Class내에서 정적멤버를 초기화하는 방식은 두 가지가 있습니다.

1) 기본

public static Car {

    static String name;

}

 

2) 블록방식

public static Car {

    static String name;

 

    static {

        name = "The Name is BMW!";

    }

}

 

 

아래 블록방식은 클래스 로더가 static으로 선언된 부분을 읽어 수행한다는 것을 응용한 것으로 불 수 있습니다.

따라서 static으로 선언된 name이 먼저 메소드 영역에 올라가고, 이 후 static {...} 부분을 클래스로더가 실행하여 name이라는 값을 수정하게되도록 만들어주는 형태입니다.

+ Recent posts