접근 제어자란 ?
클래스 또는 클래스의 멤버들의 접근 범위를 제한하는 것을 말한다.
접근 제어자를 통해 코드의 접근성을 제한하여 캡슐화를 강화하고, 잘못된 사용을 방지한다.
클래스와 그 구성요소의 노출 범위를 제어하여 코드의 안정성과 보안성을 높이는 중요한 역할을 한다.
public : 프로젝트 전체 내 외부, 불문하고 접근 가능
protected : 같은 패키지 내 , 클래스 / 상속관계에 있는 하위 클래스 접근 가능 (주로 상속을 통해 접근 허용)
defalut : 접근제어자를 명시하지 않은 경우 , 같은 패키지 내에 있는 클래스만 접근가능
private : 같은 클래스 내 접근 , 외부나 하위에서 접근 불가 . 데이터 보호위해 사용
그렇다면 접근이 제한된 경우에 멤버들에 대한 접근은 어떻게 해야할까 ?
이부분에 대한 해답이 바로 설정자와 접근자이다.
설정자(setter)와 접근자(getter)
설정자와 접근자의 메서드를 통해 , 멤버들에게 접근하여
수정하고 값을 꺼내오는 역할을 한다.
setter : 설정자 : 멤버 값을 설정하는데 이용한다. 주로 메서드명이 set... 로 설정.
getter : 접근자 : 멤버 값을 반환하는데 이용한다 . 주로 메서드명이 get...로 설정.
메서드명은 카멜 표기로 사용하도록한다.
ex ) myAge ⇒ setMyAge ,필드명이 한글자카멜이라면 iPhone ⇒ setIPhone 또는 setIphone (혼란야기로 권장 X)
setter , getter 의 자동생성법
우클릭 -> source -> Fenerate Getters and Setters...
이방법 처럼 toString 도 자동 생성이 가능하다.
같은 패키지 내 ,
다른 클래스에서 private 접근하기
- 디폴트 클래스 : Member
1. 한 클래스 내에 private 으로 멤버 정의 : 클래스 외부에서는 public 메서드를 통하여 접근
class Member{
private String id ;
private String name ;
private int age ;
}
2. 기본 생성자와 초기화 생성자를 준비.
public Member() {
}
public Member(String id,String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
3.설정자와 접근자를 public으로 만들기
public void setId(String id) {
this.id = id;
} // setter
public String getId() {
return this.id;
} // getter
- void main 이 있는 클래스에서 사용해보기
1. 인스턴스 생성
접근 자체가 변수에 불가하고 public으로 정의된 것들만 보인다.
2. 직접 setter 를 통하여 값 정의하고 getter를 통하여 값 리턴받기
member01.setId("apple");
member01.setAge(30);
member01.setName("사과");
System.out.println("member01.getId() : "+member01.getId());
System.out.println("member01.getName() : "+member01.getName());
System.out.println("member01.getAge() : "+member01.getAge());
3. 생성자 함수를 통하여 생성한 인스턴스의 값 getter를 통하여 값 리턴받기
Member member02 = new Member("바나나","banna",40);
System.out.println("member02.getId() : "+member02.getId());
System.out.println("member02.getName() : "+member02.getName());
System.out.println("member02.getAge() : "+member02.getAge());
접근자나 설정자에서 조건을 달아보는 경우
public class Person {
private int age;
// Setter
public void setAge(int age) {
if (age >= 0) { // 유효성 검사
this.age = age;
} else {
throw new IllegalArgumentException("Age cannot be negative");
}
}
}
age가 0 이상일때만 setter 를 통해 값을 넣을 수 있다.
다른 패키지에서
public 클래스 접근해보기
public : 프로젝트내의 모든 Class 접근 가능하다.
다른 패키지에서 사용할 경우 import 해야 한다.
어떤 식으로 접근 하는지 확인해 보자.
1. import 하여 인스턴스 생성
package j06_packageTest;
import j05_classMethod.Car;
public class Ex01_accessTest {
public static void main(String[] args) {
//public 클래스에 접근
//Car.java 이용
Car car = new Car();
}
}
- car의 클래스
public class Car {
public int speed ;
public double price ;
public char grade ;
public String brand;
String color = "blue"; //access Modifier test
public void hpowerUp() {
speed+=10;
}
public void hpowerDown() {
speed-=10;
}
public String toString() {
return "[speed ="+speed+", price ="+price+", brand = "+brand
+", color = "+color+", grade: "+grade+" ]";
}
}
2. 접근 가능한 사항 확인해보기
public으로 정의된 멤버들은 접근 가능하나 , default로 정의된 멤버(color)는 보이지 않음을 알 수 있다.
클래스 수준에서 허용하더라도 멤버 수준에서는 허용되지 않으면 멤버에 접근이 불가하다.
다른 패키지 에서
default 클래스 접근하기
-> 생성자를 강제로 호출하여 import 하더라도 불가함을 확인 할 수 있다.
default 클래스, public 맴버 → 인스턴스 생성이 불가함으로 접근 불가
default 클래스, static 맴버 → 클래스 접근이 불가함으로 접근 불가.
'Developer > JAVA' 카테고리의 다른 글
JAVA , 클래스간의 관계 : use , has, is (0) | 2024.08.06 |
---|---|
JAVA , 예제 : 로또 번호 생성기 , 학생 성적순 출력 (0) | 2024.08.06 |
JAVA , static 과 instance (0) | 2024.08.04 |
JAVA , 초기화 블럭(init) 과 생성자 , this (0) | 2024.08.04 |
JAVA , 팩토리얼 연산 (Factorial)과 static (0) | 2024.08.03 |