패키지(package)
클래스의 일부분으로, 클래스를 유일하게 만들어주는 식별자 역할을 함.
클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다. (상위패키지.하위패키지.클래스)
* 프로젝트 할때 흔히 회사의 도메인 이름으로 패키지를 만들며 도메인 이름 역순으로 패키지 이름일 지어주는데, 포괄적인 이름이 상위 패키지가 되도록 하기 위해서이며, 마지막에는 프로젝트 이름을 붙여주는 것이 관례이다.
ex) com.samsung.projectname // org.apache.projectname
import문
사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면, import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줌.
import문은 패키지 선언과 클래스 선언 사이에 작성하고, 만약 사용하고자 하는 클래스들이 동일한 패키지 소속이라면 개별 import문을 작성하는 것보다는 *를 이용해서 해당 패키지에 소속된 클래스들을 사용할 것임을 알려주는 것도 좋은 방법이며, import문은 개수에 제한이 없고 얼마든지 추가할 수 있음.
// import문
package sec06.exam02.mycompany;
import sec06.exam02.hankook.*;
import sec06.exam02.kumho.*;
import sec06.exam02.hyundai.Engine;
public class Car {
// 필드
Engine engine = new Engine();
SnowTire tire1 = new SnowTire();
BigWidthTire tire2 = new BigWidthTire();
sec06.exam02.hankook.Tire tire3 = new sec06.exam02.hankook.Tire();
sec06.exam02.kumho.Tire tire4 = new sec06.exam02.kumho.Tire();
}
접근 제한자(Access Modifier)
말 그대로 접근을 제한하기 위해 사용되며, 클래스 및 인터페이스 그리고 이들이 가지고 잇는 멤버의 접근을 말하며 세가지 종류가 있음.
◉ public 접근 제한자: 외부 클래스가 자유롭게 사용할 수 있도록 함.
클래스 선언시 public 접근 제한자를 붙였다면, 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있음.
◉ protected 접근 제한자: 같은 패키지 또는 자식 클래스에서 사용할 수 있도록 함.
◉ private 접근 제한자: 개인적인 것이라 외부에서 사용될 수 없도록 함.
◉ default: 같은 패키지에 소속된 클래스에서만 사용할 수 있도록 함.(위의 세 가지 접근 제한자가 적용되지 않으면 default)
클래스를 선언할 때 public을 생략했다면 클래스는 default 접근 제한을 가지며, 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다은 패키지에서는 사용할 수 없도록 제한됨.
// 클래스의 접근 제한_1
package sec06.exam03.package1;
class A{} // default 접근 제한
// 클래스의 접근 제한_2
package sec06.exam03.package1;
public class B {
A a; // A클래스 접근 가능(필드로 선언할 수 있음)
}
// 클래스의 접근 제한_3
package sec06.exam03.package2; // 패키지가 다름
import sec06.exam03.package1.*;
public class C {
// A a; // A 클래스 접근 불가(컴파일 에러)
B b;
생성자의 접근 제한
생성자가 어떤 접근 제한을 갖는냐에 따라 호출 가능 여부가 결정되며 클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동으로 기본 생성자가 추가되는데, 자동으로 생성되는 기본 생성자의 겁근 제한은 클래스의 겁근 제한과 동일함. 클래스가 defult 접근 제한을 가지면 기본 생성자도 default 접근 제한을 가지고, 클래스가 public 접근 제한을 가지면 기본 생성자도 public 접근 제한을 가짐.
◉ public 접근 제한: 모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있도록 함.
◉ default 접근 제한: 같은 패키지에서는 아무런 제한 없이 생성자를 호출할 수 있으나, 다른 패키지에서는 생성자를 호출할 수 없도록 함.
◉ protected 접근 제한: 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록 하며, default와 차이점으로 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 생성자를 호출할 수 있음.
◉ private 접근 제한: 동일한 패키지이건 다른 패키지이건 상관없이 생성자를 호출하지 못하도록 제한함. 오로지 클래스 내부에서만 생성자를 호출할 수 있고 객체를 만들 수 있음.
// 생성자의 접근 제한_1
package sec.exam04.package1;
public class A {
// 필드
A a1 = new A(true);
A a2 = new A(1);
A a3 = new A("문자열");
// 생성자
public A(boolean b){} // public 접근 제한
A(int b){} // default 접근 제한
private A(String s){} // private 접근 제한
}
// 생성자의 접근 제한_2
package sec06.exam04.package1;
public class B {
// 필드
A a1 = new A(true);
A a2 = new A(1);
// A a3 = new A("문자열"); // private 생성자 접근 불가
}
// 생성자의 접근 제한_3
package sec06.exam04.package2; // 패키지가 다름
import sec06.exam04.package1.A;
public class C {
// 필드
A a1 = new A(true);
// A a2 = new A(1); // default 생성자 접근 불가
// A a3 = new A("문자열"); // private 생성자 접근 불가
* 싱글톤 패턴은 생성자를 private 접근 제한으로 선언하고, 자신의 유일한 객체를 리턴하는 getInstance() 정적 메소드를 선언함.
필드와 메소드의 접근 제한
필드와 메소드는 public, default, protected, private 접근 제한을 가질 수 있음.
◉ public 접근 제한: 모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용할 수 있도록 함.
◉ default 접근 제한: 필드와 메소드를 선언할 때 접근 제한자를 생략하면 default 접근 제한을 가지며, 같은 패키지에서는 아무런 제한 없이 필드와 메소드를 사용할 수 있으나 다른 패키지에서는 필드와 메소드를 사용할 수 없도록 함.
◉ protected 접근 제한: 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있도록 하고, default와 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메소드를 사용할 수 있다.
◉ private 접근 제한: 동일한 패키지이건 다른 패키지이건 상관없이 필드와 메소드를 사용하지 못하도록 제한함. 오로지 클래스 내부에서만 사용할 수 있음.
// 필드와 메소드의 접근 제한
package sec06.exam05.package1;
public class A {
// 필드
public int field1; // public 접근 제한
int field2; // default 접근 제한
private int field3; // private 접근 제한
// 생성자
public A() {
field1 = 1
field2 = 1;
field3 = 1;
method1();
method2();
method3();
}
// 메소드
public void method1(){} // public 접근 제한
void method2(){} // default 접근 제한
private void method3(){} // private 접근 제한
}
Getter와 Setter 메소드
필드는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 필드에 접근하도록 유도함.
필드의 값을 외부로 리턴해주는 메소드를 Getter라고 하고 외부에서 값을 받아 필드를 변경하는 메소드를 Setter라고 함.
// Getter와 Setter 메소드 선언
package sec06.exam06;
public class Car {
// 필드
private int speed;
private boolean stop;
// 생성자
// 메소드
public int getSpeed(){
return speed;
}
public void setSpeed(int speed) {
if(speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
public boolean isStop(){
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
this.speed = 0;
}
}
// Getter와 Setter 메소드 사용
package sec06.exam06;
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
// 잘못된 속도 변경
myCar.setSpeed(-50);
System.out.println("현재 속도:" + myCar.getSpeed());
// 올바른 속도 변경
myCar.setSpeed(60);
// 멈춤
if(!myCar.isStop()) {
myCar.setStop(true);
}
System.out.println("현재 속도:" + myCar.getSpeed());
}
}
* 클래스를 선언할 때 가능하다면 필드를 private로 선언해서 외부로부터 보호하고, 필드에 대한 Setter와 Getter 메소드를 작성해서 필드값을 안전하게 변경/사용 하는 것이 좋으며 검증 코드나 변환 코드는 필요에 따라 추가해야 함.
* 필드 타입이 boolean일 경우에는 Getter는 get으로 시작하지 않고 is로 시작하는 것이 관례.
* 만약 외부에서 필드값을 읽을 수만 있고 변경하지 못하도록 하려면(읽기 전용) Getter 메소드만 선언해도 좋고, 아니면 Setter 메소드가 private 접근 제한을 갖도록 선언해도 좋음.
🔘 패키지 선언: 해당 클래스 또는 인터페이스가 어떤 패키지에 속할 것인지를 선언하는 것을 패키지 선언이라고 하며, 소스 파일의 최상단에 위치하면 package 상위패키지.하위패키지; 형태.
🔘 import문: 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면, import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와야 사용할 것임을 컴파일러에게 알려줌.
import 상위패키지.하위패키지.클래스이름; // import 상위패키지.하위해키지.*;
🔘 접근 제한자: 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 필요가 있으며, 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메소드를 사용하지 못하도록 막아야 하는 경우 접근 제한자를 사용함.
| 접근 제한자 | 적용 대상 | 접근할 수 없는 클래스 |
| public | 클래스, 필드, 생성자, 메소드 | 없음 |
| protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
| default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
| private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
🔘 Getter/Setter: 필드는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 필드에 접근하도록 유도함.
필드의 값을 외부로 리턴해주는 메소드를 Getter라고 하고 외부에서 값을 받아 필드를 변경하는 메소드를 Setter라고 함.
'Java' 카테고리의 다른 글
| [Java] 타입 변환과 다형성 (0) | 2025.11.12 |
|---|---|
| [Java] 상속 (0) | 2025.11.10 |
| [Java] 인스턴스 멤버와 정적 멤버 (0) | 2025.11.10 |
| [Java] 메소드 (0) | 2025.11.09 |
| [Java] 생성자 (0) | 2025.11.09 |