자바 객체의 형변환과 추상 클래스, 추상 메소드에 대해 알아볼께.

객체의 형변환

자바는 상속 관계의 클래스에서 객체의 형 변환이 가능해. 아래의 예제들로 객체의 형 변환에 대해 알아볼께.

class Acast {
	int a = 1;
}

class Bcast extends Acast {
	int b = 2;
}

class Ccast extends Bcast {
	int c = 3;
}

class TestCasting {
	public static void main(String args[]) {
		Acast refA; //Acast 타입의 객체 refA를 선언
		//Acast 타입의 객체 참조 변수 refA에 Ccast 클래스의 객체를 생성하여 할당
		//상속관계가 아니라면 에러 발생
		refA = new Ccast();
		System.out.println("refA.a의 값은 " + refA.a);
	}
}
//에러 발생의 예1
class Acast {
	int a = 1;
}

class Bcast extends Acast {
	int b = 2;
}

class Ccast extends Bcast {
	int c = 3;
}

class TestCasting {
	public static void main(String args[]) {
		Acast refA; //Acast 타입의 객체 refA를 선언
		//Acast 타입의 객체 참조 변수 refA에 Ccast 클래스의 객체를 생성하여 할당
		//상속관계가 아니라면 에러 발생
		refA = new Ccast();
		System.out.println("refA.a의 값은 " + refA.c); //Ccast 클래스의 멤버인 c에 접근을 시도하여 에러 발생
	}
}
//에러 발생의 예2
class Acast {
	int a = 1;
}

class Bcast extends Acast {
	int b = 2;
}

class Ccast extends Bcast {
	int c = 3;
}

class TestCasting {
	public static void main(String args[]) {
		Ccast refC = new Acast(); //에러 발생
		System.out.println("refC.a의 값은 " + refC.a);
	}
}
class A {
	void callme() {
		System.out.println("클래스 A의 callme() 메소드 실행");
	}
}

class B extends A {
	void callme() { //오버라이딩 된 메소드
		System.out.println("클래스 B의 callme() 메소드 실행");
	}
}

class C extends A {
	void callme() {
		System.out.println("클래스 C의 callme() 메소드 실행");
	}
}

class OverridingCast {
	public static void main(String args[]) {
		A r = new A();
		r.callme();
		r = new B();
		r.callme();
		r = new C();
		r.callme();
	}
}

추상 클래스와 추상 메소드

자바의 추상 클래스는 하위 클래스에서 구현될 추상적인 기능만을 추상 메소드로 선언한 클래스야. 그리고 기능이 무엇(what)인지만을 선언하고 구현 부분이 없는 메소드를 추상 메소드라고 하지.

추상 메소드는 하위 클래스에서 오버라이딩되어 구현이 되고 추상 클래스는 추상 메소드 외에도 일반적인 속성과 메소드를 가질 수 있어.

추상 메소드는 아래와 같은 표현식으로 구현될 수 있어.

abstract class 클래스 이름 {
	... //일반 속성과 메소드 기술
	abstract void 추상메소드이름(); //추상 메소드 선언
	...
}

아래는 추상 클래스와 추상 메소드를 구현한 예제야.

abstract class shape { //추상 클래스 선언
	abstract void draw(); //구현(body) 부분이 없는 추상 메소드를 정의
}

class Circle extends shape {
	void draw() {
		System.out.println("원을 그리는 기능");
	}
}

class Rectangle extends Shape {
	void draw() {
		System.out.println("사각형을 그리는 기능");
	}
}

clas Triangle extends Shape {
	void draw() {
		System.out.println("삼각형을 그리는 기능");
	}
}

class AbstractClass {
	public static void main(String args[]) {
		Circle c = new Circle();
		c.draw();

		Rectangle r = new Rectangle();
		r.draw();

		Triangle t = new Triangle();
		t.draw();

		System.out.println("===객체 형변환과 오버라이딩을 이용===");

		Shape  s = new Circle(); //상위 클래스의 객체에 하위 클래스의 객체를 대입
		s.draw(); //draw() 메소드 호출

		s = new Rectangle();
		s.draw();

		s = new Tringle();
		s.draw();

	}
}

Leave a Reply

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

Latest Post