[자바] 상속 연습2

오늘·2021년 3월 10일
0

문제풀기

목록 보기
14/24

상속 관계도

1) 부모의 필드 사용해보기 (AAA 클래스에서 확인 가능)

자식의 메소드를 static 으로 설정하면 자식의 정적 메소드가 부모의 인스턴스 메소드, 필드값보다 순서상 먼저 메모리에 올라간다.
-> 상속 (부모-자식) 관계가 있어도 정적에서 인스턴스 사용 어려움

2) 부모의 필드 사용해보기 (AAA 클래스에서 확인 가능)

(기본 메소드 기준) 자식 클래스는 부모 클래스를 먼저 올리고 올라가기 때문에 부모의 필드값을 가져오는 것이 가능하다

3) 부모 생성자 호출을 이용해 부모 클래스에 값 넣기 (전체 코드 흐름을 확인하기)

super()를 사용한다.
-항상 첫줄에 사용해야하며, 보내려는 값만큼 ()에 넣으면 된다.

(main)
// 부모 생성자 호출을 이용해 부모 클래스인 A에 값 넣기
AAA aaa = new AAA(10, true);


(AAA 클래스)
// main에서 보내준 값 부모로 올리기
public AAA(int a, boolean b) {
	super(a,b);
	System.out.println("AAA의 int boolean 명시적 생성자입니다 ");
}


(AA 클래스)
// main에서 보내준 값 AAA에서 받아 부모로 올리기
public AA (int a, boolean b){
	super(a, b);
	System.out.println("AA의 int boolean 명시적 생성자 입니다");
}

(A 클래스)
// main에서 보내준 값 AAA에서 부모 AA로 올리기
// AA에서 부모 A로 보낸 내용 받기
public A(int a, boolean b) {
	this.a = a;
	this.b = b;
	System.out.println("A의 int boolean 명시적 생성자 입니다 " +a + " , " + b);
}



CC -> BB -> A 클래스에서도 확인할 수 있다

4) static으로 작성해준 필드 값 사용하기 (AA클래스에서 확인 가능)

static String dept;

void aaMethod() {
	// static 이니까 클래스.변수명 사용 가능
	// 그냥 불러서 사용하는 것도 가능
	AA.dept = "영문과";
	dept = "연영과";		
}

5) 필드 값으로 static 을 줬을 때 사용하기 (AA 클래스에서 확인 가능)

static String dept;

static void aaMethod1() {
    	AA.dept = "영문과";
	dept = "연영과";
}

// static 으로 올려놓은 필드값은 가장 먼저 올라가기 때문에
// 기본 생성자에서도 사용 가능
void aaMethod2() {
    	AA.dept = "영문과";
	dept = "연영과";
}

1. 가장 상위 클래스인 A클래스 작성

public class A {
	int a;
	boolean b;
	
	double x;
	String name;
	boolean y;
	
	// 기본 생성자 만들기
	public A() {
		System.out.println("A의 기본생성자 입니다");
	}
	
	// main에서 보내준 값 AAA에서 부모 AA로 올리기
	// AA에서 부모 A로 보낸거 받기
	public A(int a, boolean b) {
		this.a = a;
		this.b = b;
		System.out.println("A의 int boolean 명시적 생성자 입니다 " +a + " , " + b);
	}
	
	// main에서 보내준 값 CC에서 부모 BB로 올리기
	// BB에서 부모 A로 보낸거 받기
	public A(double x, String name, boolean y) {
		this.x = x;
		this.name = name;
		this.y = y;
		System.out.println("A의 double, String, boolean 명시적 생성자입니다");
	}

}

2. A를 상속받는 AA클래스

public class AA extends A{
	static String dept;	// 정적변수
	String schoolName;	// 인스턴스 변수
	
	// 기본 생성자 만들기
	public AA() {
		System.out.println("AA의 기본생성자 입니다");
	}
	
	// main에서 보내준 값 AAA에서 받아 부모로 올리기
	public AA (int a, boolean b){
		// super는 가장 첫줄에 있어야 한다
		super(a, b);
		System.out.println("AA의 int boolean 명시적 생성자 입니다");
	}
	
	void aaMethod() {
		// static 으로 올려놓은 필드값은 가장 먼저 올라가기 때문에
		// 생성자에서 사용 가능
		dept = "컴퓨터";
		System.out.println("AA의 static 값 입니다" + dept);		// 그냥 불러서 사용하는 것도 가능
		System.out.println("AA의 static 값 입니다" + AA.dept);		// static 이니까 클래스.변수명 도 가능
	}
	
	static void aaMethod1() {
		// static 이니까 클래스.변수명 사용 가능
		// 그냥 불러서 사용하는 것도 가능
		AA.dept = "영문과";
		dept = "연영과";
	}

}

3. A를 상속받는 BB 클래스

public class BB extends A {
	// 기본 생성자 만들기
	public BB() {
		System.out.println("BB의 기본생성자 입니다");
	}
	
	// CC에서 보내준 값 부모 A로 올리기
	public BB(double a, String name, boolean b) {
		super(a, name, b);
		System.out.println("BB의 double, String, boolean 명시적 생성자입니다");
	}
}

4. AA를 상속받는 AAA 클래스

public class AAA extends AA{
	// 기본 생성자 만들기
	public AAA() {
		System.out.println("AAA의 기본생성자 입니다");
		
		// 부모의 필드 사용해보기
		// (기본생성자) 자식 클래스는 부모 클래스를 먼저 올리고 올라가기 때문에
		// 필드 가능하다
		schoolName = "한국대";
		aaMethod();
		AA.aaMethod1();
		AA.dept = "웹 디자인";
	}
	
	// main에서 보내준 값 부모로 올리기
	public AAA(int a, boolean b) {
		// super는 가장 첫줄에 있어야 한다
		super(a,b);
		System.out.println("AAA의 int boolean 명시적 생성자입니다 ");
	}
	
	// 부모 필드 사용해보기
	static void aaaMethod() {
		// 부모의 필드 사용해보기
		// static은 (부모-자식 간이라고 해도) 순서상 메모리에 먼저 올라가기 때문에
		// 인스턴스 변수는 사용 불가하다
//		schoolName = "한국대";
//		aaMethod();
		AA.aaMethod1();
		AA.dept = "웹 디자인";
	}
	
	void aaaMethod1() {
		// 부모의 필드 사용해보기
		// (기본 메소드) 자식 클래스는 부모 클래스를 먼저 올리고 올라가기 때문에
		// 필드 가능하다
		schoolName = "한국대";
		aaMethod();
		AA.aaMethod1();
		AA.dept = "웹 디자인";
	}
}

5. AA를 상속받는 BBB 클래스

public class BBB extends AA{
	// 기본 생성자 만들기
	public BBB() {
		System.out.println("BBB의 기본생성자 입니다");
	}

}

6. BB를 상속받는 CC 클래스

public class CC extends BB{
	// 기본 생성자 만들기
	public CC() {
		System.out.println("CC의 기본생성자 입니다");
	}
	
	// CC cc1 = new CC(3.14, "홍길동", false);
	// 부모로 올리기
	public CC(double a, String name, boolean b) {
		super(a, name, b);
		System.out.println("CC의 double, String, boolean 명시적 생성자입니다");
	}
}

7. 객체 생성하고 출력보는 main

public class InHeriEx {
	public static void main(String[] args) {
		//CC 객체화
		CC cc = new CC();
		System.out.println("------------------------------------");
		
		
		// AAA 객체화
		// 부모 생성자 호출을 이용해 부모 클래스인 A에 값 넣기
		AAA aaa = new AAA(10, true);
		// 필드 값만 출력하기
		System.out.println();
		System.out.print(aaa.a);
		System.out.println(" " + aaa.b);
		System.out.println("------------------------------------");
		
		
		// CC객체화
		// 부모 생성자 호출을 이용해 부모 클래스인 A에 값 넣기
		CC cc1 = new CC(3.14, "홍길동", false);
		// 필드 값만 출력하기
		System.out.println();
		System.out.print(cc1.x);
		System.out.print(" " + cc1.name);
		System.out.println(" " + cc1.y);
		System.out.println("------------------------------------");
	}
}

실행결과


0개의 댓글