Programing Language/Java

[Java] 접근자와 설정자(Getter & Setter)

vinedpillar 2022. 9. 5. 01:49

접근자와 설정자(getter & setter)

  • 생성된 인스턴스의 데이터(필드값)을 외부에서 자유롭게 읽고, 변경할 수 있다면, 데이터의 무결성이 깨질 수 있습니다.

  • 클래스 외부에서도 값이 변경될 수 있다면 초기 설계 시 의도했던 데이터의 목적이나 범위를 벗어날 수 있기 때문입니다.
    (예를 들어 학생 객체의 성적은 음수가 입력될 수 없도록 설계했는데 이를 외부에서 음수로 수정할 수 있다면 무결성이 깨지게 됨)

  • 이러한 문제점 때문에 객체지향 방식의 프로그램에서는 외부에서 인스턴스 필드를 private로 설정해 데이터에 대한 직접 접근을 막고 있습니다.

  • 대신 클래스에서 필드 데이터에 접근하고 수정할 수 있는 메서드를 제공하여 이를 제어하는 방법을 활용하고 있습니다.
    (메서드에서는 변경되는 데이터의 범위나 조건을 제어할 수 있기 때문)

  • 이러한 용도로 사용되는 메서드를 접근자와 설정자라고 합니다.

 

 

 

 

접근자(getter)

  • 접근자는 특정 필드의 데이터 값을 반환하는 역할을 합니다.

  • 필요한 경우 기존 데이터를 가공하여 목적에 맞는 값으로 반환시킬 수 있습니다.
접근자(getter)의 구조

// 필드 데이터
private 타입 변수이름;

// 접근자 메서드
// 메서드는 카멜케이스로 작성하기 때문에 변수이름 앞문자를 대문자로 변경 필요
public 타입 get변수이름() {

	return 변수이름;

}

 

접근자(getter)의 예시

// 거리를 저장하는 필드 데이터
private double distance;

// 접근자 메서드 설정
public double getDistance() {
	return distance;
}

// 추가적인 데이터 가공을 하는 경우
public double getDistance() {
	double km = distance * 1000; 
    return km;
}

 

 

 

설정자(setter)

  • 설정자는 특정 필드에 원하는 데이터 값을 입력하는 역할을 합니다.

  • 필요한 경우 제어문을 활용하여 의도한 범위의 값이 아니면 입력이 안되도록 할 수 있습니다.
설정자(setter)의 구조

// 필드 데이터
private 타입 변수이름;

// 설정자 메서드
// 메서드는 카멜케이스로 작성하기 때문에 변수이름 앞문자를 대문자로 변경 필요
public void set변수이름(타입 변수이름) {

	this.변수이름 = 변수이름;

}

 

설정자(setter)의 예시

// 거리를 저장하는 필드 데이터
private double distance;

// 설정자 메서드 설정
public double setDistance(double distance) {
	this.distance = distance;
}

// 입력 조건을 설정하는 경우
public void setDistance(double distance) {
	// 입력값이 0보다 작은 경우 입력 불가 메시지를 출력 
    // 0보다 클경우 필드값에 데이터 입력 
    if(distance) < 0 {
    	System.out.println("거리는 음수가 될 수 없습니다");
    }
    else {
    	this.distance = distance;
    }
}

 

 

 

 

일반적인 클래스의 접근자 제어자 예시

접근자와 설정자 사용 예시

public class StudentInfo {
    // 필드 영역
    private int studentId;
    private String name;
    private char grade;
    
    
    // 컨스트럭터 영역
    public StudentInfo() {
    
    }
    
    
    // 메서드 영역
    // studentId를 반환하는 get메서드
    public int getStudentId() {
    	return studentId;
    }
    
    // studentId를 설정하는 set메서드
    public void serStudentId(int studentId) {
    	this.studentId = studentId;
    }
    
    // name을 반환하는 get메서드
    public String getName() {
    	return name;
    }
    
    // name을 설정하는 set메서드
    public void serStudentId(String name) {
    	this.name = name;
    }

    // grade를 반환하는 get메서드
    public char getGrade() {
    	return grade;
    }
    
    // grade를 설정하는 set메서드
    public void serGrade(char grade) {
    	this.grade = grade;
    }

}