2013.10.10 12:19

1. 추상 클래스


abstract 예약어를 사용한 클래스를 추상 클래스라고 한다.(추상 메소드를 포함할 수 있고, 포함하지 않을 수도 있다.)

객체화 할 수 없으며, 반드시 상속을 통해 구현하여 사용한다.


- 추상 메소드 : 구현부{}가 없는 메소드를 추상 메소드라고 한다.


형식 : 

abstract class{

abstract 리턴타입 메소드명();

}


예 :

abstract class{

int i = 5;

abstract void move();

}



예제 1. 추상클래스의 객채화를 시도하는 예제


package java_1010;


abstract class King{

int i = 25;

abstract void draw();

}


public class Abstract_1 {

public static void main(String[] args) {

King obj = new King(); // 이 부분에서 에러 발생. 추상 클래스는 객채화 할 수 없다.

System.out.println("King 클래스의 i의 값은 = "+obj.i); // obj.i를 사용할 수 없다.

}

}


예제 2. 올바른 추상클래스의 상속 및 구현


package java_1010;


abstract class 도형{ // 추상클래스

int i = 77;

abstract void draw(); // 추상메소드

}


class 사각형 extends 도형{ // 추상클래스의 상속

void draw(){ // 추상메소드의 구현

System.out.println("사각형을 그린다.");

}

}


public class Abstract_2 {

public static void main(String[] args) {

사각형 obj = new 사각형();

System.out.println("사각형 클래스 i의 값은  = "+obj.i);

obj.draw();

}

}


예제 3. 추상클래스의 업캐스팅

package java_1010;

abstract class Style{
int i = 99;
abstract void draw();
}

class Square extends Style{
@Override
void draw(){
System.out.println("사각형을 그립니다.");
}
}

class Circle extends Style{
void draw(){
System.out.println("둥근 원을 그립니다.");
}
}

class Triangle extends Style{
void draw(){
System.out.println("삼각형을 그립니다.");
}
}

public class Abstract_3 {
public static void main(String[] args) {
Square obj1 = new Square();
Circle obj2 = new Circle();
Triangle obj3 = new Triangle();
obj1.draw();
obj2.draw();
obj3.draw();
System.out.println("=========================");
Style obj = new Square(); // 추상 클래스의 업캐스팅
// (메소드는 Square 클래스의 메소드, 변수는 Style의 변수)
obj.draw();
obj = new Circle();
obj.draw();
obj = new Triangle();
obj.draw();
}

}



2. final 예약어


final의 3가지 용법

- 클래스에 사용 : 더 이상 상속 받을 수 없는 클래스

- 메소드에 사용 : 상속 관계에서 Overriding 될 수 없다.

- 변수에 사용 : 변수의 값을 변경할 수 없다(상수화).


- 클래스에 사용(final class)


더 이상 상속이 불가능한 클래스로 final 예약어를 사용하여 정의한다.


형식 :

final class 클래스명{


}


예제 1

package java_1010;


final class WordProcess{

void input(){}

void edit(){}

void print(){}

void about(){

System.out.println("King 개발 회사");

}

}


class NewWordProcess extends WordProcess{ // final 클래스는 상속할 수 없다

void about(){

System.out.println("Queen 개발회사");

}

}


public class Final_1 {

public static void main(String[] args) {

NewWordProcess obj = new NewWordProcess();

obj.about();

}

}


- 메소드에 사용(final method)


더 이상 overriding이 불가한 메소드를 정의하고자 할때 사용한다.


예제 1.

package java_1010;


class Final_2_A{

final void display(){

System.out.println("Overriding 불가한 메소드");

}

void message(){

System.out.println("Overriding 가능한 메소드");

}

}


class Final_2_B extends Final_2_A{

/*void display(){

System.out.println("Final_2_A의 display() 메소드 재정의");

}*/

void message(){

System.out.println("Overriding 한 메소드");

}

}


public class Final_2 {


}



Posted by saudades

댓글을 달아 주세요