ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ch7 자바 객체] 패키지(package)와 import, 접근제어자(access modifier)
    프로그래밍 언어/JAVA 2022. 6. 17. 12:51
    패키지(package)란?

     

    패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 자신만의 패키지를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다. 

     

    예를들어 String 클래스의 실제 이름은 java.lang.String이다. java.lang 패키지에 속한 String클래스라는 의미이다. 그래서 같은 이름의 클래스일 지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다.

     

    클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다. 그래서 어떤 패키지에 소한클래스는 해당 디렉토리에 존재하는 클래스파일(클래스 이름.class)이어야 한다.

     

     

     

    패키지의 선언

     

    패키지를 선언하는 것은 아주 간단하며, 클래스나 인터페이스의 소스파일(.java)의 맨 위에 다음과 같이 한 줄만 적어주면 된다. 

    package 패키지명;

    위와 같은 패키지 선언문은 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어햐 하며, 하나의 소스파일에 단 한 번만 선언될 수 있다. 패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 위해 소문자로 하는 것을 원칙으로 하고 있다. 소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다. 결국 패키지를 지정하지 않는 모든 클래스들은 같은 패키지에 속하는 셈이다. 

     

     

     

    import문

     

    소스코드를 작성할 때 다른 패키지의 클래스를 사요아려면 패키지명이 포함된 클래스 이름을 사용해야 한다. 하지만, 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이 아니다. 따라서 클래스 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.

    java.util.Date today = new java.util.Date()

    import java.util.Date;
    Date today = new Date();

     

    import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여준다. 이클립스에서는 단축키 'ctrl+shift+o'를 누르면, 자동으로 import문을 추가해주는 편리한 기능을 제공한다. 

     

    모든 소스파일(.java)에서 import문은 package문 다음에, 그리고 클래스 선언문 이전에 위치해야 한다. import문은 package문과 달리 한 소스파일에 여러 번 선언할 수 있다. 

    import 패키지명.클래스명;
    or
    import 패키지명.*;

     

     

    static import문

     

    import문을 사용하면 클래스의 패키지명을 생략할 수 있는 것과 같이 static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용할 때 편리하며 코드도 간결해진다.

    import static java.lang.Integer.*; // Integer클래스의 모든 static 메서드
    import static java.lang.Math.random; //Math.random()만. 괄호 안붙인다.
    import static java.lang.System.out; //System.out을 out만으로 참조 가능

     

    만일 위와 같이 static import문을 선언했다면, 코드를 간략히 할 수 있다.

     

    ※ 예제 1번 ※

    package ch7;
    
    import static java.lang.Math.PI;
    import static java.lang.Math.random;
    import static java.lang.System.out;
    public class Ex7_6 {
    
    	public static void main(String[] args) {
    		//System.out.println(Math.random());
    		out.println(random());
    		//System.out.println("Math.PI:"+Math.PI);
    		out.println("Math.PI :" + PI);
    
    	}
    
    }

    예제 1번 출력 값

     

    자동으로 import 하는 방법 알아보기

     

    [자바 JAVA] 자동으로 import하는 꿀 방법

    수업 들으면서 import 따라하면 되니까 크게 어려움을 못 느꼈는데 GUI나가면서 import 때문에 문제가 많이 생겼다. 이리저리 찾느라 시간이 많이 걸려 자동으로 import하는 방법을 찾아보고 편리해

    wonisdaily.tistory.com

     

    단축키나 설정을 통해 자동으로 필요한 패키지를 import 하는 방법이 궁금하다면 위에 클릭해서 관련 포스팅 참고!

     

     

     

    제어자(modifier)

     

    제어자(modifier)는 클래스, 변수 또는 메서드의 선언부와 함께 사용되어 부가적인 의미를 부여한다. 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다.

    접근제어자 그 외
    public, protected, (default), public static, final, abstract, native, transient, synchronized, volatile, strictfp

     

    제어자는 클래스나 멤버변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다. 단, 접근 제어자는 한 번에 네가지 중 하나만 선택해서 사용할 수 있다. 제어자들 간의 순서는 관계 없지만 주로 접근 제어자를 제일 왼쪽에 놓는 경향이 있다. 접근제어자 외에도 여러 개가 있으나, static, final, abstract를 제외하고는 자주 사용되지 않는다. 

     

     

    static - 클래스의, 공통적인

     

    static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다. 인스턴스 변수는 하나의 클래스로부터 생성되었다라도 각기 다른 값을 유지하지만, 클래스 변수(static 멤버변수)는 인스턴스에 관계 없이 같은 값을 가진다. 그 이유는 하나의 변수를 모든 인스턴스가 공유하기 때문이다. static이 붙은 멤버변수와 메서드, 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다. 인스턴스와 static메서드의 근본적이 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다.

    static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭
    제어자 대상 의미
    static 멤버변수 - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
    - 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
    - 클래스가 메모리에 로드될 때 생성된다.
    메서드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
    -static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

     

    인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static메서드로 선언하는 것을 고려해보도록 하자. 가능하다면 static 메서드로 하는 것이 인스턴스를 생성하지 않고도 호출이 가능해서 더 편리하고 속도도 더 빠르다.

     

    class StaticTest{
    	static int width=200; //클래스 변수(static 변수)
    	static int height=120; //클래스 변수(static 변수)
    	
    	static { //클래스 초기화 블럭
    		
    	}
    	
    	static int max(int a, int b) { //클래스 메서드(static 메서드)
    		return a>b ? a:b;
    	}
    }

     

     

    final - 마지막의, 변경될 수 없는

     

    final은 '마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다. 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다. final 클래스의 대표적인 예는 String과 Math이다.

    final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수
    제어자 대상 의미
    final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 
    그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
    메서드 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
    멤버변수 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
    지역변수
    final class FinalTest{ //조상이 될 수 없는 클래스
    	final int MAX_SIZE = 10; //값을 변경할 수 없는 멤버변수
    	
    	final int getMaxSize() { //오버라이딩할 수 없는 메서드(변경불가)
    		final int LV = MAX_SIZE; //값을 변경할 수 없는 지역변수
    		return MAX_SIZE;
    		
    	}
    	
    }

     

     

    abstract - 추상의, 미완성의

     

    abstract는 '미완성'의 의미를 가지고 있다. 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용된다. 추상클래스는 아직 완성되지 않은 메서드가 존재하는 미완성 설계도 이므로 '인스턴스'를 생성할 수 없다.

    abstract가 사용될 수 있는 곳 - 클래스, 메서드
    제어자 대상 의미
    abstract 클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
    메서드 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
    abstract class Abstractest { //추상 클래스 (추상 메서드를 포함한 클래스)
        abstract void move() ; //추상 메서드(구현부가 없는 메서드)
    }

     

     

    접근 제어자(access modifier)

     

    접근 제어자는 멤버 또는 클래스에 사용되어, 해당되는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다. 접근 제어자가 default임을 알리기 위해 실제로 default를 붙이지 않는다. 

    접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
    private 같은 클래스 내에서만 접근이 가능하다.
    (default) 같은 패키지 내에서만 접근이 가능하다.
    protected 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.
    public  접근 제한이 없다.

    public은 접근 제한이 전혀 없는 것이고, private는 같은 클래스 내에서만 사용하도록 제한하는 가장 높은 제한이다.

    반응형

    댓글

Designed by Tistory.