27강 : 클래스 정보은닉
28강 : 자기 자신을 가리키는 "this"
29-1강 : 객체간의 협력 (부제: 카페에서 생긴 일 )




Student.java
public class Student {
// 속성
private String schoolName;
private int classYear; // 몇 학년
private int classroomNumber; // 몇 반
private int studentNumber; // 몇 번
// 기본 정보
private String name;
private String gender;
// 행위
void study(Teacher teacher, String subjectName){
String teacherName = teacher.getName();
System.out.printf("학생: 저는 %s 선생님에게 %s 과목을 배웁니다.\n", teacherName, subjectName);
}
// 생성자
Student(){
}
Student(String pName, String pGender){
name = pName;
gender = pGender;
}
Student(String pSchoolName, int pClassYear, int pClassroomNum, int pStudentNum, String pName,String pGender){
schoolName = pSchoolName;
classYear = pClassYear;
classroomNumber = pClassroomNum;
studentNumber = pStudentNum;
name = pName;
gender = pGender;
}
// getter
public String getName() {
return name;
}
}
Subject.java
public class Subject {
private String subjectName;
private String subjectCode;
void setSubjectName(String pSubjectName){
subjectName = pSubjectName;
}
void setSubjectCode(String pSubjectCode){
subjectCode = pSubjectCode;
}
}
Teacher.java
public class Teacher {
// 속성
// 학교 정보
private String schoolName;
// 담당 과목
private Subject subject;
// 기본 정보
private String name;
private String gender;
// 행위
void teach(Student student, String subjectName){
String studentName = student.getName();
System.out.printf("선생: %s 학생에게 %s 과목을 가르치고 있습니다.\n", studentName, subjectName);
}
Teacher() {}
Teacher(String pName, String pGender, String pSubjectName, String pSubjectCode){
name = pName;
gender = pGender;
Subject newSubject = new Subject();
newSubject.setSubjectName(pSubjectName);
newSubject.setSubjectCode(pSubjectCode);
subject = newSubject;
}
// getter
public String getName(){
return name;
}
}
Test.java
public class Test {
//
String testName; // 시험이름
String place; // 치는 장소
String startDate; // 시험 시작 날짜
String endDate; // 시험 종료 날짜
// 시험 과목들
Subject testSubject1;
Subject testSubject2;
Subject testSubject3;
// 행위
}
PackageOne-ClassA.java
public class ClassA {
// Public
public String publicStr;
// private
private String privateStr;
// default
String defaultStr;
public void methodPublic(){};
private void methodPrivate(){};
void methodDefault(){};
void testPrivate(){
String str = privateStr;
methodPrivate();
}
}
PackageOne-ClassAA.java
public class ClassAA {
void testPublic(ClassA classA){
String str = classA.publicStr;
classA.methodPublic();
}
void testPrivate(ClassA classA){
// String str = classA.privateStr;
// classA.methodPrivate();
}
void testDefault(ClassA classA){
String str = classA.defaultStr;
classA.methodDefault();
}
}
PackageTwo-ClassB.java
public class ClassB {
public void testPublish(ClassA classA){
String str = classA.publicStr;
classA.methodPublic();
}
public void testPrivate(ClassA classA){
// String str = classA.privateStr;
// classA.methodPrivate();
}
public void testDefault(ClassA classA){
// String str = classA.defaultStr;
// classA.methodDefault();
}
}



< 진행 >
1. Person로 ”this’를 반환하는 함수 만들자.
2. Person을 출력하자.
< 준비 >
이전에 구현했던 “Student”, “Teacher”, “Subject” 복사
< 진행 >
1. 기존 pName, pGender로 되어있던 부분 ”this” 사용하기
2. 생성자 오버로딩 부분 this로 교체
BirthDay.java
package org.michelle.chapter_28;
public class BirthDay {
//
private int year;
private int month;
private int day;
public void setYear(int year){
this.year = year;
}
private void printHi(){
System.out.println("Hi");
}
BirthDay(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
this.printHi();
}
}
Person.java
public class Person {
//
private String name;
private String gender;
private int age;
public void showMyself(){
System.out.printf("Person 인스턴스: name: %s, gender: %s, age: %d\n", this.name, this.gender, this.age);
}
public Person(String name){
this(name, "unknown");
}
public Person(String name, String gender){
this(name, gender, -1);
}
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
//
public Person returnMySelf(){
return this;
}
}
Student.java
public class Student {
// 속성
private String schoolName;
private int classYear; // 몇 학년
private int classroomNumber; // 몇 반
private int studentNumber; // 몇 번
// 기본 정보
private String name;
private String gender;
// 행위
void study(Teacher teacher, String subjectName){
String teacherName = teacher.getName();
System.out.printf("학생: 저는 %s 선생님에게 %s 과목을 배웁니다.\n", teacherName, subjectName);
}
// 생성자
Student(){
}
Student(String name, String gender){
this("School", 1, 3, -1, name, gender);
}
Student(String schoolName, int classYear, int classroomNum, int studentNum, String name,String gender){
this.schoolName = schoolName;
this.classYear = classYear;
this.classroomNumber = classroomNum;
this.studentNumber = studentNum;
this.name = name;
this.gender = gender;
}
// getter
public String getName() {
return this.name;
}
}
Subject.java
public class Subject {
private String subjectName;
private String subjectCode;
void setSubjectName(String subjectName){
this.subjectName = subjectName;
}
void setSubjectCode(String subjectCode){
this.subjectCode = subjectCode;
}
}
Teacher.java
public class Subject {
private String subjectName;
private String subjectCode;
void setSubjectName(String subjectName){
this.subjectName = subjectName;
}
void setSubjectCode(String subjectCode){
this.subjectCode = subjectCode;
}
}
ThisTest.java
package org.michelle.chapter_28;
public static void main(String[] args){
Person person1 = new Person("강철중");
Person person2 = new Person("이민호", "Male");
Person person3 = new Person("아이유", "Female", 30);
// person1.showMyself();
// person2.showMyself();
// person3.showMyself();
Person person11 = person1.returnMySelf();
Person person22 = person2.returnMySelf();
System.out.println(person11);
System.out.println(person22);
}
}