[24.08.21수]슈퍼코딩w3:Java-OOP_2

Michelle Kim·2024년 9월 19일

Java문법정리

목록 보기
4/6

📚 오늘 공부한 강의

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

💚 27강 : 클래스 정보은닉

🦋 객체의 정보 은닉화가 중요한 이유

🦋 JAVA의 접근제어자

🦋 JAVA의 필드 접근자 메소드

👉 실습: JAVA 은닉화와 필드 접근자 메소드

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();
    }
}

💚 28강 : 자기 자신을 가리키는 "this"

🦋 ‘this’ 인스턴스 클래스 멤버 지칭할 수 있다.

🦋 ‘this’ 는 다른 생성자를 호출할 수 있다.

🦋 ‘this’ 는 인스턴스 자신의 생성주소 알려준다.

👉 실습: this 자기 자신 메모리 주소 출력하기

< 진행 >
1. Person로 ”this’를 반환하는 함수 만들자.
2. Person을 출력하자.

실습: Java this로 classroom 코드 개선하기

< 준비 >
이전에 구현했던 “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);
    }
}
profile
🇬🇧영국대학교)Computer Science학과 졸업 📚Data, AI, Backend 분야에 관심이 많습니다. 👉Email: kimbg9876@gmail.com

0개의 댓글