접근 제한자는 클래스, 필드, 메소드에 대한 접근을 제한하는 키워드입니다.
Java에서는 public, protected, default, private 네 가지 접근 제한자를 제공합니다.
많이 사용하는 키워드는 public과 private입니다.
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; } }
private 접근 제한자를 사용하면 해당 필드는 외부에서 직접 접근할 수 없습니다. 이때, 이러한 필드를 안전하게 접근하고 수정하기 위해 사용하는 메서드가 바로 Getter와 Setter입니다.
getXXX() 형식으로 지정하며, 여기서 XXX는 해당 멤버 변수의 이름이며 보통 첫 글자는 대문자를 사용합니다.// Getter 예시 public String getTitle() { return title; } // Setter 예시 public void setTitle(String title) { this.title = title; }
Getter와 Setter는 private 필드를 관리하는 메서드로, private 필드는 외부에서 직접 접근할 수 없기 때문에 Getter와 Setter를 통해서만 접근할 수 있습니다.
이를 카페에서 주문을 관리하는 방식에 비유할 수 있습니다.
private 필드는 마치 카페의 특정 커피 메뉴와 같습니다. 예를 들어, "oo커피"와 "ㅁㅁㅁ커피"는 카페 내부에서만 제조법을 알고 있습니다.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(); } }