본문 바로가기

JAVA

상속과 구성 - 객지설 12주차

구성 상속
- 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