- 참조 자료형을 사용할 때는 해당 변수를 생성하여 사용해야 한다
(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 : 클래스의 외부 어디서나 접근할 수 있음
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);
}
}