Developer/JAVA

JAVA , 접근 제어자 : 설정자와 접근자

단님 2024. 8. 5. 23:03
728x90
접근 제어자란 ?

 

클래스 또는 클래스의 멤버들의 접근 범위를 제한하는  것을 말한다.

접근 제어자를 통해 코드의 접근성을 제한하여 캡슐화를 강화하고, 잘못된 사용을 방지한다.

클래스와 그 구성요소의 노출 범위를 제어하여 코드의 안정성과 보안성을 높이는 중요한 역할을 한다.

 

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 맴버 → 클래스 접근이 불가함으로 접근 불가.