Web develop/JAVA

[JAVA] 객체지향의 특징 (상속, 캡슐화, 다형성)

ForA 2019. 4. 21. 13:36
728x90

상속

  • 부모가 갖는 자원(필드,메소드)을 물려주는 것

  • 관련키워드 extends =⇒ is a 관계

    class My extends 부모클래스명{
    
    }
    class Parent extends Object{
                         //Object: 최상위클래스, 기본값.
                         }
    class Child extends Parent{
    
    }

Object 클래스

: 최상위클래스. 자바의 모든 클래스의 부모클래스

java.lang.Object 부모클래스, 상위클래스, super 

|

java.lang.String 자식클래스, 하위클래스, sub

캡슐화

  • 필드와 메소드를 묶어주는 것
  • 정보 은닉
  • 모듈성

다형성

메소드 오버라이딩(MethodOverriding)

  • 부모가 갖는 메소드를 자식클래스에서 재정의
  • 상속에서 나온 개념
    class Parent {
      int x = 100;
      void hello(){
          System.out.println("안녕");
      }
    }
    class Child {   
      int y = 30;

        @Override
      void hello(){
          System.out.println("신짜오");
      }
    }

    Parent p = new Parent(); //부모 메소드생성
    Child c = new Child();   //자식 메소드생성
    Parent p2 = new Child(); //부모 메소드 오버라이딩 
    Child c2 = (Child)p2;    //자식클래스로 형변환한 부모메소드 오버라이딩

    p2.hello();     (O) ==>Parent
    p2.toString();  (O) ==> Object
    p2.goodBye();   (X) ==> Child

  • Parent p2 = new Child();

  • 부모 참조변수를 통해 자식 호출 불가하지만 오버라이딩한 자식 메소드가 존재한다면 부모 참조변수를 통해서 오버라이딩된 자식 메소드를 호출하는 것이 가능하다. 따라서 위의 예제에서 p2.hello(); 호출시 Child 클래스에 있는 오버라이딩 메소드 hello()를 호출하여 "신짜오"라는 문구가 호출된다.

  • 자식 참조변수를 통해 부모 호출 가능.

Parent p = new Child(); O
// 자식은 부모다. Child클래스는 Parent클래스로 형변환이 가능하다

Child c = new Parent(); X ==>컴파일 에러
//부모는 자식에 대한 정보가 없기 때문에 형변환이 불가하다

-> 둘의 차이는 사용할 수 있는 멤버의 개수이다. 부모클래스는 부모클래스의 멤버만 사용할 수 있지만 자식클래스는 자식과 부모클래스의 멤버 모두 사용할 수 있다.

그렇기에 Child c = new Parent();의 경우 참조할 수 있는 멤버가 자식클래스가 더 많기 때문에 이러한 접근은 불가하다.

메소드 오버로딩(MethodOverloding)

  • 한 클래스 내에 동일한 메소드를 여러개 구현 (단, 인자의 갯수가 다르거나 자료형이 달라야 한다.)
    class A {
      void hello(){
          System.out.println("안녕");
      }
      void hello(String name){ //메소드 오버로딩
          System.out.println("안녕,"+name";
      }
    }