자바의 메소드 상속과 오버라이딩 그리고 생성자에 대해 알아볼께.

자바에서는 메소드 상속을 할 때 오버로딩과 오버라이딩이라는 개념이 있어. 오버로딩과 오버라이딩은 객체지향언어의 다형성(polymorphism)을 구현하는 중요한 개념이야. 간혹 두개의 개념이 혼동되는 경우가 있지만 엄연히 다른 개념이기 때문에 헷길리지 않게 잘 알아둘 필요가 있어.

오버로딩(overloading)

자바 프로그래밍에서 오버로딩은 같은 클래스 내에서 같은 이름의 생성자나 메소드를 사용하는 행위를 말해. 오버로딩을 하는 경우에는 매개변수의 개수와 타입이 반드시 달라야 해.

– 오버라이딩(overriding)

자바 프로그래밍에서 오버라이딩은 오버로딩과 헷갈리는 개념일 수 도 있어. 자바의 오버라이딩이란 상속관계에 있는 클래스들간에 같은 이름의 메소드를 정의하는 행위를 말하는데 기존 클래스의 메소드 구현 부분만 약간 변화시켜 새로운 클래스를 생성할 수 있다는 장점이 있지. 오버라이딩을 하는 경우 매개변수의 개수와 타입이 반드시 같아야 해.

아래는 오버로딩과 오버라이딩을 사용하는 예제들이야. 잘 살펴보길 바래.

class A {
	int i;
	int j;

	void setij(int x, int y) {
		i = x;
		j = y;
	}
}

class B extends A {
	int total;

	void sum() {
		total = i + j;
	}
}

class Inheritance4 {
	public static void main(String args[]) {
		B subOb = new B();

		subOb.setij(10, 12); //클래스 A로 부터 상속
		subOb.sum(); //클래스 B로 부터 상속
		System.out.println('두 수의 합계는 : ' + SubOb.tatal);
	}
}
class A {
	void show(String str) {
		System.out.println("상위 클래스의 메소드 show(String str) 수행" + str) ;
	}
}

class B extends A {
	void show() {
		System.out.println("하위 클래스의 메소드 show() 수행");
	}
}

class OverrideExam1 {
	public static void main(String args[]) {
		B over = new B();
		over.show("알기쉽게 해설한 자바");
		over.show();
	}
}
class A {
	void show() {
		System.out.println("상위 클래스의 메소드 show(String str) 수행") ;
	}
}

class B extends A {
	void show() {
		System.out.println("하위 클래스의 메소드 show() 수행");
	}
}

class OverrideExam2 {
	public static void main(String args[]) {
		B over = new B();
		over.show();
	}
}
class A {
	int i, j;

	A(int a, int b) {
		i = a;
		j = b;
	}

	void show() {
		System.out.println("상위 클래스의 메소드 show(String str) 수행") ;
	}
}

class B extends A {
	int k;

	B(int a, int b, int c) {
		super(a, b); //상위 클래스의 생성자를 호출
		k = c;
	}

	void show() {
		System.out.println("하위 클래스의 메소드 show() 수행");
		System.out.println("===super를 이용한 상위 클래스 메소드 호출===");
		super.show();
	}
}

class OverrideExam3 {
	public static void main(String args[]) {
		B over1 = new B(10, 20, 30);
		System.out.println("i, j, k의 값 : " + over1.i = " " + over1.j + " ");
		over1.show();
	}
}

자바의 상속과 생성자

자바에서 상속된 클래스로부터 객체가 생성될 때는 상위 클래스의 생성자가 하위 클래스의 생성자보다 먼저 수행이 돼.

즉 상속된 클래스로부터 객체가 생성될 때 상위 클래스의 묵시적인 생성자가 수행되는데 오버로딩의 경우에는 묵시적인 생성자가 아닌 다른 생성자를 호출하고자 하는 경우에는 예약어 super를 사용하여 명시적으로 호출을 하게 돼.

여기서 묵시적인 생성자란 매개변수가 없는 생성자를 말하는 거야. super를 사용하는 문장은 반드시 첫번째 라인에 와야 돼.

아래는 상속된 클래스로부터 객체가 생성되는 예제들이야.

class A1 {
	double d1;
	A1() {
		System.out.println("클래스 A1이 생성자 수행");
		d1 = 10 * 10;
	}
}

class A2 extends A1 {
	double d2;
	A2() {
		System.out.println("클래스 A2의 생성자 수행");
		d2 = 10 * 10 * 10;
	}
}

class A3 extends A2 {
	double d3;
	A3() {
		System.out.println("클래스 A3의 생성자 수행");
		d3 = 10 * 10 * 10 * 10;
	}
}

class Constructors1 {
	public static void main(String args[]) {
		A3 super1 = new A3();
		System.out.println("10의 2제곱 : " + super1.d1);
		System.out.println("10의 3제곱 : " + super1.d2);
		System.out.println("10의 4제곱 : " + super1.d3);
	}
}
class A1 {
	int d1;
	int s;
	A1(int S1) {
		System.out.println("클래스 A1의 생성자 수행");
		s = s1;
		d1 = s * s;
	}
}

class A2 extends A1 {
	int d2;
	int t;
	A2(int s1, int t1) {
		super(s1); //상위 클래스의 생성자를 명시적으로 호출
		System.out.println("클래스 A2의 생성자 수행");
		t = t1;
		d2 = t * t;
	}
}

class Constructors2 {
	public static void main(String args[]) {
		A2 super2 = new A2(10, 20);
		System.out.println("10의 제곱은 : " + super2.d1);
		System.out.println("20의 제곱은 : " + super2.d2);
	}
}

Share This Post

Leave a Reply

Your email address will not be published. Required fields are marked *

Latest Post