hyeonga_code

Java_36_멤버 변수 접근 제한 본문

Java

Java_36_멤버 변수 접근 제한

hyeonga 2023. 9. 29. 05:59
반응형


 - 멤버 변수 접근 제한 
    - Getter/Setter 메소드
        - 멤버 변수를 보호하기 위해 사용합니다.
        - private 으로 선언한 변수에도 접근할 수 있습니다.
         - setter 메소드
public void setName(String name) {
 // 이름이 중복되었는지 확인 후 수정 기능 가능
 this.name = name;
}
          - getter 메소드
public String getName() {
return name;
}

'Student.java'
    '''
        private int grade; // 클래스 외부에서 접근이 불가능합니다.
    '''
=====

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package oop.basic;
//모든 클래스는 패키지 안에 생성합니다.
 
// 기본형, 메소드의 조합입니다.
public class Student {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    // 실행하기 위함이 아닌 spec을 작성하기 위함이므로 main()함수를 작성하지 않습니다.
        /* 
            - 추상화
                - 학생 spec 작성하기
                    - 학번
                    - 이름
                    - 학년
                    - 주소
        */
 
    // 1. 멤버 변수를 선언합니다.
    int studentID;
    String studentName;
    private int grade;    // 클래스 외부에서 접근이 불가능합니다.
    String address;
    
    // 2. 학생의 이름, 주소 출력 메소드 선언
    public void showStudentInfo() {
        System.out.println("Name : " + studentName);
        System.out.println("Address : " + address);
    }
    
    // 3. 멤버 변수 접근
    public String getStudentName() {
        return studentName;    // Student 클래스에 선언된 멤버 변수의 값을 반환합니다.
    }
 
    public void setStudentName(String studentName) {
        // studentName 을 매개 변수로 받아 함수를 호출하고 반환값은 없습니다.
        this.studentName = studentName;
        /*
            this.studentName : Student 클래스에 선언된 멤버 변수입니다.
                = 
            studentName : 받아온 매개 변수입니다.
         */
        // String studentName1 / studentName = studentName1 로 변경
    }
}
 


'StudentApp.java'
    '''
// 멤버 변수 접근 제한
/*
student3.grade();
- 오류 : The method grade() is undefined for the type Student
- Student 클래스에서 private으로 선언한 grade의 값에 접근할 수 없습니다.
 */
    '''
=====

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package oop.basic;
//모든 클래스는 패키지 안에 생성합니다.
 
public class StudentApp {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    // 별칭을 지정합니다.
    static void printInfo(Student student) {        
        /*
            - Scope 내의 코드에 대해 별칭을 지정하여 실행할 수 있습니다.
                '별칭' {
                    별칭으로 지정할 코드
                }
            - 문제
                - 외부에서 Scope 내의 변수에 접근할 수 없습니다.
            >>> 별칭은 내부 변수를 초기화 하는 매개 변수_()를 제공합니다.
                        - 매개 변수 이름은 내부 변수 이름과 동일하게 작성합니다.
                '별칭'('매개 변수 이름') {
                    별칭으로 지정할 코드
                }
            >>> Compile 하기 위해 매개 변수의 데이터 타입을 알려주어야 합니다.
                '별칭'('데이터 타입' '매개 변수 이름') {
                    별칭으로 지정할 코드
                }
            >>> 반환할 데이터 타입을 지정해주어야 합니다.
                void '별칭'('데이터 타입' '매개 변수 이름') {
                    별칭으로 지정할 코드
                }
            >>> static을 통해 클래스 이름을 통해 객체를 생성하지 않고도 접근이 가능합니다.
                static void '별칭'('데이터 타입' '매개 변수 이름') {
                    별칭으로 지정할 코드
                }
         */
        System.out.println("printInfo : " + student.studentName);
    }
    
    public static void main(String[] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
        /*
            - 'Student.java'에서 작성한 Student 클래스를 사용하기
                1) 클래스 spec을 만족하는 객체를 생성합니다.
                2) 데이터 저장
         */
        
        Student student1 = new Student();    
            /* 
                - 복합형 데이터를 다루는 클래스이기 때문에 new 로 객체를 생성합니다.
                - 대입 연산자의 왼쪽 부터 실행됩니다.
                    - Heap 공간에 Student() 메소드의 객체를 생성합니다.
                        - 클래스의 spec의 조건을 충족시키는지 확인합니다.
                    - Stack 공간에 Heap 공간의 Student() 메소드의 메모리의 주소를 student 변수에 저장
             */
        
        // 데이터 저장
        student1.studentName = "stName1";
        student1.address = "Address 123-123";
            /*
                - 클래스의 spec에 맞는 객체의 정보를 저장합니다.
                    '클래스 이름'.'멤버 변수 이름' = '저장할 값';
             */
        
        // 데이터 출력
        student1.showStudentInfo();
            /*
                Name : stName1
                Address : Address 123-123
                    - showStudentInfo() 함수를 호출하여 실행합니다.
                        - 함수를 작성한 페이지에 가지 않는 한 함수의 자세한 내용을 알 수는 없습니다.
             */
        
        System.out.println(student1.studentName);
        
        Student student2 = new Student();    // 새로운 메소드 객체를 생성합니다.
        student2.studentName = "stName2";
        student2.showStudentInfo();
            /*
                Name : stName2
                Address : null
                    - student2 객체와 student1 객체는 다른 객체이므로 다른 정보가 출력됩니다.
                    - student2 객체에 address 정보를 저장하지 않았으므로 null 값이 출력됩니다.
             */
        System.out.println();
        printInfo(student2);
            /*
                printInfo : stName1
             */
        
        // 멤버 변수 접근
        Student student3 = new Student();
        student3.setStudentName("stName3");                // 값을 저장합니다.
        System.out.println("student3.getStudentName() : " + student3.getStudentName());    
            // 값을 불러옵니다.
        System.out.println("student3.studentName : " + student3.studentName);        
            // 값을 출력합니다.
            /*
                student3.getStudentName() : stName3
                student3.studentName : stName3
             */
 
        // 멤버 변수 접근 제한
        /*
        student3.grade();
            - 오류 : The method grade() is undefined for the type Student
            - Student 클래스에서 private으로 선언한 grade의 값에 접근할 수 없습니다.
         */
    }
}




'Student.java'
    '''
        public int getGrade() { // getter 메소드를 통해 값에 접근할 수 있습니다.
            return grade;
        }

        public void setGrade(int grade) {   // grade 값을 저장할 수 있습니다.
            this.grade = grade;
        }
    '''
=====

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package oop.basic;
//모든 클래스는 패키지 안에 생성합니다.
 
// 기본형, 메소드의 조합입니다.
public class Student {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    // 실행하기 위함이 아닌 spec을 작성하기 위함이므로 main()함수를 작성하지 않습니다.
        /* 
            - 추상화
                - 학생 spec 작성하기
                    - 학번
                    - 이름
                    - 학년
                    - 주소
        */
 
    // 1. 멤버 변수를 선언합니다.
    int studentID;
    String studentName;
    private int grade;    // 클래스 외부에서 접근이 불가능합니다.
    String address;
    
    // 2. 학생의 이름, 주소 출력 메소드 선언
    public void showStudentInfo() {
        System.out.println("Name : " + studentName);
        System.out.println("Address : " + address);
    }
    
    // 3. 멤버 변수 접근
    public String getStudentName() {
        return studentName;    // Student 클래스에 선언된 멤버 변수의 값을 반환합니다.
    }
 
    public void setStudentName(String studentName) {
        // studentName 을 매개 변수로 받아 함수를 호출하고 반환값은 없습니다.
        this.studentName = studentName;
        /*
            this.studentName : Student 클래스에 선언된 멤버 변수입니다.
                = 
            studentName : 받아온 매개 변수입니다.
         */
        // String studentName1 / studentName = studentName1 로 변경
    }
 
    public int getGrade() {        // 저장된 값을 불러올 수 있습니다.
        return grade;
    }
 
    public void setGrade(int grade1) {   // 값을 저장/수정할 수 있습니다.
        grade = grade1;
    }
}
 


'StudentApp.java'
    '''
        System.out.println("student3.getGrade() : " + student3.getGrade());
/*
student3.getGrade() : 0
 */

student3.setGrade(3);
System.out.println("student3.setGrade(3) : " + student3.getGrade());
/*
student3.setGrade(3) : 3
 */
    '''
=====

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package oop.basic;
//모든 클래스는 패키지 안에 생성합니다.
 
public class StudentApp {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    
    // 별칭을 지정합니다.
    static void printInfo(Student student) {        
        /*
            - Scope 내의 코드에 대해 별칭을 지정하여 실행할 수 있습니다.
                '별칭' {
                    별칭으로 지정할 코드
                }
            - 문제
                - 외부에서 Scope 내의 변수에 접근할 수 없습니다.
            >>> 별칭은 내부 변수를 초기화 하는 매개 변수_()를 제공합니다.
                        - 매개 변수 이름은 내부 변수 이름과 동일하게 작성합니다.
                '별칭'('매개 변수 이름') {
                    별칭으로 지정할 코드
                }
            >>> Compile 하기 위해 매개 변수의 데이터 타입을 알려주어야 합니다.
                '별칭'('데이터 타입' '매개 변수 이름') {
                    별칭으로 지정할 코드
                }
            >>> 반환할 데이터 타입을 지정해주어야 합니다.
                void '별칭'('데이터 타입' '매개 변수 이름') {
                    별칭으로 지정할 코드
                }
            >>> static을 통해 클래스 이름을 통해 객체를 생성하지 않고도 접근이 가능합니다.
                static void '별칭'('데이터 타입' '매개 변수 이름') {
                    별칭으로 지정할 코드
                }
         */
        System.out.println("printInfo : " + student.studentName);
    }
    
    public static void main(String[] args) {
        // Java의 모든 코드는 함수 안에 작성합니다.
        /*
            - 'Student.java'에서 작성한 Student 클래스를 사용하기
                1) 클래스 spec을 만족하는 객체를 생성합니다.
                2) 데이터 저장
         */
        
        Student student1 = new Student();    
            /* 
                - 복합형 데이터를 다루는 클래스이기 때문에 new 로 객체를 생성합니다.
                - 대입 연산자의 왼쪽 부터 실행됩니다.
                    - Heap 공간에 Student() 메소드의 객체를 생성합니다.
                        - 클래스의 spec의 조건을 충족시키는지 확인합니다.
                    - Stack 공간에 Heap 공간의 Student() 메소드의 메모리의 주소를 student 변수에 저장
             */
        
        // 데이터 저장
        student1.studentName = "stName1";
        student1.address = "Address 123-123";
            /*
                - 클래스의 spec에 맞는 객체의 정보를 저장합니다.
                    '클래스 이름'.'멤버 변수 이름' = '저장할 값';
             */
        
        // 데이터 출력
        student1.showStudentInfo();
            /*
                Name : stName1
                Address : Address 123-123
                    - showStudentInfo() 함수를 호출하여 실행합니다.
                        - 함수를 작성한 페이지에 가지 않는 한 함수의 자세한 내용을 알 수는 없습니다.
             */
        
        System.out.println(student1.studentName);
        
        Student student2 = new Student();    // 새로운 메소드 객체를 생성합니다.
        student2.studentName = "stName2";
        student2.showStudentInfo();
            /*
                Name : stName2
                Address : null
                    - student2 객체와 student1 객체는 다른 객체이므로 다른 정보가 출력됩니다.
                    - student2 객체에 address 정보를 저장하지 않았으므로 null 값이 출력됩니다.
             */
        System.out.println();
        printInfo(student2);
            /*
                printInfo : stName1
             */
        
        // 멤버 변수 접근
        Student student3 = new Student();
        student3.setStudentName("stName3");                // 값을 저장합니다.
        System.out.println("student3.getStudentName() : " + student3.getStudentName());    
            // 값을 불러옵니다.
        System.out.println("student3.studentName : " + student3.studentName);        
            // 값을 출력합니다.
            /*
                student3.getStudentName() : stName3
                student3.studentName : stName3
             */
 
        // 멤버 변수 접근 제한
        /*
        student3.grade();
            - 오류 : The method grade() is undefined for the type Student
            - Student 클래스에서 private으로 선언한 grade의 값에 접근할 수 없습니다.
         */
        System.out.println("student3.getGrade() : " + student3.getGrade());
            /*
                student3.getGrade() : 0
             */
 
        student3.setGrade(7);   // setGrade() 메소드를 호출하여 private 매개 변수의 값을 수정합니다.
        System.out.println("student3.setGrade(7) : " + student3.getGrade());
            /*
                student3.setGrade(7) : 7
             */
    }
}



 - 규정에 어긋나는 값을 입력받았을 경우 걸러내는 기능이 필요합니다.
    - 입력 받을 때에 조건을 충족하지 못하는 경우 오류 메세지를 출력하도록 설정합니다.
    - StudentApp 클래스에서는 Student 클래스에 요청하여 가져다 사용하는 역할이므로 Student 클래스에서 작성해야합니다.
'Student.java'
    '''
        public void setGrade(int grade1) {
            if( grade1>0 && grade1<4 ) {
                grade = grade1;
            } else { // 규정에 맞지 않는 데이터를 입력 했을 경우
                System.out.println("+Grade : between 1 and 3");
            }
        }
    '''
=====

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package oop.basic;
//모든 클래스는 패키지 안에 생성합니다.
 
// 기본형, 메소드의 조합입니다.
public class Student {
    // 모든 함수_메소드는 클래스 안에 작성합니다.
    // 실행하기 위함이 아닌 spec을 작성하기 위함이므로 main()함수를 작성하지 않습니다.
        /* 
            - 추상화
                - 학생 spec 작성하기
                    - 학번
                    - 이름
                    - 학년
                    - 주소
        */
 
    // 1. 멤버 변수를 선언합니다.
    int studentID;
    String studentName;
    private int grade;    // 클래스 외부에서 접근이 불가능합니다.
    String address;
    
    // 2. 학생의 이름, 주소 출력 메소드 선언
    public void showStudentInfo() {
        System.out.println("Name : " + studentName);
        System.out.println("Address : " + address);
    }
    
    // 3. 멤버 변수 접근
    public String getStudentName() {
        return studentName;    // Student 클래스에 선언된 멤버 변수의 값을 반환합니다.
    }
 
    public void setStudentName(String studentName) {
        // studentName 을 매개 변수로 받아 함수를 호출하고 반환값은 없습니다.
        this.studentName = studentName;
        /*
            this.studentName : Student 클래스에 선언된 멤버 변수입니다.
                = 
            studentName : 받아온 매개 변수입니다.
         */
        // String studentName1 / studentName = studentName1 로 변경
    }
 
    public int getGrade() {        // getter 메소드를 통해 값에 접근할 수 있습니다.
        return grade;
    }
 
    public void setGrade(int grade1) {
        if( grade1>0 && grade1<4 ) {
            grade = grade1;
        } else {    // 규정에 맞지 않는 데이터를 입력 했을 경우
            System.out.println("+Grade : between 1 and 3");
        }
    }    
}

>>> 1-3 이외의 숫자를 입력하는 경우 오류 메세지가 출력됩니다.

 - 프로그램을 최대한 세분화 하는 것이 유지 보수에 유리합니다.

반응형