패키지 (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)
클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
- 변수나 메소드의 사용 권한은 다음과 같은 접근 제어자를 사용하여 설정할수 있다.
접근 제어자
: 접근 제어자는 하나만 사용 가능하다.
- public
- private
- protected
- (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
- 남궁 선, 「자바의 정석」, 도우출판
- 점프 투 자바
'프로젝트 개발 기록 > [개발] java | spring' 카테고리의 다른 글
[Java] 알아두면 좋을 것! (JDK, JRE, JVM, build, run) (0) | 2022.10.16 |
---|---|
[Java] 다형성(polymorphism), 추상 클래스, 인터페이스, 내부 클래스 (0) | 2022.10.12 |
[Java] 상속 (Inheritance), 오버라이딩, super, super() (0) | 2022.10.09 |
[Java] 클래스와 객체, 변수와 메서드, 오버로딩, 생성자 (0) | 2022.09.17 |
댓글