충분히 쌓여가는
접근 수정자(Access Modifier) public / private 본문
- 표준 클래스 라이브러리에 있는 클래스의 메소드를 사용하는 프로그래머는 그 메소드가 수행하는 일은 알아야 하지만
- 그 일이 메소드 내에서 어떻게 수행되는 지는 알 필요가 없다
- 예로 String 클래스의 substring 메소드를 사용한다면 그 메소드가 어떻게 작동되는지 알 필요 없다
- 즉, 메소드 안을 들여다 보는 것이 우리가 그 메소드를 사용하는데 도움을 주지 않고 오히려 더 많은 것에 신경 쓰게 만든다
정보 감추기
- 메소드 구현에 대해 자세히 알지 않고도 메소드를 사용할 수 있게 메소드를 작성하는 것
- 메소드 사용자가 메소드 몸체를 보지 못하도록 감추어져 있다는 사실을 강조함
- 자바에서 정보 감추기는 접근 수정자(access modifier)에 의해 제공됨
접근 수정자(access modifier)
- 클래스, 변수와 메소드 앞에 위치하여 그것들이 이용될 수 있는 접근의 범위를 나타냄
- 자바에서 제공하는 접근 수정자는 public, private, protected, package이다
public / private 접근 수정자
- 프로그램 내의 어떤 다른 클래스 내에서 해당 클래스, 메소드나 변수를 직접적으로 이용할 수 있다는 것을 의미
예시 1번 프로그램
// 학생의 성적 기록을 나타냄
import java.util.Scanner;
public class Student {
// 객체 변수들
public String name; // 이름
public int assignmentScore; // 과제 점수
public int examScore; // 시험 점수
// 객체 메소드들
// 현 Student 객체의 정보에 대한 문자열을 반환함
public String toString()
{
String str = "";
str += "이름: " + name + "\n";
str += "과제 점수: " + assignmentScore + "\n";
str += "시험 점수: " + examScore + "\n";
str += "학점: " + examScore + "\n";
return str;
}
// 학생의 학점을 반환
public char getGrade()
{
char letterGrade; // 학생의 학점
double total; // 학생의 점수들의 총점
// 학생의 점수들의 총점을 계산함
total = assignmentScore*0.4 + examScore*0.6;
// 총점에 따라 학점을 부여함
if (total >= 90) letterGrade = 'A';
else if (total >= 80) letterGrade = 'B';
else if (total >= 70) letterGrade = 'C';
else if (total >= 60) letterGrade = 'D';
else letterGrade = 'F';
return letterGrade;
}
}
예시 2번 프로그램
// Student 클래스와 그 메소드들을 사용함
public class StudentDriver {
public static void main(String[] args) {
// 첫 번째 학생을 나타내는 객체를 만듬
Student stud1 = new Student();
// 첫 번쨰 학생의 이름 정함
stud1.name = "선남";
// 첫 번째 학생의 과제 점수 줌
stud1.assignmentScore = 91;
// 첫 번째 학생의 시험 점수 줌
stud1.examScore = 84;
// 첫 번째 학생의 이름, 점수들과 학점 출력
System.out.println(stud1.toString());
// 두 번째 학생을 나타내는 객체 만듬
Student stud2 = new Student();
// 두 번쨰 학생의 이름 정함
stud2.name = "선녀";
// 두 번째 학생의 과제 점수 줌
stud2.assignmentScore = 86;
// 두 번째 학생의 시험 점수 줌
stud2.examScore = 95;
// 두 번째 학생의 이름, 점수들과 학점을 출력
System.out.println(stud2.toString());
}
}
public 접근 수정자
- 예시 2의 StudentDriver 클래스 내의 main 메소드는 stud1.name = "선남"; 문을 포함함
- stud1.name = "선남"; 문이 유효한 이유
- 예시 1의 Student 클래스에서 변수 name이 public로 선언되어 다른 클래스인 StudentDriver에서 접근 가능하기 때문
private 접근 수정자
- 적용된 클래스, 메소드나 변수를 다른 클래스에서 접근할 수 없다는 것을 의미함
- 예시 1에서 변수 examScore가 private int examScore;로 선언되었다면
- 예시 2의 stud1.examScore = 84;는 유효하지 않음
- private로 선언된 객체 변수는 다른 클래스에서 접근할 수 없기 때문
- 클래스나 메소드를 public로 선언하는 것이 보통
- 객체 변수를 public로 선언하는 것은 좋은 프로그래밍 관례가 아님
- 대부분의 경우 모든 객체 변수들은 private로 선언되어야 함
- 개인의 프라이버시에 해당되는 민감한 데이터를 저장하는 객체 변수는 접근을 제한할 필요가 있기 때문
- ex. 예시1의 Student 클래스에서 examScore는 시험 점수를 나타내기 때문에 private로 해줘야 함
메소드의 private
- 클래스 내의 한 메소드가 private로 선언된다면 그 메소드는 다른 클래스에서 사용될 수 없음
- 하지만 메소드는 같은 클래스 내의 다른 메소드에서 호출될 수 있음
- 예시 1의 Student 클래스 내의 getGrade 메소드를 private로 선언한다면
- 예시 2의 StudentDriver 클래스 내에서 그 메소드를 호출할 수 없다
package 접근 수정자
- 모든 클래스, 메소드나 변수의 기본(default) 접근 수정자
- 어떤 클래스, 메소드나 변수 앞에 접근 수정자가 없다면 package로 선언된 것과 같음
- package 수정자는 해당 클래스, 메소드나 변수가 같은 패키지의 모든 클래스에서 접근 가능하다는 것을 의미함
'Java' 카테고리의 다른 글
메소드 다중 정의(method overloading) (3) | 2023.02.04 |
---|---|
접근자 메소드(get method) / 변경자 메소드(set method (1) | 2023.02.04 |
클래스 (0) | 2023.02.03 |
메소드 (0) | 2023.02.02 |
반복문 - for 문 (0) | 2023.02.01 |