[JAVA #7] 참조 자료형, 접근 제어 지시자와 정보 은닉, 캡슐화

HJoo·2022년 12월 19일
0

TodayStudy

목록 보기
9/111
post-thumbnail

참조 자료형 변수

  • 기본 자료형 : int, long, float, double
  • 참조 자료형 : String, Date, Student
    클래스형으로 변수를 선언한다
    참조 자료형의 메모리의 크기는 클래스에 따라 달라진다
  • 참조 자료형을 사용할 때는 해당 변수를 생성하여 사용해야 한다
    (String 클래스는 예외적으로 생성하지 않고 사용 가능)
  • 하나의 클래스안에서 속성을 분리할 수 있다면 따로 클래스를 만들어서 분리하는 것이 합리적이다
    ex) 학생 클래스 안에 학생의 정보와 과목별 점수가 함께 있다면, 과목 클래스를 따로 만들어 학생 클래스에서 변수로 생성하여 사용할 수 있다
    Student.java
public class Student {
	
	int studentId;
	String studentName;
	
	Subject korea;
	Subject math;
	
	Student(int studentId, String studentName){
		this.studentId = studentId;
		this.studentName = studentName;
		
		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 showScoreInfo() {
		
		int total = korea.score + math.score;
		
		System.out.println(studentName + "학생의 총점은 " + total + "점 입니다.");
		
	}
}

Subject.java

public class Subject {
	
	String subjectName;
	int score;
	int subjectId;

}

SubjectTest.java

public class SubjectTest {

	public static void main(String[] args) {
		Student studentLee = new Student(100, "Lee");
		studentLee.setKoreaSubject("국어", 100);
		studentLee.setMathSubject("수학", 90);
		
		Student studentKim = new Student(101, "Kim");
		studentKim.setKoreaSubject("국어", 50);
		studentKim.setMathSubject("수학", 55);
		
		studentLee.showScoreInfo();
		studentKim.showScoreInfo();
	}

}

접근 제어 지시자

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

get/set 메서드

  • private으로 선언된 멤버변수에 대해 접근하고 수정할 수 있는 메서드를 public으로 제공한다
  • get은 선언된 값을 불러오는 메서드, set은 메서드를 통해 그 값을 수정 또는 선언할 수 있는 메서드이다
  • 메서드를 통해 if 등으로 조건을 걸 수 있기 때문에 바로 선언되어 발생하는 오류를 막을 수 있다 -> 정보 은닉

BirthDay.java

public class BirthDay {
	
	private int day;
	private int month;
	private int year;
	
	private boolean isValid;
	
	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;
		}
		else{
			isValid = true;
			this.month = month;
		}
	}

	public void showDate() {
		if(isValid) {
			System.out.println(year + "년" + month + "월" + day + "일 입니다.");
		}
		else {
			System.out.println("유효하지 않은 날짜입니다.");
		}
	}
	public int getYear() {
		return year;
	}


	public void setYear(int year) {
		this.year = year;
	}
	
}

BirthDayTest.java

public class BirthDayTest {

	public static void main(String[] args) {

		BirthDay date = new BirthDay();
		date.setYear(2022);
		date.setMonth(11);
		date.setDay(29);
		
		
	}

}

정보 은닉

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

캡슐화

  • 정보 은닉을 활용해 캡슐화를 한다
    꼭 필요한 정보와 기능을 오픈하고 나머지는 은닉하는 방법
    대부분의 변수와 메서드를 감추고 외부에서는 통합된 인터페이스를 이용하여 일관된 기능만을 구현하게 한다.
    직접 접근하면서 발생하는 오류를 최소화한다.

String을 연결하는 방법으로 제일 많이 사용되는 .append를 사용
\t, \n을 사용해서 탭, 개행도 삽입

  • 이름, 주소, 전화번호를 포함한 문자열을 생성하는 코드가 있는데,
    헤더 - 바디 - 풋터 순으로 출력을 해야한다
    미리 캡슐화를 통해 순서와 내용을 지정하고
    클라이언트 쪽에서는 getReport를 통해 전체 내용만을 출력할 수 있게 하여
    순서가 바뀌는 오류 상황을 제거했다

MakeReport.java

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-1111-2222 \n");

        buffer.append("Tomas \t");
        buffer.append("NewYork Us \t \t");
        buffer.append("010-2222-3333 \n");

    }

    private void makeFooter(){
        buffer.append(line);

    }

    public String getReport(){
        makeHeader();
        generateBody();
        makeFooter();
        return buffer.toString();
    }
}

MakeReportTest.java

public class MakeReportTest {

    public static void main(String[] args) {
        MakeReport builder = new MakeReport();
        String report = builder.getReport();

        System.out.println(report);
    }
}
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글