Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

접근 수정자(Access Modifier) public / private 본문

Java

접근 수정자(Access Modifier) public / private

빌드이너프 2023. 2. 3. 16:26
  • 표준 클래스 라이브러리에 있는 클래스의 메소드를 사용하는 프로그래머는 그 메소드가 수행하는 일은 알아야 하지만
  • 그 일이 메소드 내에서 어떻게 수행되는 지는 알 필요가 없다
  • 예로 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에서 변수 examScoreprivate 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