KDT/Java

231204 Java

001cloudid 2023. 12. 4. 12:53
728x90

정보 은닉

1. 기본 생성자 출력

//231204

package test5_3;

//정보 은닉 → 멤버 변수 앞에 접근 제어자를 붙여서 새로운 데이터값을 대입하거나 그러지 못하도록 함

public class Student {

//public과 private 구분

int studentID;//default : 아무런 접근 제어자를 지정하지 않은 경우, 동일한 패키지 내에서만 접근 가능

private String studentName;//private : 자신의 클래스 내에서만 접근 가능

public int grade;//public : 외부 클래스 어느 곳에서나 접근 제한이 없음

public String address;

 

//생성자를 하나라도 만들지 않으면 컴파일러가 기본생성자(default construct)형식으로 생성 및 추가하여

//멤버 변수의 자료형이 가지고 있는 기본값으로 멤버 변수에 데이터값을 초기화시킴

public Student() {}

 

//멤버 변수 내의 데이터값을 출력해주는 일반 메서드

public void show() {

System.out.println("studentID = " + studentID);

System.out.println("studentName = " + studentName);

System.out.println("grade = " + grade);

System.out.println("address = " + address);

}

 

 

}

 

//231204

package test5_3;

 

public class StudentTest {

 

public static void main(String[] args) {

Student s = new Student();

s.show();

 

}

 

}

그림 1. 기본 생성자 출력

 

2. private 특징

//231204

package test5_3;

//정보 은닉 → 멤버 변수 앞에 접근 제어자를 붙여서 새로운 데이터값을 대입하거나 그러지 못하도록 함

public class Student {

//public과 private 구분

int studentID;//default : 아무런 접근 제어자를 지정하지 않은 경우, 동일한 패키지 내에서만 접근 가능

private String studentName;//private : 자신의 클래스 내에서만 접근 가능

public int grade;//public : 외부 클래스 어느 곳에서나 접근 제한이 없음

public String address;

 

//생성자를 하나라도 만들지 않으면 컴파일러가 기본생성자(default construct)형식으로 생성 및 추가하여

//멤버 변수의 자료형이 가지고 있는 기본값으로 멤버 변수에 데이터값을 초기화시킴

public Student() {}

 

 

 

//멤버 변수 내의 데이터값을 출력해주는 일반 메서드

public void show() {

System.out.println("studentID = " + studentID);

System.out.println("studentName = " + studentName);

System.out.println("grade = " + grade);

System.out.println("address = " + address);

}

 

 

}

 

//231204

package test5_3;

 

public class Student_Main {

 

public static void main(String[] args) {

Student s = new Student();

 

s.show();

System.out.println("------------------");

 

s.studentID = 231204;

//studentName은 나타나지 않음. Student class에서 접근 제어자 private로 설정해두었기 떄문이다.

//즉 private 접근 제어자로 멤버 변수에 새로운 데이터값을 대입하지 못함.

//s.studentName = "고주몽";

s.grade = 3;

s.address = "고구려";

 

s.show();

 

}

 

}

그림 2. private 특징

 

private 접근 제어자로 대입할 수 없는 멤버 변수에 데이터값을 넣는 방법을 알아보자

필요시에 멤버 변수에 데이터값을 넣어야 하는 경우가 필요하다.

세터(setter, 설정자), 게터(getter, 접근) 메서드를 이용

//231204

package test5_3;

//정보 은닉 → 멤버 변수 앞에 접근 제어자를 붙여서 새로운 데이터값을 대입하거나 그러지 못하도록 함

public class Student {

//public과 private 구분

int studentID;//default : 아무런 접근 제어자를 지정하지 않은 경우, 동일한 패키지 내에서만 접근 가능

private String studentName;//private : 자신의 클래스 내에서만 접근 가능

public int grade;//public : 외부 클래스 어느 곳에서나 접근 제한이 없음

public String address;

 

//생성자를 하나라도 만들지 않으면 컴파일러가 기본생성자(default construct)형식으로 생성 및 추가하여

//멤버 변수의 자료형이 가지고 있는 기본값으로 멤버 변수에 데이터값을 초기화시킴

public Student() {}

 

//private로 선언한 studentName 변수를 외부에서 사용

//필요 시 멤버 변수에 데이터값을 넣어야하는 경우가 필요할 때가 있음

//setter(설정자), getter(접근자) 메서드 사용

 

//getter 메서드 : 멤버 변수에 저장된 데이터값을 가져오는 역할

public String getStudentName() {

return this.studentName;//호출하는 곳으로 반환값(결과값)을 반환

}

 

//setter 메서드 : 멤버 변수에 새로운 데이터 값을 저장하는 역할

public void setStudentName(String studentName) {

//멤버변수 = 매개변수;

this.studentName = studentName;

}

 

 

//멤버 변수 내의 데이터값을 출력해주는 일반 메서드

public void show() {

System.out.println("studentID = " + studentID);

System.out.println("studentName = " + studentName);

System.out.println("grade = " + grade);

System.out.println("address = " + address);

}

 

 

}

 

//231204

package test5_3;

 

public class Student_Main {

 

public static void main(String[] args) {

Student s = new Student();

s.show();

System.out.println("------------------");

 

s.studentID = 231204;

//studentName은 나타나지 않음. Student class에서 접근 제어자 private로 설정해두었기 떄문이다.

//즉 private 접근 제어자로 멤버 변수에 새로운 데이터값을 대입하지 못함.

//s.studentName = "고주몽";

//private로 선언한 studentName 변수를 외부 코드에서 사용하려면 get(), set() 메서드를 사용해야한다.

s.grade = 3;

s.address = "고구려";

 

s.show();

System.out.println("------------------");

//System.out.println(s.StudentName());//오류 발생

//getter로 데이터값 확인

System.out.println("s.getStudentName() = " + s.getStudentName());//null 출력

System.out.println("------------------");

//setter로 데이터값 넣기

s.setStudentName("고주몽");

s.show();

 

}

 

}

그림 3. getter, setter 메서드

private 변수 1개에 setter, getter 하나씩 있어야한다.

 

실습1) public int grade에서 private int grade 변경

//231204

package test5_3;

 

public class Student1 {

 

int studentID;

private String studentName;

private int grade;

public String address;

 

public String getStudentName() {

return this.studentName;

}

 

public void setStudentName(String studentName) {

this.studentName = studentName;

}

 

public int getGrade(int grade) {

return this.grade = grade;

}

 

public void setGrade(int grade) {

this.grade = grade;

}

 

public void show() {

System.out.println("studentID = " + studentID);

System.out.println("studentName = " + studentName);

System.out.println("grade = " + grade);

System.out.println("address = " + address);

 

}

}

 

//231204

package test5_3;

 

public class Student_Main1 {

 

public static void main(String[] args) {

Student1 s = new Student1();

s.show();

System.out.println("-----------------");

s.studentID = 231204;

s.address = "철원";

s.show();

System.out.println("-----------------");

//setter로 데이터값 넣기

 

s.setGrade(2);

s.show();

System.out.println("-----------------");

s.setStudentName("궁예");

s.show();

 

 

}

 

}

그림 4. 실습1 결과

 

실습2)

//231204

package test5_3;

 

public class Student2 {

 

public int studentID;

private String studentName;

public int grade;

public String address;

 

//기본생성자

public Student2() {}

 

public void show() {

System.out.println("studentID = " + studentID);

System.out.println("studentName = " + studentName);

System.out.println("grade = " + grade);

System.out.println("address = " + address);

}

 

 

}

 

여기서 우클릭 Generate Getters and Setters 클릭하면 그림 5(오른쪽 그림)와 같이 체크한 후 Gnerate 클릭하면 자동으로 생성해준다.

※단축키 : Alt + Shift + S 

그림 5. Source

//231204

package test5_3;

 

public class Student2 {

 

public int studentID;

private String studentName;

public int grade;

public String address;

 

//기본생성자

public Student2() {}

 

public String getStudentName() {

return studentName;

}

 

public void setStudentName(String studentName) {

this.studentName = studentName;

}

 

public void show() {

System.out.println("studentID = " + studentID);

System.out.println("studentName = " + studentName);

System.out.println("grade = " + grade);

System.out.println("address = " + address);

}

 

 

}

 

//231204

package test5_3;

 

public class Student_Main2 {

 

public static void main(String[] args) {

Student2 s = new Student2();

s.show();

System.out.println("--------------------");

s.studentID = 231204;

s.grade = 2;

s.address = "한양";

s.show();

System.out.println("--------------------");

s.setStudentName("이성계");

s.show();

System.out.println("--------------------");

 

 

}

 

}

그림 6. 실습2 결과

 

this 예약어

클래스의 멤버변수와 메서드안에서만 사용되는 매개변수의 구분을 명확하기 위해 사용

클래스 내의 멤버 변수에 접근할 수 있음

자기 자신(객체)의 메모리 주소를 나타냄

객체 자신의 참조가 필요할 경우에 사용

 

생성된 인스턴스 스스로를 가리키는 예약어인데 이 외에도 다른 역할로 this를 사용할 수 있음

자신의 메모리를 가리키는 this
자신의 멤버에 접근 : this.멤버변수

//231204

package test6;

 

//설계도 클래스

//.java 형식으로 존재하지 않고 컴파일해서 사용할 때 존재하게 됨.(bin 폴더 내에 .class로만 존재)

class BirthDay1{

public int day;

public int month;

private int year;

 

//기본 생성자

public BirthDay1() {}

 

//접근자 : getter

public int getYear() {

return year;

}

//생성자 : setter

public void setYear(int year) {

this.year = year;

}

 

//this 출력 메서드 : 클래스내에서 자신을 출력해보는 메서드

public void printThis() {

System.out.println(this);//객체(인스턴스)를 생성하면 객체명이 됨

}

 

 

public void show() {

System.out.println("day = " + day);

System.out.println("month = " + month);

System.out.println("year = " + year);

}

 

 

 

 

}

 

public class ThisExample1 {

 

public static void main(String[] args) {

BirthDay1 b = new BirthDay1();

b.show();

System.out.println("-------------------");

b.setYear(2000);

System.out.println("b.getYear() = " + b.getYear());

System.out.println("-------------------");

b.show();

System.out.println("-------------------");

b.printThis();

 

}

 

}

그림 7. 자신의 메모리를 가리키는 this

 

 

생성자에서 다른 생성자를 호출하는 this

생성자에서 다른 생성자를 호출 : this()

//231204

package test6;

 

class Person{

 

public String name;

public int age;

 

//기본 생성자

Person(){}

 

 

//일반 생성자 : 1)객체 생성 시 이름을 넣어주지 않으면 객체를 생성해주지 않음

public Person(String name) {

this.name = name;

}

 

 

//일반 생성자 : 2) 객체 생성 시 이름, 나이를 넣어주지 않으면 객체를 생성해주지 않음

public Person(String name, int age) {

this.name = name;

this.age = age;

}

 

//멤버 변수 내의 데이터값을 출력하는 메서드

public void show() {

System.out.println("이름 = " + name);

System.out.println("나이 = " + age);

}

 

}

 

 

public class CallAnotherConst {

 

public static void main(String[] args) {

//기본 생성자를 호출해서 멤버 변수의 데이터값을 초기화해서 객체 생성

Person p = new Person();

p.show();

System.out.println("----------------");

 

//일반 생성자 1)

Person p1 = new Person("단군");

p1.show();

System.out.println("----------------");

//일반 생성자 2)

Person p2 = new Person("단군", 1000);

p2.show();

 

}

 

}

그림 8.  생성자에서 다른 생성자를 호출하는 this 1

//231204

package test6;

 

class Person1{

 

public String name;

public int age;

 

//기본 생성자

Person1(){

this("단군",20);

// ==

//this.name = "단군";

//this.age = 1000;

}

 

public Person1(String name, int age) {

this.name = name;

this.age = age;

}

 

//멤버 변수 내의 데이터값을 출력하는 메서드

public void show() {

System.out.println("이름 = " + name);

System.out.println("나이 = " + age);

}

 

}

 

public class CallAnotherConst1 {

 

public static void main(String[] args) {

//기본 생성자를 호출해서 멤버 변수의 데이터값을 초기화해서 객체 생성

Person1 p = new Person1();

p.show();

System.out.println("----------------");

 

}

 

}

그림 9. 생성자에서 다른 생성자를 호출하는 this 1

 

728x90

'KDT > Java' 카테고리의 다른 글

231207 Java  (0) 2023.12.07
231206 Java  (0) 2023.12.06
231130 Java  (0) 2023.11.30
231129 Java  (0) 2023.11.29
231127 Java  (0) 2023.11.27