LeReve
2013. 5. 27. 19:27
<객체지향의 특징> OOP(Object Oriented Programming)
1. 캡슐화
- 클래스에 필드와 메소드를 묶어두는것.
- 정보은닉
- 모듈성
2. 상속★
- 부모클래스가 자식클래스에게 속성과 기능을 물려주는 것.
- 단일 상속을 원칙으로 함(부모클래스를 하나만 가질 수 있음)
java.lang.Object: 상위,부모,super 클래스 //Object: 최상위 클래스
│
└─java.lang.System: 하위,자식,sub 클래스
* System은 Object의 모든 것을 갖고 있기 때문에 System은 Object라고 할 수 있다.
결국엔 자바의 모든 클래스(심지어 내가 만든 클래스도)는 오브젝트이다.
java, lang 패키지(폴더) Object,System 클래스
- 형식)
class Child extends 상속받고자 하는 부모클래스명
{ //is a
//자신은 부모다
}
class Parent{ int x=13;
void hello(){ System.out.println("안녕"); } }
class Child extends Parent{ int y=23; void gildong(){ System.out.println("창열기"); } }
class Test{ public static void main(String args[]){ Child c = new Child(); c.gildong(); c.hello();
//c레퍼런스가 참조하는 Child 클래스에 hello 메소드가 있는지 확인. 없으면 extends가 있는지 확인 있으면 Parent클래스에 hello()가 있는지 확인. System.out.println("x="+c.x);//위 동일 c.lime();
//Parent클래스에서 있는지 확인하고 없으면 Object클래스에서 찾는다. 없기 때문에 에러 c.toSting();//실행. Object클래스에 메소드가 있다.
Parent p1 = new Parent(); Child c1 = new Child();
Parent p2; Child c2;
p2=c1;//자식은 부모다이기 때문에 된다. 부자는 된다 부 자 c1=new child(); -> p2=new child(); c2=p1;//에러 // 자식에 대한 정보가 없기 때문에 자 부 } } |
3 Parent p2 = new child();
4 Child c2 = new Parent(); (X)
5 Child c3 = (child)p2;
3. 다형성
★★MethodOverriding(오버라이딩)
- 상속에서 나온 개념
- 부모클래스에서 정의한 메소드를 자식클래스에서 다시 정의.
(메소드 재정의)
MethodOverloading(오버로딩)
- 한 클래스내에서 동일한 메소드를 두번이상 정의하는것.
(단, 인자의 갯수가 다르거나 그 자료형이 달라야 함)
class A{
int x;
//int x; 에러 발생: 같은 영역내에서 똑같은 이름의 변수에 대해
자료형을 두번이상 선언할 수 없다!!
void hello(){
}
void hello(String name){
}
}
class Parent{ int x=10; void print(){ System.out.println("프린트"); } void print(String name){//오버로딩된 메소드 System.out.println("프린트, "+name); } void hello(){ System.out.println("부모 안녕"); } }//Parent
class Child extends Parent{ int x=30; int y=20; void gildong(){ System.out.println("나길동"); } void hello(){//메소드 재정의, 오버라이딩된 메소드 System.out.println("자식안녕"); } }
public class InheritanceTest { public static void main(String[] args) { //1. Parent p = new Parent();//Parent클래스를 사용할 준비 //p.~: Parent클래스에 있는~ p.필드명 p.메소드(); //객체생성==메모리 할당 //new Parent(); ------> Parent, Object 메모리 할당 System.out.println("X="+p.x); p.print(); p.print("길동"); p.hello(); //p.gildong();//에러: 부모레퍼런스를 통해 자식멤버호출 불가능. System.out.println("====================="); //2. Child c = new Child();//Child 클래스를 사용할 준비. //new Child()--->Child, Parent, Object 메모리 할당 //c.~: Child 클래스에 있는~ System.out.println("Y="+c.y); c.gildong(); c.hello(); System.out.println("부모X="+c.x); c.print();//자식클래스 레퍼런스변수를 통해 부모의 멤버접근이 가능. System.out.println("====================="); //3. Parent p2 = new Child(); //new Child(); ---> Child, Parent, Object 메모리 할당 //p2는 부모클래스로 선언되어 있으므로 부모참조만 가능!! p2.print(); p2.print("라임"); System.out.println("p2.x="+p2.x); //System.out.println("p2.x="+p2.y); //자식 필드 사용X p2.hello();//----->자식메소드 호출 //★부모레퍼런스를 통해 자식멤버(필드,메소드) 사용하는 것은 불가능. //단, 자식클래스에 오버라이딩된 메소드가 있다면 //부모클래스의 메소드는 은폐되고 //부모레퍼런스를 통해 오버라이딩된 자식메소드를 호출하는 것이 가능. (Parent p2 = new Child(); 했을때만 // (필드는 해당사항 없음!!) //p2.gildong();//-->자식메소드호출(오버라이딩이 아니기 때문에 에로)
System.out.println("====================="); //4. //Child c2 = new Parent(); // Child c2 = (Child) new Parent(); 이것도 컴파일 에러 ClassCastException //에러: new Parent()에는 자식 Child에 대한 정보가 없으므로 System.out.println("====================="); //5. Child c3 = (Child)p2; //Parent p2 = new Child(); //p2는 자식클래스에 대한 정보를 가지고 있기 때문에 //자식캐스팅이 가능 c3.gildong(); c3.print(); } } |