패키지 선언
- 형태 : package 상위패키지.하위패키지;
- 패키지 : 클래스의 일부임. 그 이유는 패키지 내의 클래스가 다른 패키지로 옮겨졌을 경우 사용이 불가능하기때문
- 명명 규칙
1. 숫자로 시작할 수 없음
2. 특수문자는 _와 $만 가능함
3. java로 시작할 수 없음 -> 자바 표준 API에서만 사용할 수 있어서
4. 소문자로 작성해야함 (그저 관례일뿐)
- 보통 회사에서는 도메인 이름의 역순으로 패키지 이름을 설정해줌. 더 포괄적인게 상위 패키지가 되도록 하기위해서
예) package.com.samsung.projectname;
이클립스에서 패키지와 클래스 생성하는 법
- 패키지 생성하는 법 : src 폴더 선택 > 마우스 우클릭 > [File] > [New] > [Package]
- 하위 패키지 생성 : 패키지명에 상위패키지.하위패키지 형태로 작성
- Flat 방식에서 계층적(모든 상하위 폴더가 다 보이도록)으로 변경하는 법 : [Package Presentation] > [Hierarchical]
- 클래스 생성하는 법 : 해당 패키지 선택 > 마우스 우클릭 > [File] > [New] > [Class]
- 패키지에 속하지 않은 클래스는 자동으로 default 패키지에 포함시킨다.
import 문
- import 문의 역할 : 다른 패키지에 있는 클래스나 인터페이스를 가져와서 사용하고자 할 때 컴파일러에게 알리는 용도
- 선언 형태 (개별 import문) : import 상위패키지.하위패키지.클래스이름;
- 선언 형태 (모든 클래스 사용) : import 상위패키지.하위패키지.*;
- 선언 위치 : 패키지 선언과 클래스 선언 사이에 작성한다.
- import문의 개수는 제한이 없고 얼마든지 추가 가능하다.
- 상위 패키지를 import 했다고 해서 하위패키지까지 import되는 것은 아니다.
import 문 예제
- 아래와 같이 서로 다른 패키지 내에 같은 클래스명을 가진 클래스가 존재할 경우에 대한 import문을 작성해보자
- Tire 클래스는 두 패키지에 모두 존재하므로 11, 12라인과 같이 풀 패키지명을 써주어야한다.
- 그 외에 클래스들은 겹치는 이름을 가진 클래스가 없으므로 그냥 클래스명만 써주면 된다.
- 아래 코드를 먼저 작성한 후 Ctrl + Shift + O 를 누르면 import문이 자동으로 생성됨
[Window] > [Preferences] > [Java] > [Code Style] > [Organize imports] > Number of imports needed for .* 99 > 1
접근 제한자
- 클래스나 인터페이스, 그들이 가지고 있는 멤버의 접근을 제한하기 위해 사용하는 것을 말함
- 클래스와 인터페이스를 다른 패키지에서 사용할 수 없도록, 혹은 객체 생성을 막기 위해 생성자 호출을 막는 경우
- 필드나 메소드 사용을 막는 경우 등에 접근 제한자를 사용한다.
접근 제한자의 종류
1. public 접근 제한자 : 외부 클래스도 자유롭게 사용 가능
2. protected 접근 제한자 : 같은 패키지 또는 자식 클래스에서 사용 가능
3. private 접근 제한자 : 개인적인 것으로서 외부에서는 사용될 수 없다.
4. default 접근 제한 : 같은 패키지에 소속된 클래스에서만 사용 가능 (접근 제한자를 생략한 경우 자동으로 default임)
접근 제한이 더 강한 순서 : private > default > protected > public
클래스의 접근 제한 예제
package Exercise.ch06;
class A { // default 접근 제한
}
package Exercise.ch06;
public class B { // public 접근 제한
A a; // A 클래스로 접근 가능 (같은 패키지라서 가능)
}
package Exercise.ch07;
import Exercise.ch06.*;
public class C {
A a; // 에러 발생 -> default 접근 제한이라 접근 불가능 (다른 패키지에 있어서)
B b; // public 접근 제한이라 접근 가능
}
생성자의 접근 제한
- 생성자의 접근 제한은 생성자를 어디에서나 호출할 수 있는 것이 아니라 제한을 하기 위해 존재한다.
- 생성자 자체를 선언하지 않으면 컴파일러에 의해 자동으로 기본 생성자가 추가된다고 배웠는데 여기서 기본 생성자의 접근 제한은 클래스의 접근 제한을 따라가게된다.
- 생성자의 접근 제한도 클래스의 접근 제한과 마찬가지로 네 가지 종류가 있다.
1. public 접근 제한자 : 모든 패키지에서 자유롭게 생성자 호출 가능
2. protected 접근 제한자 : 같은 패키지 또는 자식 클래스에서만 생성자 호출 가능
3. private 접근 제한자 : 동일한 패키지에서까지도 생성자를 호출할 수 없고 오직 자신의 클래스 내부에서만 호출 가능
4. default 접근 제한 : 같은 패키지에서는 자유롭게 생성자 호출 가능 (접근 제한자를 생략한 경우 자동으로 default임)
- A 클래스 내부에서는 어떤 생성자 접근 제한이 오더라도 모두 호출 가능함
- B 클래스는 A 클래스와 패키지가 동일하므로 private을 제외하고는 모두 호출이 가능하다.
- C 클래스는 A 클래스와 다른 패키지에 있으므로 public을 제외하고는 호출이 불가능하다.
**싱글톤 : 생성자를 private 접근 제한으로 선언하고 자신의 유일한 객체를 getInstance() 정적 메소드로 리턴해준다.
필드와 메소드의 접근 제한
- 필드와 메소드 또한 패키지 내에서 사용할 것이닞 다른 패키지에서도 사용 가능할 것인지 혹은 아예 자신의 클래스에서만 사용하도록 만들 것인지 결정해야한다.
- 필드나 메소드 선언의 형태 : [접근 제한자] [static] [(리턴)타입] [필드/메소드]
- A 클래스 내부에서는 어떤 접근 제한이 오더라도 필드와 메소드를 모두 사용 가능함
- B 클래스는 A 클래스와 패키지가 동일하므로 private 필드와 메소드를 제외한 나머지는 사용이 가능하다.
- C 클래스는 A 클래스와 다른 패키지에 있으므로 public 필드와 메소드를 제외하고는 모두 사용할 수 없다.
Setter 메소드
-필드 값을 마음대로 변경하도록 하는 경우, 객체의 무결성이 깨질 수도 있다.
- 따라서 필드 값을 직접 변경하도록 하지 않고 private 으로 보호한 다음 Setter 메소드를 통해서 바꾸도록 한다.
- Setter 메소드는 들어오는 매개값을 검증해서 유효한 값만 객체의 필드로 접근할 수 있도록 해준다.
Getter 메소드
- 필드값을 가져와서 사용할 때도 직접 사용하면 안좋은 경우가 있다.
- 따라서 우선 필드를 private으로 선언하여 외부롭터 보호하고 Getter 메소드를 통해 필드 값을 가공한 후에 사용한다.
Setter와 Getter 메소드의 형태
- 당연히 Setter와 Getter 둘 중에 하나만 써도 가능하다.
public class GetterSetter {
// 필드
private String fieldName; // 필드 보호
// 생성자
public String getFieldName() { // boolean타입일 경우 메소드 이름은 is...로 시작한다.
return fieldName;
}
// 메소드
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
}
** 자동으로 메소드 생성하는 법
Setter와 Getter 메소드 예제
public class Car6 {
// 필드
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;
}
}
public class Car6Example {
public static void main(String[] args) {
Car6 myCar = new Car6();
// 잘못된 속도 변경
myCar.setSpeed(-50);
System.out.println("현재속도: " + myCar.getSpeed()); // 현재속도: 0
// 올바른 속도 변경
myCar.setSpeed(60);
// 멈춤
if(myCar.isStop()) { // stop의 초기값이 false로 되어있으므로 if문을 지나친다.
myCar.setStop(true);
}
System.out.println("현재 속도: " + myCar.getSpeed()); // 현재속도: 60
}
}
'👨💻 2. 웹개발_Back end > 2-1 Java' 카테고리의 다른 글
[JAVA] 07-2 타입 변환과 다형성 (0) | 2021.08.05 |
---|---|
[JAVA] 07-1 상속 (0) | 2021.08.04 |
[JAVA] 06-5 인스턴스 멤버와 정적 멤버 (0) | 2021.08.03 |
[JAVA] 06-4 메소드 (0) | 2021.08.02 |
[JAVA] 06-3 생성자 (0) | 2021.08.02 |
댓글