1. 클래스의 관계
1) 일반화 관계
: 부모클래스를 상속받아 자식 클래스에서 사용
2) 실체화 관계
: 인터페이스를 상속받아 자식클래스에서 재정의하여 사용
3) 연관 관계 / 직접 연관 관계(Direct Association)
: 포함관계 - 클래스 안에 필드를 참조변수로 선언 하여 사용
public class CarApp {
public static void main(String[] args) {
Engine ticoEngine = new Engine();
ticoEngine.setFualType("경유");
ticoEngine.setDisplacement(1000);
Car tico = new Car();
tico.setModelName("티코");
tico.setProductionYear(2018);
//엔진 인스턴스를 생성하여 참조변수에 저장(변경)
tico.setEngine(ticoEngine);
tico.carDisplay();
System.out.println("====================================");
Car sonata = new Car("소나타", 2020, new Engine("휘발유", 2000));
sonata.carDisplay();
}
}
//자동차 정보 : 모델명, 생산년도, 엔진정보 를 저장하기 위한 클래스
public class Car {
private String modelName;
private int productionYear;
//엔진 정보(엔진 인스턴스)를 저장하기 위한 참조필드 -> 포함관계
//관계가 성립되기 위해서는 반드시 참조필드에 인스턴스가 ★저장★되어야함
private Engine engine;//거꾸로 엔진은 자동차를 사용할 수 없음
public Car() {
// TODO Auto-generated constructor stub
}
public Car(String modelName, int productionYear, Engine engine) {
super();
this.modelName = modelName;
this.productionYear = productionYear;
this.engine = engine;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public int getProductionYear() {
return productionYear;
}
public void setProductionYear(int productionYear) {
this.productionYear = productionYear;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public void carDisplay() {
System.out.println("모델명 = " +modelName);
System.out.println("생산 년도 = " + productionYear);
//System.out.println("엔진정보 = " + engine);
//엔진정보는 엔진클래스에서 가져와야함
//포함관계가 성립된 클래스의 메소드를 호출하도록한다
//=>(참조필드에 저장된 인스턴스를 이용하여 메소드 호출)
//=>참조필드에 인스턴스가 저장되지 않은 상태로 메소드를 호출할 경우 nullpointerException을 발생
//nullpointerException : 참조변수에 null이 저장된 상태에서 메소드를 호출한 경우 발생되는 에러
System.out.println("엔진 정보 >> ");
System.out.println("연료타입 = " + engine.getFualType());
System.out.println("배기량 = " + engine.getDisplacement());
}
}
4) 집합 연관 관계
: 포함 관계의 인스턴스와 생명주기가 다른경우 ex) 컴퓨터 << 프린터
5) 복합 연관 관계
: 포함 관계의 인스턴스와 생명주기 같은 경우 ex) 게임 << 캐릭터
6) 의존관계
: (포함관계지만) 클래스가 자주 바뀌여도 영향이 없는 관계 ex) TV 와 리모콘
2. 상속 : 클래스를 물려받아 사용하는 기능
1) 상속을 하는 이유 ?
- 기존 클래스를 활용하여 보다 빠르게 새로운 클래스를 작성할 수 있다. 즉, 프로그램의 생산성이 증가된다
- 공통적인 속성과 기능을 정의한 클래스를 생성하여 상속받아 사용한다. 즉, 유지보수 효율성을 증가시킨다.
물려주는 class | 물려받는 class |
부모클래스(super), 선조클래스, 슈퍼클래스, 기본클래스 |
자식클래스(serve), 후손클래스,서브클래스, 파생클래스 |
참고) 다중상속을 하면 좋을 줄 알았는데 의도치 않게 끊기는 경우가 생겨 버림(부모 위에 부모에 접근을 할 수 없기 때문)
그래서 C++이후에 다중상속이 없어져 버림~
2) 부모클래스의 생성자는 자식 클래스에게 상속 불가능
3) 부모클래스의 은닉화 선언된 필드 또는 메소드는 상속 되지만 접근 불가능
public class 자식클래스 extends 부모클래스 {
//부모클래스의 필드 및 메소드 사용 가능
}
4) 자식클래스로 인스턴스를 생성할 경우 자식클래스의 생성자가 실행되기 전에 부모클래스 생성자가 먼저 실행됨
1. 상속예제
- 부모라고 해도 private필드는 자식에서 접근 불가 => setter메소드로 접근
- 자신의 것을 찾고 없으면 부모것에서 찾는것이 상속의 특징
Member | MemberEvent(extends Member) |
- MemberEvent의 부모클래스 -회원의 아이디, 이름을 필드로 가짐 -기본생성자를 만들어주어야 상속받는 MemberEvent에서 오류가 나지 않음 |
-Member의 자식클래스 -Member클래스에서 회원 email만 추가 -MemberEvent()생성자에서 id와 name필드는 접근할 수 없으므로 부모클래스의 setter메소드를 사용하여 접근하도록 함 super() 키워드 사용 1. 자식 클래스의 메소드에서 부모 인스턴스의 정보를 전달받아 저장하기 위한 참조변수임(즉, 자식에서 부모의 생성자를 호출하기 위한것) 2. MemberEvent()기본생성자에서 super는 생략가능하다. 단, super()전에 명령어가 있으면 오류가 생긴다. 3. 매개변수가 있는 생성자에서 super()를 호출해도 되지만 super(id, name)과 같이 한번에 초기화 할 수 있다.(더 편리) |
더보기
1. Member.java 전체코드 확인하기
package inheritance;
//회원정보를 (ID, 이름) 저장하기 위한 클래스
public class Member {
private String id;
private String name;
public Member() {
// TODO Auto-generated constructor stub
}
public Member(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void display() {
System.out.println("아이디 = " + id);
System.out.println("이름 = " + name);
}
}
2. MemberEvent.java 전체 코드 확인하기
package inheritance;
//이벤트 관련 회원정보(아이디, 이름, 이메일)를 저장하기 위한 클래스
//=>이미 Member클래스에 (아이디, 이름)이 저장되어 있기 때문에
//=>기존클래스를 재사용할 수 있으면 상속을 받는게 나음
//=>extends 키워드를 이용하여 기존 클래스를 상속받아 새로운 클래스를 작성
//=>상속을 이용하여 자식클래스는 부모클래스의 필드와 메소드에 접근가능
//=>단일상속만 가능(다중상속 절대 불가)
public class MemberEvent extends Member {
/*private String id;
private String name;*/
private String email;
//super : 자식 클래스의 메소드에서 부모 인스턴스의 정보를 전달받아 저장하기 위한 참조변수다
//자식클래스의 생성자에서 부모클래스의 생서자를 호출하기 위한 키워드
public MemberEvent() {
// TODO Auto-generated constructor stub
//자식클래스의 생성자에서 부모클래스의 기본생성자를 호출하는 명령
//부모클래스의 기본생성자를 호출하려고 할 경우 생략가능
//=> 만약 부모클래스의 기본생성자가 없다면 기본상속이 불가능하므로 error생김
//즉, 부모클래스에서 반드시 기본생성자를 만들어주어야 한다.
//생성자를 호출하는 명령전에 다른 명령이 존재할 경우 error
//super();가 생략되어 있다.
}
//alt + shift + s >> O >> 부모클래스의 생성자 선택 (이걸 하지 않으면 그냥 super()로 호출)>> 필드선택
public MemberEvent(String id, String name, String email) {
super(id,name);//super에 매개변수로 아예 초기화 해서 보내면
//굳이 밑에서 setId사용 안해도됨
//this.id = id;
setId(id);// super.setId()로 굳이 하지 않아도 자동으로 찾아간다.
//this.name = name;
setName(name);
this.email = email;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public void display() {
System.out.println("id = " + getId());
System.out.println("name = " + getName());
System.out.println("email = " + email);
}
}
'💻 수업정리 (2020) > 자바' 카테고리의 다른 글
[5/28] java.lang패키지 (0) | 2020.05.28 |
---|---|
[5/27] ★★★ 예외전달, 다중스레드 (0) | 2020.05.27 |
[5/26] 접근지정자 , 자료형(클래스, 인터페이스, enum) (0) | 2020.05.26 |
[5/25] abstract 클래스/메소드, 패키지와 인터페이스 (0) | 2020.05.25 |
[5/22] 오버라이드와 객체 형변환 (0) | 2020.05.22 |