결합성
-클래스 사이의 상호 관계 정도
-클래스를 일관성 있게 만들면, 관련되어 있지 않는 "개념" 을 분리해서 새로운 클래스에 구성할 수 있다.
- 클래스 간 관계 생성 가능.
연관
- 두 클래스 사이가 연결됨.
- 클래스 간의 참조가 사용됨.
- 클래스의 멤버 변수로 다른 클래스가 저장됨.
-uml 에서는 실선이나 화살표를 이용한다.
import java.util.Random;
class Dice{
private Random random; //private이므로 클래스 밖에서 수정할 수 없음.
public Dice(Random random){
this.random=random;
}
public int roll() {
return random.nextInt(6)+1; //1부터 6까지의 랜덤 추출
}
}
public class TestDice{
public static void main(String[] args){
Random random=new Random();
Dice dice1=new Dice(random);
dice1.roll();
Dice dice2=new Dice(random);
dice2.roll();
의존
-연관과 비슷하나 참조를 사용하는 시기가 짧다.
-메소드 내부에서 다른 클래스 객체를 생성해서 사용하는 경우,
-메소드에 인자로 다른 클래스 객체를 전달 받아 함수 내부에서 다른 클래스의 메소드 호출.
-메소드에서 다른 클래스 객체를 반환하고, 반환 받은 쪽에서 메소드를 호출.
-uml 에서는 점선으로 표시
집합
- 생성자나 메소드에 입력으로 다른 객체를 전달받아서 멤버 변수에 저장한다면 집합으로 보면 됨.
- 신체와 렌즈의 관계처럼 전체와 부분의 생명 주기가 다르다.
- uml 에서는 다이아몬드가 비어있는 모양이다.
구성
- 집합은 전체와 부분의 생명 주기가 일치하지 않았으나 구성은 일치한다.
- 신체와 눈의 관계이다= 신체가 죽으면 눈도 죽으므로 생명 주기가 일치함.
- 생성자나 메소드에서 객체를 생성해서 멤버 변수에 저장한다면 구성이라고 보면 된다.
<정리>
연관: -- , --> (단방향)
의존: .. ..>(단방향)
집합:◇--
구성 ◆--
실습 문제 1: PC를 만들어본다
문제
개인용 컴퓨터인 PC(personal computer)는 일반적으로 본체와 모니터로 구성 이러한 경우를 고려해서 클래스를 만들어보기
요구사항
PC는 본체, 모니터 외에 키보드 마우스도 있음 여기서는 키보드/마우스는 제외
컴퓨터 – 전원 공급 장치(power supply), CPU, 메모리, 하 드 디스크를 속성으로 포함
모니터- 전원 공급 장치, 크기, 컬러 등을 속성으로 포함 속성의 자세한 자료형은 지정하지 않음
UML로 클래스간의 상관 관계에 대해서 다이어그램 작성
pc-> monitor
-> computer
Class pc{
Monitor m;
Computer c;
void turnOn(){
System.out.println("전원을 킵니다.");
}
}
Class Monitor{생략..}
Class Computer{생략..}
=> 클래스의 멤버 변수로 다른 클래스가 저장됨.
ex) Computer c, Monitor m;
=>구성 관계
실습 문제 2
수강 신청하는 프로그램 작성
문제
이번 학기에 개설되는 실습 과목인 객체 지향 강좌를 수강 신청하는 프로그램을 작성
최대 인원은 30명
강사는 김갑돌
강의실은 G416
요구사항
문제의 목적은 클래스 사이의 연관 관계를 살펴보는 것
따라서 각 클래스의 모든 기능을 사용하는 코드를 작성하지는 않음
객체 지향 강좌를 수강하는 프로그램을 작성하지만, 클래스들은 가능하면 일반화시킬 것
사실 저거 이해 안 가서 알아서 해봤는데
나는 사실 등록할 때마다 count를 늘려 배열 크기를 늘리고 싶었다.
교수님 말씀으론 코드가 길어져서 비효율적이라고 하셨다.
고정된 크기의 배열을 사용한다면 코드는 간단해진다. 데이터를 저장하는 공간의 크기를 필요할 때 늘리고 싶다면 배열은 적합하지 않고, 자료구조에서 배운 리스트가 더 낫다.
애초에 MAX_STUDENTS를 정해줬으니 배열 크기를 30으로 정하고,
this.Students[count]=StudentN; //학생 이름을 배열에 저장하는것
으로 코드를 간략하게 끝내면 되는 거였다..^^
public class ObjectOrientedCourse {
final static int MAX_STUDENTS=30;
String lecturer;
String room;
String[]Students;
int count;
ObjectOrientedCourse(String lecturer,String room){
this.lecturer=lecturer; //강사
this.room=room; //강의실
count=0;
Students=new String[MAX_STUDENTS];
}
//수강신청 학생 이름으로
void enroll(String StudentN){ //count 변수를 이용해서 몇명이 등록되었는지 확인.
if(count>=MAX_STUDENTS){
System.out.println("인원이 꽉 찼습니다!");
}
this.Students[count]=StudentN; //학생들이 배열에 저장.
count++;
}
//만약 등록할 떄마다 count 값이 변하게 하고 싶다면 새로운 배열을 만들어서 기존 값을 복사.
// void envroll(String StudentN){
// String[] tempStudents=new String[count+1];
// // 새로운 배열 생성.
// for(int i=0;i<count;i++){
// tempStudents[i]=this.Students[i];
// } // 기존 배열의 내용을 새로운 배열에 복사하기.
// this.Students=tempStudents; //새로 할당된 배열을 멤버 변수가 참조하도록 함.
// this.Students[count]=StudentN; //새로운 학생 추가
// }
void drop(String StudentN){ //드랍
for(int i=0; i<this.Students.length;i++){
if(StudentN.equals(this.Students[i])){
for(int j=i+1;j<count ;j++) { //그 학생 뒷사람부터 앞으로 한칸이동
this.Students[j-1]=this.Students[j];
}
count--; // 등록인원줄임
break; //바깥쪽 반복문 빠져나감
}
}
}
int getNumEnrolled(){
return count;
}
void printEnrolled(){
for(int i=0;i<Students.length;i++){
if(Students[i]==null){
break;
}
System.out.println(Students[i]);
}
}
public static void main(String[] args) {
ObjectOrientedCourse o=new ObjectOrientedCourse("김강사","302");
o.enroll("김똥깨");
o.printEnrolled();
}
}
어렵다 뭐라는지 하나도 모르겠다
이거 사실 클래스 구성? 뭐 어쩌고에 대한 건데
정작 Student 클래스는 만들지도 않은상태에서 String 한건데..
뭐 String을 Student 로 고치면 되겠지만!
'SCHOOL > 객체지향 프로그래밍' 카테고리의 다른 글
자바의 메모리 영역 (0) | 2023.11.07 |
---|---|
자바의 배열 (0) | 2023.11.07 |
Main 함수와 Scanner (0) | 2023.11.07 |
객프 6주차 과제 (0) | 2022.11.16 |
자바 접근 제어자 (0) | 2022.11.16 |