티스토리 뷰

JAVA/PRIMER

[JAVA] 상속

yulrang 2018. 4. 19. 14:07
// 상속 : sub클래스가 super클래스의 필드와 메소드를 물려받는 것 

// 상속의 대상이 되는 클래스 : 부모클래스, 기반클래스, super클래스
class A {
	int a=3;
	void print(){
		System.out.println("super");
	}
}

// extends classA : 클래스 A를 상속
// 상속 받는 클래스 : 자식클래스, 파생클래스, sub클래스
class A1 extends A{
	
}

public class 상속2 {

	public static void main(String[] args) {
		A1 a1 = new A1();
		System.out.println(a1.a);
	}

}

3



class B {
	int a = 1;
}

class B1 extends B{
	int a = 2;	// 똑같은 이름의 변수가 있다면 그것이 먼저 실행됨
	void print(){
		int a = 3;
		System.out.println(super.a);	// super.	: super클래스의 멤버를 지시하는 지시어
		System.out.println(this.a);		// this.	: 자신 클래스의 멤버를 지시하는 지시어
		System.out.println(a);
	}
}
public class 상속3 {

	public static void main(String[] args) {
		B1 b1 = new B1();
		b1.print();

	}

}
1
2
3


class C {
	
}
class C1 extends C {
	
}
class C2 extends C {
	
}
public class 상속4 {

	public static void main(String[] args) {
		C a = new C();
		C1 b = new C1();
		C2 c = new C2();
		
		// 인스턴스a instanceof 클래스B : 인스턴스 a가 클래스B를 상속 받았는지 true/false 반환
		boolean e = b instanceof C;
		System.out.println(e);
		System.out.println( a instanceof C1 );
		
		// instanceof 연산자는 상속관계가 있는 피연산자들만 대상으로 함
		// 부모인스턴스 instanceof 자식클래스	/	자식인스턴스 instanceof 부모클래스
		// 만 가능함
		//System.out.println( b instanceof C2 );
	}

}
true
false


class D {
	void print(){
		System.out.println("super");
	}
}
class D1 extends D {
	// 오버라이딩 : super클래스의 메소드를 재정의함
	void print(){
		System.out.println("sub");
	}
	// 오버로딩 : 똑같은 이름을 가지나 매개변수가 다른 메소드를 정의
	void print(String s){
		System.out.println(s);
	}
	
	// java의 모든 클래스는 Object 클래스를 상속받음
	// Object의 toString클래스를 재정의한것임(오버라이딩)
	public String toString() {
		return "D1";
	}
}

public class 상속5 {

	public static void main(String[] args) {
		D1 a = new D1();
		a.print();

		System.out.println(a);
	}

}
sub
D1


class E {
	void print(){
		System.out.println("super");
	}
}
class E1 extends E {
	// @ : annotation(주석) 표시
	// @Override : 이 표시 바로 밑에 오는 메소드가 새로 작성된 메소드일 경우 컴파일에러!
	
	@ Override

	//	void print222(){
//		System.out.println("새로작성한 메소드");
//	}
	
	void print(){
		System.out.println("sub");
	}
}
public class 상속6 {

	public static void main(String[] args) {
		// TODO 자동 생성된 메소드 스텁

	}

}
super
sub


// JRE 시스템 라이브러리 > rt.jar (런타임) > java.lang 패키지 > 클래스들
// java.lang 패키지 안에 있는 클래스들은 import 하지 않고, 객체생성 안해도 바로 사용할 수 있음

class F{
	// 정의된 생성자가 없는 경우, 컴파일러가 기본생성자를 자동으로 생성함.
	public F(){
		System.out.println("super의 생성자");
	}
	
}
class F1 extends F {
	
	// sub클래스의 생성자에서는 제일 처음에 super클래스의 생성자가 먼저 호출됨
	// 컴파일러가 자동으로 생성해주지만 명시적으로 표시해주려면 super()를 씀
	public F1(){
		super();
		System.out.println("sub의 생성자");
	}
}

public class 상속7 {

	public static void main(String[] args) {
		F1 a = new F1();
	}

}
super의 생성자
sub의 생성자


class G{
	
	public G(int n){
		System.out.println(n);
	}
}

// 부모에 기본생성자가 아닌, 새로 정의된 생성자가 자식에게 없는 경우 오류
class G1 extends G{
	
	// 자식클래스의 생성자에 부모클래스를 생성하기 위한 생성자들을 호출해주어야함
	// 기본생성자가 아니기 때문에 매개변수 주의!
	public G1(){
		super(1);
	}
}
public class 상속8 {

	public static void main(String[] args) {
		G1 a = new G1();
	}

}
1





예시

class Employee{
	int pay;
	
	public Employee(int a){
		this.pay = a;
	}
	void print(){
		if( this instanceof Regular )
			System.out.println("정규직 "+pay+"만원");
		if( this instanceof PartTime )
			System.out.println("시간제 "+pay+"만원");
	}
}

class Regular extends Employee{
	
	public Regular(int pay_r){
		super(pay_r);
	}
}

class PartTime extends Employee{
	static int pay_time = 50_000;
	
	public PartTime(int work_time){
		super(work_time * pay_time);
	}
}
public class 상속예제2 {

	public static void main(String[] args) {
		Regular a = new Regular(300_0000);
		PartTime b = new PartTime(200);
		
		a.print();
		b.print();
		

	}

}
정규직 3000000만원
시간제 10000000만원








'JAVA > PRIMER' 카테고리의 다른 글

[JAVA] 익명클래스  (0) 2018.04.19
[JAVA] 추상클래스  (0) 2018.04.19
[JAVA] Random  (0) 2018.04.19
[JAVA] Math  (0) 2018.04.19
자바 Calendar  (0) 2018.04.19
댓글