hyeonga_code
Java_36_멤버 변수 접근 제한 본문
- 멤버 변수 접근 제한
- 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 이외의 숫자를 입력하는 경우 오류 메세지가 출력됩니다.
- 프로그램을 최대한 세분화 하는 것이 유지 보수에 유리합니다.
'Java' 카테고리의 다른 글
Java_38_Method/Class Area (0) | 2023.09.30 |
---|---|
Java_37_멤버 메소드, static, final, 상속, 오버라이딩, 오브젝트 클래스, super() (0) | 2023.09.29 |
Java_35_멤버 필드, 멤버 메소드, 매개 변수, 튜플 (0) | 2023.09.28 |
Java_34_별칭 (0) | 2023.09.28 |
Java_32_클래스 객체 배열 (0) | 2023.09.27 |