[Java] 접근제어자, package와 import

김세림·2024년 4월 25일

Java

목록 보기
11/24
post-thumbnail

접근제어자, package와 import


접근제어자란?

이전 포스트에서 계속적으로 사용했지만 이에 대한 개념은 이 포스트에서 정리해보려고 한다.

우선 제어자란 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여해준다.
접근 제어자 : public, protected, default, private
그 외 제어자 : static, final, abstract(추상화)
제어자는 여러개를 조합해 사용가능하지만 접근제어자는 하나만 가능하다!

접근제어자 종류

  • public : 접근 제한 X
  • protected : 같은 패키지 내에서 다른 패키지의 자손클래스 접근이 가능
  • default : 선언하지않으면 default로 지정된다/ 같은 패키지 내
  • private : 같은 클래스 내 접근 가능(보수적)
    • 캡슐화를 해서 감추어야할때 사용한다.

클래스와 메서드, 변수에서 사용 가능한 제어자들은 다음과 같다.

  • 클래스 : public, default, final, abstract
  • 메서드 : public, protected, default, private, final, abstract, static
  • 멤버 변수 : public, protected, default, private, final, static
  • 지역변수 : final

⚠️ 주의!

  • 메서드에 staticabstract를 함께 사용할 수 없다.
  • 클래스에 abstractfinal을 동시에 사용할 수 없다.
  • abstract메서드의 접근 제어자가 private일 수 없다.
  • 메서드에 privatefinal을 같이 사용할 필요는 없다.

여기서 abstract는 추상화를 말하며 추상화 이 포스트를 참고해야한다.

위에서 말한 캡슐화에 대하여 얘기하자면

  • 클래스 내부에 선언된 데이터를 보호하기 위해 사용한다.
  • 유효한 값을 유지하고 함부로 변경하지못하도록 접근을 제어한다.

이렇게 캡슐화를 위해 private,default 등의 접근 제어자로 접근을 막은 필드를 읽거나 사용하는 방법은 무엇일까??

Getter와 Setter

Getter

외부에서 객체의 private한 필드의 값을 가져올 때 사용한다.
메서드 이름의 규칙은 get + 필드이름(첫글자는 대문자) 이며, 사용방법은 메서드 호출방법과 동일하다.

Setter

외부에서 객체의 private한 필드의 값을 저장/수정할 때 사용한다.
메서드 이름 규칙은 getter와 마찬가지로 set+필드이름(첫글자는 대문자)이고, 사용방법은 메서드 호출방법과 동일하다.

public void setModel(String model) {
    this.model = model;
}

public void setColor(String color) {
    this.color = color;
}

public void setPrice(double price) {
    this.price = price;
}
//외부에서 매개변수로 주입한 값을
//this 키워드를 사용하여 본인 객체에 저장한다.

여기서 Getter와 Setter는 매우 중요한데
private을 사용해 캡슐화(Encapsulation)하는 것은 자바 프로그래밍, 객체지향언어에 있어서 굉장히 중요한 핵심이므로, 사용하는 방법을 꼭!! 기억해야한다.


package와 import

package

클래스의 일부분이면서 클래스를 식별해주는 용도이다.
상위패키지와 하위패키지를 도트(.)로 구분한다.
ex)
pk1.Car 클래스가 있고
pk2.Car 클래스가 있을때
main.Main 클래스에서 해당 패키지의 Car를 사용하기 위해서는
pk1.Car car = new pk1.Car();로 생성자를 만들어야한다.

import

다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드이다.
ex)
pk1.Car 클래스와 pk2.Car 클래스가 있을 때 pk1의 Car클래스만을 사용하고 싶다면 import pk1.Car;로 해당 클래스를 다음과 같이 명시하고 사용하면 된다.

import pk1.Car; 
	//import pk1.* 하면 pk1패키지 안의 모든 클래스 사용이 가능해진다. 
public class Main{
	public static void main(String[] args){
    	Car car = new Car();
        car.horn();
    }
}

하지만 pk2의 Car를 호출하고 싶다면 다른 패키지에 있는 같은 이름의 클래스는 같이 import를 할 수 없으므로 해당 값은 패키지 선언하는 것과 같이 pk2.Car car2= new pk2.Car();로 패키지명을 전부 명시해주어야한다.

0개의 댓글