[JAVA] 객체와 객체 지향 – 참조 자료형 변수 와 접근 제어 지시자

– 참조 자료형 변수

참조 자료형 변수는 객체의 주소를 저장하는 변수입니다. 이 변수는 실제 데이터를 직접 포함하지 않고, 객체가 저장된 메모리 주소를 가리킵니다.
참조 자료형 변수는 객체를 생성할 때 사용되며, new 키워드를 사용하여 동적으로 메모리를 할당하고 객체를 생성합니다. 변수에는 객체의 주소가 저장되며, 이를 통해 프로그램은 해당 객체에 접근하고 조작할 수 있습니다.
예를 들어, 다음은 문자열을 나타내는 String 클래스의 객체를 생성하고 이를 참조하는 변수의 예입니다.
String myString = new String("Hello, World!");
이 코드에서 myString은 문자열 “Hello, World!”를 저장하는 새로운 객체를 참조합니다. 변수 myString은 실제 문자열 데이터를 직접 포함하지 않고, 해당 문자열이 저장된 메모리 주소를 가리킵니다.
참조 자료형 변수는 객체지향 프로그래밍에서 중요한 역할을 합니다. 이를 통해 객체 간의 상호 작용과 데이터 공유가 가능하며, 프로그램의 유연성과 확장성을 높일 수 있습니다.
  • 클래스형으로 변수를 선언
  • 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다르다
  • 참조 자료형을 사용 할 때는 해당 변수에 대해 생성하여야 함 (String 클래스는 예외적으로 생성하지 않고 사용할 수 있음)
public class Student {
    int studentId;
    String studentName;

   Subject korean;
   Subject math;

   public Student(int id, String name){
       this.studentId = id;
       this.studentName = name;

       korean = new Subject();
       math = new Subject();
   }
   public void setKoreanSubject(String name, int score){
       korean.subjectName = name;
       korean.score = score;
   }
    public void setMathSubject(String name, int score){
        math.subjectName = name;
        math.score = score;
    }
    public void showStudentScore(){
       int total = korean.score + math.score;
        System.out.println(studentName + "학생의 총점은 " + total + "점 입니다.");
    }

}
//-----------------------------------------------------------------------------------------------------
public class Subject {
  int score;
  String subjectName;
}
//-----------------------------------------------------------------------------------------------------
public class StudentTest {
    public static void main(String[] args) {
        Student studentLee = new Student(100, "Lee");
        Student studentKim = new Student(101, "Kim");

        studentLee.setKoreanSubject("국어", 100);
        studentLee.setMathSubject("수학", 95);

        studentKim.setKoreanSubject("국어", 80);
        studentKim.setMathSubject("수학", 99);

        studentLee.showStudentScore();
        studentKim.showStudentScore();
    }
}

– 접근 제어 지시자

자바에서 접근 제어 지시자는 클래스, 변수, 메서드 및 생성자의 접근 가능성을 제어하는 데 사용됩니다. 이는 객체지향 프로그래밍에서 정보 은닉과 캡슐화를 위해 중요한 역할을 합니다.
가장 널리 사용되는 접근 제어 지시자에는 다음과 같은 네 가지가 있습니다.
  1. public: public 접근 제어 지시자는 해당 멤버를 모든 클래스에서 접근 가능하도록 합니다. 따라서 해당 멤버에 대한 외부 클래스와의 상호 작용을 허용합니다.
  2. private: private 접근 제어 지시자는 해당 멤버를 같은 클래스 내에서만 접근 가능하도록 제한합니다. 외부 클래스에서는 해당 멤버에 직접 접근할 수 없으며, 대신 해당 클래스의 메서드를 통해 접근해야 합니다.
  3. protected: protected 접근 제어 지시자는 같은 패키지 내의 클래스 및 해당 클래스를 상속하는 하위 클래스에서만 접근 가능하도록 합니다. 외부 패키지에서는 해당 멤버에 직접 접근할 수 없습니다.
  4. default (package-private): 접근 제어 지시자를 명시적으로 지정하지 않으면 해당 멤버는 기본적으로 패키지 내에서만 접근 가능하도록 됩니다. 이러한 접근 제어 지시자를 package-private라고도 합니다.
이러한 접근 제어 지시자를 사용하여 클래스의 멤버를 적절하게 제한함으로써 정보 은닉을 실현하고 외부로부터의 접근을 제어할 수 있습니다. 이는 코드의 안전성과 유지 보수성을 향상시키는 데 도움이 됩니다.
  • 정보은닉
public class BirthDay {
    private int day;
    private int month;
    private int year;

    boolean isValid;

    public BirthDay(){
        isValid = true;
    }

    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        if(month < 1 || month > 12){
            isValid = false;
            return;
        }
        this.month = month;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        if (year < 0){
            isValid = false;
            return;
        }
        this.year = year;
    }
    public boolean isValid(){
        return isValid;
    }
}
//-----------------------------------------------
public class BirthDayTest {
    public static void main(String[] args) {

        BirthDay day = new BirthDay();
        day.setYear(2023);
        day.setMonth(15);
        day.setDay(30);

        System.out.println(day.isValid());

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

댓글 남기기