2023.05.19
○ 상속 복습
* ctrl + 마우스 왼쪽을 누르면 관련 edit창이 뜸
-> 이클립스에서는 오리지널 소스코드를 볼 수 있음
- 노란줄 able로 끝나는 것을 보면 인터페이스임을 알 수 있음
참고) Serializable(직렬화) : 구현하지 않아도 되는 인터페이스
- 지금부터 나오는 데이터는 일렬로 처리
* 상속도 확인
1. 원하는 클래스 이름 위에서 오른쪽 마우스 > Open Type Hiearachy
2. 상단탭 window > show view > Type Hiearachy
● 실습 - toString()을 구현할 경우
우선순위는 obj의 toString()인가 재정의한 클래스의 toString()인가를 확인하는 실습
결과 : 가까운 것이 연결됨
-> 클래스는 인터페이스를 구현해야할 책임이 있기 때문에 인터페이스의 toString()이 활용 됨
1. 인터페이스 (IBasic)
package basic;
public interface IBasic {
// obj의 toString()과 다름
String toString();
}
2-1. 구현클래스 (Basic)
package basic;
public class Basic implements IBasic {
private String name = "Lisa";
public Basic(String name) { // 매개변수가 있는 생성자
this.name = name;
}
Basic() { // 생성자 오버로딩
this("리사"); // 이름 덮어쓰기
}
public String getName() { // 이름은 설정이 되어있어서 set은 필요 없음.
return name;
}
// 멤버메소드 toString()
@Override
public String toString() {
String msg = ""
+ getName()
+ "*^^*"
+ super.getClass()
+ "^_^"
+ getName();
return msg;
}
}
- 멤버변수는 private하고 속성함수 get (인터페이스) 활용
- super: 부모의 능력을 빌리겠다, basic의 부모를 가져와서 부모 클래스의 데이터 종류(크기)를 알 수 있다
- getClass() : 실행 중인 클래스 객체의 정보를 가져옴
2-2. 구현클래스(jisu)
- toString을 구현하지 않음, 부모(Basic)로부터 기능을 빌려옴 but부르는 주체는 지수임
package basic;
public class Jisu extends Basic {
Jisu() {
super("지수"); // super는 this와 유사한 기능임
}
}
- 생성자를 만들어 이름을 초기화함
3. 실행클래스
package basic;
public class BasicApp {
public static void main(String[] args) {
Basic basic = new Basic(); // 객체생성
System.out.println("리사의 이름은 " + basic.getName() + "입니다.");
// 업캐스팅 : ~처럼 (부모의 관점에서 보임 toString()만 사용 가능)
IBasic ibasic = new Basic();
System.out.println("\nIBasic은 \n" + ibasic.toString());
Basic jisu = new Jisu(); // 실제 사이즈는 Jisu지만 Basic의 기능만 보임
p("jisu name : " + jisu.getName());
pl("-----------------------------");
pl(jisu); // toString() 생략가능
}
static private void p(String msg) {
System.out.println(msg);
}
// 오버로딩 : 매개변수가 다름
static private void pl(String msg) {
p(msg + "\n");
}
static private void pl(Object obj) { // 최상위객체를 부르면 최상위객체.toString이 불러짐
p(obj + "\n");
}
}
- jisu 클래스에서는 toString()을 재정의하지 않았지만 Basic클래스와 상속관계에 있어서 부모인 Basic클래스의 toString()을 사용하였다.
- 최상위객체를 부르면 최상위객체.toString이 불러짐
☆ 나의 의문점
업캐스팅을 하면 능력(메소드)만 사용하는 것이고 데이터의 크기는 변하지 않는 것인가 ?
- 네
그렇다면 맨 앞에 적은 IBasic은 데이터의 크기를 정하는 부분이 아니였는가?
- 크기를 정하는 부분이 맞지만 실제사이즈는 유지되고 보이는 내용만 제한이 됨
만약 아니라면 IBasic은 인터페이스라 책임자(구현클래스)인 Basic의 크기가 나온 것인가?
- 비슷합니다
-> 인터페이스는 실체가 아니기 때문에 실체인 구현클래스의 크기가 나온 것
-> 인터페이스의 크기는 구현클래스에 의해 정해진다
일반적인 상속 : 실선으로 표시, 포함과 유사
인터페이스 상속 : 점선으로 표시, 연결과 유사(강제의 규칙)
업캐스팅 : 보는 관점을 줄임
* 포트폴리오에 들어가야할 내용
1. 클래스다이어그램
클래스 구성에 대한 설명
2. 시퀀스다이어그램
어떤 형태로 진행이 되고 있는지
시간에 따른 변화
3. ERD
컬럼과 컬럼 사이가 어떻게 연결되는지 확인하는 로직
데이터가 어떻게 교환되는지 확인
업캐스팅을 사용하는 이유는 공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위해서이다.
상속 관계에서 상속 받은 서브 클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리할 수 있기 때문이다.
-> css에서 클래스이름을 공통으로 주어서 디자인했던 부분과 유사
'백엔드 > 자바' 카테고리의 다른 글
자바 - 19 (데이터베이스 연결) (0) | 2023.05.25 |
---|---|
자바 - 18 (데이터베이스 연결) (0) | 2023.05.22 |
자바 - 16 (0) | 2023.05.19 |
자바 - 15 (0) | 2023.05.18 |
자바 - 14 (0) | 2023.05.17 |