본문 바로가기
프로젝트 개발 기록/[개발] java | spring

[Java] package와 import, 제어자

by HelloJudy 2022. 10. 11.

패키지 (package)

서로 관련된 클래스의 묶음

 

  • 클래스의 실제 이름(full name)은 패키지를 포함. (java.lang.String)

 

✔️ 패키지의 선언

  • 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
  • 패키지 선언이 없으면 이름없는 (unnamed) 패키지에 속하게 된다.

 

package com.codechobo.book;

 

 

  • src 아래에서 New -> Package 로 패키지를 생성할 수 있다.

 

  • 패키지를 생성하면 class를 생성할 수 있다.

 

  • 다음과 같이 패키지 선언이 자동으로 삽입된다.

 

패키지 사용 이유

  • 클래스의 분류가 용이하다. (비슷한 것 끼리 묶는다)
  • 패키지가 다르다면 동일한 클래스명을 사용할 수 있다.

 


import문

클래스를 사용할 때 패키지이름을 생략할 수 있다.

 

  • 클래스를 사용할 때 패키지 이름을 생략할 수 있다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다.
import java.util.Date;

class ImportTest {
	Date today = new Date();
}

 

  • 기본 패키지: java.lang패키지 / String, Object, System, Thread ...

 

✔️ import문의 선언

import 패키지명.클래스명;
또는
import 패키지명.*;
  • *은 모든 클래스

 

✔️ static import문

static멤버를 사용할 때 클래스 이름을 생략할 수 있게 한다.

 

import static java.lang.System.out;

class StaticImportEx1 {
	public static void main(String[] args) {
    out.println(random());
    }
 }

 

: static import를 사용하면 코드를 짧게 쓸 수 있다.

 

 


제어자(modifier)

클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  • 변수나 메소드의 사용 권한은 다음과 같은 접근 제어자를 사용하여 설정할수 있다.

 

접근 제어자

: 접근 제어자는 하나만 사용 가능하다.

  1. public
  2. private
  3. protected
  4. (default)

그 외

  • static
  • final
  • abstract
  • native
  • transient

 

✔️ static

클래스의, 공통적인

 

static 사용 대상

  • 맴버 변수
    • 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
    • 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
    • 클래스가 메모리에 로드될 때 생성된다.
  • 메서드
    • 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
    • static메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다. (iv는 객체를 생성해야 사용 가능한데 static메서드를 쓸 땐 인스턴스 생성 없이 호출될 수도 있어서)

 

✔️ final

마지막의, 변경될 수 없는

 

final 사용 대상

  • 클래스
    • 변경될 수 없는 클래스. 확장될 수 없는 클래스가 된다.
    • 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. (상속X) (상속 계층의 마지막)
    • ex) String (보안 때문에), Math (static 메서드 집합이라서)
  • 메서드
    • 변경될 수 없는 메서드. final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
  • 멤버변수, 지역변수
    • 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.

 

✔️ abstract 

추상의, 미완성의

 

abstract 사용 대상

  • 클래스
    • 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
    • 추상 클래스 (미완성 설계도)
  • 메서드
    • 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
    • 추상 메서드 (미완성 메서드): 구현부가 없는 메서드

 

abstract class AbstractTest {
	abstract void move();
}

 

AbstractTest a = new AbstractTest(); // 에러, 추상클래스의 인스턴스 생성불가.

: 객체를 만들기 위해선 추상 클래스를 상속받아서 완전한 클래스(구상 클래스)를 만든 후에 객체 생성 가능

 


접근 제어자(access modifier)

한 개만 사용 가능하다.

 

접근 범위

public > protected  > (default) > private

 

클래스에는 -> public, (default)만

멤버변수에는 -> public, protected, (defaul), private

 

✔️ private

접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메소드는 해당 클래스에서만 접근이 가능하다.

public class Sample {
    private String secret;
    private String getSecret() {
        return this.secret;
    }
}

 

✔️ (default)

접근 제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메소드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능하다.

 

package house;  // 패키지가 동일하다.

public class HouseKim {
    String lastname = "kim";  // lastname은 default 접근제어자로 설정된다.
}

 

package house;  // 패키지가 동일하다.

public class HousePark {
    String lastname = "park";

    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
        System.out.println(kim.lastname);  // HouseKim 클래스의 lastname 변수를 사용할 수 있다.
    }
}

 

✔️ protected

접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메소드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능하다.

 

  • house 패키지
package house;  // 패키지가 서로 다르다.

public class HousePark {
    protected String lastname = "park";
}

 

  • house.person 패키지
package house.person;  // 패키지가 서로 다르다.

import house.HousePark;

public class EungYongPark extends HousePark {  // HousePark을 상속했다.
    public static void main(String[] args) {
        EungYongPark eyp = new EungYongPark();
        System.out.println(eyp.lastname);  // 상속한 클래스의 protected 변수는 접근이 가능하다.
    }
}

 

다른 패키지라도 상속한 클래스의 protected 변수는 접근 가능하다.

당연히 다른 패키지의 다른 클래스면 접근 불가능하다.

 

✔️ public

접근제어자가 public으로 설정되었다면 public 접근제어자가 붙은 변수, 메소드는 어떤 클래스에서라도 접근이 가능하다.

package house;

public class HousePark {
    protected String lastname = "park";
    public String info = "this is public message.";
}

 

발그림

 


캡슐화와 접근 제어자

접근 제어자를 사용하는 이유

  • 외부로부터 데이터를 보호하기 위해서
  • 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서

 

접근 제어자를 private으로 하여 외부에서 직접 접근하지 못하도록 한다. (메서드를 통한 간접 접근)

public class time {
    private int hour;
    private int minute;
    private int second;

    public int getHour() { return hour; }
    public void setHour(int hour) {
        if (hour < 0 || hour > 23) return;
        this.hour = hour;
    }
}

 

 


📌 Reference

반응형

댓글