접근 제한자와 Getter/Setter

제민·2024년 7월 10일

Java 개념 공부

목록 보기
11/21
post-thumbnail

접근 제한자는 클래스, 필드, 메소드에 대한 접근을 제한하는 키워드입니다.
Java에서는 public, protected, default, private 네 가지 접근 제한자를 제공합니다.
많이 사용하는 키워드는 publicprivate입니다.

  • public: 어디서든 접근 가능
  • protected: 같은 패키지 + 다른 패키지일 경우 상속 관계
  • default: 같은 패키지일 때만 접근 가능
  • private: 해당 클래스 내에서만 접근 가능
public class Book {
   //private : 같은 클래스 내에서만 사용 가능
    private String title;
    private String genre;
    private String author;
    private int maxPage;

    // 생성자
    public Book(String title, String genre, String author, int maxPage) {
        this.title = title;
        this.genre = genre;
        this.author = author;
        this.maxPage = maxPage;
    }

    // Getter와 Setter
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getMaxPage() {
        return maxPage;
    }

    public void setMaxPage(int maxPage) {
        this.maxPage = maxPage;
    }

    public String toString() {
        return "제목 : " + this.title + "\n장르 : " + this.genre + "\n저자 : " + this.author + "\n총 페이지 : " + this.maxPage;
    }
}

Getter와 Setter가 무엇인가?

private 접근 제한자를 사용하면 해당 필드는 외부에서 직접 접근할 수 없습니다. 이때, 이러한 필드를 안전하게 접근하고 수정하기 위해 사용하는 메서드가 바로 Getter와 Setter입니다.

  • Getter: 내부의 멤버 변수에 저장된 값을 외부로 반환하는 메서드입니다. 매개변수는 없고, 리턴값만 있는 메서드로 정의합니다. 주로 getXXX() 형식으로 지정하며, 여기서 XXX는 해당 멤버 변수의 이름이며 보통 첫 글자는 대문자를 사용합니다.
  • Setter: 외부로부터 데이터를 전달받아 멤버 변수에 저장하는 메서드입니다. 매개변수만 있고, 리턴값은 없는 메서드로 정의합니다. 마찬가지로 Getter처럼 변수의 이름의 첫글자는 대문자입니다.
// Getter 예시
public String getTitle() {
    return title;
}

// Setter 예시
public void setTitle(String title) {
    this.title = title;
}

Getter와 Setter는 private 필드를 관리하는 메서드로, private 필드는 외부에서 직접 접근할 수 없기 때문에 Getter와 Setter를 통해서만 접근할 수 있습니다.
이를 카페에서 주문을 관리하는 방식에 비유할 수 있습니다.

  • private 필드는 마치 카페의 특정 커피 메뉴와 같습니다. 예를 들어, "oo커피"와 "ㅁㅁㅁ커피"는 카페 내부에서만 제조법을 알고 있습니다.
  • Getter는 "oo커피"를 주문할 때, 카운터 직원에게 요청해서 받아오는 과정과 같습니다. 내부의 레시피를 외부로 노출하지 않고, 커피를 제공하는 역할을 합니다.
  • Setter는 새로운 커피 메뉴를 추가하거나, 기존 커피의 레시피를 변경하는 과정과 같습니다. 외부에서 제공된 정보를 바탕으로 카페 내부의 레시피를 업데이트합니다.

Getter와 Setter를 사용하는 이유

private 필드는 외부에서 직접 접근할 수 없기 때문에 Getter와 Setter를 통해서만 접근이 가능합니다. 이때, 공통된 이름을 가지는 Getter와 Setter 메서드를 사용하면 코드의 가독성과 유지보수성이 향상됩니다.

실습 예제

아래는 사용자로부터 이름, 나이, 영어 점수, 수학 점수, 국어 점수를 입력받아 평균을 구하고 출력하는 프로그램의 예제입니다.

클래스 코드

package f.object.ex4;

public class Student {
    private String name;
    private int age;
    private int mathScore;
    private int engScore;
    private int korScore;

    public Student() {}

    public Student(String name, int age, int mathScore, int engScore, int korScore) {
        this.name = name;
        this.age = age;
        this.mathScore = mathScore;
        this.engScore = engScore;
        this.korScore = korScore;
    }

    // Getter와 Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    //조건문을 추가할 수 있다.
    public void setAge(int age) {
        if (age < 1) {
            this.age = 1;
            return;
        }
        this.age = age;
    }

    public int getMathScore() {
        return mathScore;
    }

    public void setMathScore(int mathScore) {
        if (mathScore < 0) {
            this.mathScore = 0;
            return;
        }
        this.mathScore = mathScore;
    }

    public int getEngScore() {
        return engScore;
    }

    public void setEngScore(int engScore) {
        if (engScore < 0) {
            this.engScore = 0;
            return;
        }
        this.engScore = engScore;
    }

    public int getKorScore() {
        return korScore;
    }

    public void setKorScore(int korScore) {
        if (korScore < 0) {
            this.korScore = 0;
            return;
        }
        this.korScore = korScore;
    }

    public double getEvg() {
        return (this.mathScore + this.engScore + this.korScore) / 3.0;
    }

    public void printEvg() {
        System.out.println(this.getName() + "님의 평균 :" + this.getEvg());
    }
}

실행 코드

package f.object.ex4;
import java.util.Scanner;

public class Run {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
       
        System.out.print("이름 : ");
        String name = sc.next();
        System.out.print("나이 : ");
        int age = sc.nextInt();
        System.out.print("수학점수 : ");
        int eng = sc.nextInt();
        System.out.print("영어점수 : ");
        int math = sc.nextInt();
        System.out.print("국어점수 : ");
        int kor = sc.nextInt();
       
        Student jaemin = new Student(name, age, eng, math, kor);
       
        System.out.println(jaemin.getName() + "님의 평균 : " + jaemin.getEvg());
        jaemin.printEvg();
    }
}
profile
초보부터 시작하는 개발자 생활

0개의 댓글