한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지_패스트 캠퍼스 챌린지 08일차

2021. 9. 13. 23:07IT공부/Java&Spring 이용한 웹프로그래밍

09. 참조 자료형 변수

참조 자료형

  • 변수의 자료형

  • 클래스형으로 변수를 선언
  • 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다름
  • 참조 자료형을 사용 할때는 해당 변수에 대해 생성하여야 함
    (String 클래스는 예외적으로 생성하지 않고 사용할 수 있음)

참조 자료형 정의하여 사용하기

  • 학생이 수강한 과목들에 대한 성적을 산출하기 위한 경우 학생 클래스 속성에 과목이 모두 있으면 불합리
  • 학생(Student)과 과목(Subject)에 대한 클래스를 분리하여 사용하고 Subject 클래스를 활용하여 수강한 과목들의 변수의 타입으로 선언

  • 선언된 Subject 변수는 생성된 인스턴스가 아니므로, Student의 생성자에서 생성하여 사용

Student.java

package ch09;

        public class Student {

           int studentID;

          String studentName;

          Subject korea;

          Subject math;

       public Student(int id, String name) {

            studentID = id;

            studentName = name;

            korea = new Subject();

            math = new Subject();

        }

      public void setKoreaSubject(String name, int score) {

      korea.subjectName = name;

      korea.score = score;

      }

       public void setMathSubject(String name, int score) {

      math.subjectName = name;

      math.score = score;

       }

       public void showStudentSocre() {

       int total = korea.score + math.score;

       System.out.println(studentName + " 학생의 총점은 " + total + "점 입니다." );

      }

}

Subject.java

package ch09;

public class Subject {

       String subjectName;

       int score;

       int subjectID;

}

StudentTest.java

package ch09;

public class StudentTest {

      public static void main(String[] args) {

            Student studentLee = new Student(100, "Lee");

            studentLee.setKoreaSubject("국어", 100);

            studentLee.setMathSubject("수학", 95);

            Student studentKim = new Student(101, "Kim");

            studentKim.setKoreaSubject("국어", 80);

            studentKim.setMathSubject("수학", 99);

            studentLee.showStudentSocre();

            studentKim.showStudentSocre();

      }

}

10. 접근 제어 지시자(access modifier)와 정보은닉(infomation hiding)

접근 제어 지시자 (accesss modifier)

  • 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
  • private : 같은 클래스 내부에서만 접근 가능 ( 외부 클래스, 상속 관계의 클래스에서도 접근 불가)
  • 아무것도 없음 (default) : 같은 패키지 내부에서만 접근 가능 ( 상속 관계라도 패키지가 다르면 접근 불가)
  • protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음
  • public : 클래스의 외부 어디서나 접근 할 수 있음

get()/ set() 메서드

  • private 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공
  • get() 메서드만 제공 되는 경우 read-only 필드
  • 이클립스에서 자동으로 생성됨

정보 은닉

  • private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만 변수가 public으로 공개되었을 때보다

private 일때 각 변수에 대한 제한을 public 메서드에서 제어 할 수 있다.

 

public void setMonth(int month) {

         if ( month < 1 || month > 12) {

            isValid = false;

        } else {

         this.month = month;

       }

}

객체 지향 프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다

 

11. 캡슐화 (encapsulation)

정보 은닉을 활용한 캡슐화

  • 꼭 필요한 정보와 기능만 외부에 오픈함
  • 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 함
  • 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화 한다.

레포트 만들기 예제

 

public class MakeReport {

        StringBuffer buffer = new StringBuffer();

        private String line = "===========================================\n";

        private String title = " 이름\t 주소 \t\t 전화번호 \n";

        private void makeHeader() {

          buffer.append(line);

          buffer.append(title);

          buffer.append(line);

        }

        private void generateBody() {

          buffer.append("James \t");

          buffer.append("Seoul Korea \t");

          buffer.append("010-2222-3333\n");

          buffer.append("Tomas \t");

          buffer.append("NewYork US \t");

          buffer.append("010-7777-0987\n");

        }

        private void makeFooter() {

          buffer.append(line);

        }

        public String getReport() {

           makeHeader();

           generateBody();

           makeFooter();

          return buffer.toString();

         }

}

 

public class TestReprt {

          public static void main(String[] args) {

           MakeReport report = new MakeReport();

            String builder = report.getReport();

           System.out.println(builder);

        }

}

12. 객체 자신을 가리키는 this

this가 하는 일

  • 인스턴스 자신의 메모리를 가리킴
  • 생성자에서 또 다른 생성자를 호출 할때 사용
  • 자신의 주소(참조값)을 반환 함

생성된 인스턴스 메모리의 주소를 가짐

  • 클래스 내에서 참조변수가 가지는 주소 값과 동일 한 주소 값을 가지는 키워드

public void setYear(int year) {

        this.year = year;

   }

 

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

  • 클래스에 생성자가 여러 개 인경우, this를 이용하여 생성자에서 다른 생성자를 호출할 수 있음
  • 생성자에서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음

public class Person {

        String name; int age;

        public Person() {

          this("이름없음", 1);

        }

       public Person(String name, int age) {

          this.name = name;

          this.age = age;

      }

}

자신의 주소를 반환하는 this

 

public class Person {

     String name;

     int age;

     public Person() {

        this("이름없음", 1);

      }

     public Person(String name, int age) {

       this.name = name;

       this.age = age;

      }

    public Person getPerson() {

        return this;

     }

    public static void main(String[] args) {

      Person p = new Person();

      p.name = "James";

      p.age = 37;

      Person p2 = p.getPerson();

     System.out.println(p);

     System.out.println(p2);

    }

}

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

강의에 대해 정확하게 알고 싶다면 

https://bit.ly/37BpXiC