본문 바로가기
👨‍💻 2. 웹개발_Back end/2-1 Java

[JAVA] 06-6 패키지와 접근 제한자

by 달님🌙 2021. 8. 4.
반응형

 

패키지 선언

 

- 형태 : 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

댓글