휴지통/Java

객체지향의 특징(0409)

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();
 }