구성 | 상속 |
- has-a 관계 - 여러 클래스에서 코드를 재사용 가능 - 실생 시간에 결정 - 클래스가 다른 클래스의 인스턴스를 클래스의 필드로 가짐 - 하나의 클래스를 다른 클래스의 합으로 정의 - 느슨한 결합이므로 코드 손상될 위험 小 - 공개 인터페이스만 사용하여 상호작용 |
- is-a 관계 - 하나의 클래스에서만 코드 재사용 가능 (하나의 클래스 상속) - 컴파일 시간에 결정 - 객체가 클래스를 상속 받아서 부모 객체의 속성, 동작을 획득 - 한 클래스를 다른 클래스에서 파생 - 부모 클래스를 변경하면 코드 손상될 위험 多 - 부모 클래스의 public ~ protected 메소드가 모두 노출 |
- 클래스를 연결하여 코드 재사용성 제공 |
has-a 관계 (구성)
하나의 클래스 안에 다른 클래스를 가리키는 참조 변수 정의 후, 실체 객체 생성 후 대입
class Date {
private int year, month, date;
public Date(int year, int month, int date) { //생성자
this.year = year;
this.month = month;
this.date = date;
}
@Override
public String toString() {
return "Date[year = " + year + ", month = " + month + ", date = " + date + "]";
}
}
class Employee {
private String name;
private Date birthDate; //객체를 가리킬 수 있는 참조변수 (구성)
public Employee(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
@Override
public String toString() {
return "Employee[name = " + name + ", birthDate = " + birthDate.toString() + "]";
}
}
public class Test {
public static void main(String[] args) {
Date birth = new Date(1990, 1, 1);
Employee emp = new Employee("홍길동", birth);
System.out.println(emp);
}
}
* 참조변수는 반드시 의미있는 객체를 가리켜야 함. -> new 생성자 또는 매개변수로 받은 객체 등
* NullpointExceptopn 오류 -> 참조변수가 의미 있는 객체를 가리키고 있지 않을 때 발생하는 오류
만약 month의 값을 변환하고 싶다면?
1. birth.month = 12; // 참조변수 birth가 가리키는 객체의 month 값 변경
2. emp.birthDate.month = 12; // 참조변수 emp가 가리키는 객체의 참조변수 birthDate가 가리키는 객체의 month 값 변경
class Point {
int x, y;
public Point(int x, int y) { //생성자
this.x = x;
this.y = y;
}
}
class Circle {
int radius = 0;
Point center; //Point 참조 변수가 필드로 선언되어 있음. 의미 있는 객체를 가리키는 작업 필요
public Circle(int radius, Point center) { //생성자
this.radius = radius;
this.center = center;
}
}
public class Test {
public static void main(String[] args) {
Point p = new Point(25, 70);
Circle c = new Circle(10, p); //Circle 객체를 생성할 때 Point 객체 참조값을 넘김
//Circle c = new Circle(10, new Point(25, 70));
//도 가능함. 이때 Point 객체 접근은 참조변수 c로만 가능
p.x = 100;
System.out.println(p.x);
System.out.println(c.center.x);
c.center.y = 20;
System.out.println(c.center.y);
Point pc = c.center; //Point 객체를 가리키는 새로운 참조변수
//(무한대로 생성 가능하지만, 코드가 복잡해지기 때문에 적당한 수로 하는 것이 좋음)
}
}
- new 생성자로 참조변수가 의미 있는 객체 가리키게 하는 코드
class Point {
int x, y;
public Point(int x, int y) { //생성자
this.x = x;
this.y = y;
}
}
class Circle {
int radius = 0;
Point center; //Point 참조 변수가 필드로 선언되어 있음. 의미 있는 객체를 가리키는 작업 필요
public Circle () { //생성자
this.radius = 0;
this.center = new Point(0, 0);
}
public Circle(int radius, Point center) { //생성자
this.radius = radius;
this.center = center;
}
}
public class Test {
public static void main(String[] args) {
Circle c = new Circle();
System.out.println(c.center.x);
System.out.println(c.center.y);
System.out.println(c.radius);
System.out.println();
c.center.x = 10;
c.center.y = 20;
c.radius = 30;
System.out.println(c.center.x);
System.out.println(c.center.y);
System.out.println(c.radius);
}
}
//출력결과
0
0
0
10
20
30
구성에서 설정자와 접근자
- 자바 개발자들의 암묵적인 코드
//접근자
public Point getCenter() {
return center;
}
//설정자
public void setCenter(Point center) {
this.center = center;
}
소속변수 초기화
- 클래스에서 소속변수 선언할 때 초기화 하는 것은 나쁜 습관임.
ex. private int radiuse = 0;
ex. private Point center = new Point(0, 0);
- 소속변수 초기화는 생성자 내부에서 하는 것이 좋은 습관임.
private int radius;
private Pointer center;
public Circle () { //생성자
this.radius = 0;
this.center = new Point(0, 0);
}
'JAVA' 카테고리의 다른 글
[JAVA] 패키지란? (0) | 2024.06.27 |
---|---|
파일 입출력 - 객지설 13주차 (0) | 2024.06.01 |
컬렉션/ArrayList/HashSet - 객지설 11주차 (0) | 2024.05.23 |
제네릭 - 객지설 10주차 (0) | 2024.05.17 |
예외 처리 - 객지설 7~9주차 (0) | 2024.05.10 |