ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • day19 - JAVA (자바 , 상속, super, Object 클래스, 오버라이딩, 다형성, 추상 클래스, pakage/import)
    KIC/JAVA 2021. 7. 16. 02:50
    반응형

    [상속]

    • 객체지향 개념의 가장 중요한 코드의 재사용을 프로그램으 로 구현하는 부분이다.

    • 새로운 클래스를 생성할 때 처음부터 새로 작성하는 것이 아니라, 기존에 정의된 클래스로부터 중복되는 부분을 물려받아서 사용할 수 있다. 이후 새로운 클래스에서 추가되는 부분만 고심해서 프로그래밍하면 된다.

    • 프로그램을 전체를 새로 개발한 것이 아니므로 프로그램 개발기간의 단축과, 비용의 감소를 가져올 수 있고, 이미 실 시스템에서 안정적으로 돌아가는 코드부분을 사용하기 때문에 시스템이 더 안정적이다.

     

     

     

     

     

    -> extends를 중심으로 왼쪽이 서브 클래스이고 오른쪽이 슈퍼클래스이다.

     

     

    [super]

    -> super 레퍼런스: 슈퍼클래스를 가리키는 레퍼런스

    -> super()메소드: 슈퍼클래스의 생성자를 호출

    -> this 레퍼런스나 super 레퍼런스는 static이 붙은 메소드 에서는 사용 할 수 없다. 따라서 main()메소드에서도 이들을 사용할 수 없다.

     

     

     

    [super() 예제]

     

     

     

     

     

    [Object 클래스]

    -> 모든 클래스의 부모 클래스이다.

    -> 즉, Object클래스가 자바에서 '최상의 클래스'이다.


    -> Object클래스에는 다양한 메소드가 존재하는데, 어떤 클래스에서도 이 메소드를 호출할수있다.

    -> 이렇게 모든 클래스들은 자신이 구현하지 않아도 이미 Object 클래스에 구현되어 있는 메소드들을 활용할 수 있다.

     

    [자주쓰는 object 클래스 메소드 종류]

    - equals() 메소드 : 두 객체가 동일한 객체라면 true를 리턴, 다르다면 false를 리턴.
    - hashCode() 메소드 : 
    객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴. 객체마다 다른값을 가지고 있음.
    - toString() 메소드 : 객체의 문자 정보를 리턴. 객체를 문자열로 표현.

     

     

     

     

     

     

     

    [오버라이딩]

    - 오버라이딩은 상속관계에서 발생하는데, 슈퍼클래스에서 상속받은 메소드를 그대로 사용하는 것이 아니라, 서브클 래스에 맞도록 고쳐서 사용하는 것을 말한다.

    - 슈퍼클래스와 서브클래스에 같은 이름을 가진 메소드가 존재할 때, 슈퍼클래스의 메소드를 무시하고(override), 서브 클래스의 메소드를 사용하는 것으로, 메소드를 재정의하 는 것이다.

     

     

     

     

    [오버라이딩 주의점]

    - 1. 슈퍼클래스의 메소드를 오버라이딩 하는 서브클래스의 메소드는, 메소드의 시그니쳐는 물론 리턴 타입까지 일치해야 한다. 일치하지 않으면 오버라이딩이 되지 않는다.

    - 2. 서브클래스에서 재정의 되는 메소드의 접근제어자(public, private 등)는 슈퍼클래스의 오버라이드되는 메소드의 접근제어자와 같거나, 덜 제한적인 접근제어자를 써야한다.

    (슈퍼클래스에서 public을 썼는데 자식 클래스가 private를 쓸 수 없다.)

     

     

     

    [오버라이딩 vs 오버로딩]

     

     

     

    [다형성]

    - 자바의 전반적으로 매우 중요한 개념이다.

     

    - 자바에서 클래스의 객체를 생성하는데 융통성을 부여 하기 위해서 다형성이라는 매커니즘을 사용.

    - '다형성'은 여러 개의 서로 다른 형식과 모양을 가진 다는 의미로, 다형성을 이용하면 객체의 유형에 따라 서로 다른 작업을 수행하도록 할 수 있다.

    - 객체는 한가지 타입에 하나의 형태만을 생성하는 고정적인 형태보단, 한가지 타입으로 여러형태를 생성할 수 있는 유동적인 형태가 프로그램을 더욱 편하게 작성하게 해준다.

     

     

     

     

     

    [추상 클래스]

    - 메소드에서 내용을 가지고 있다는 것은 바디(body: {}) 를 가진 메소드를 의미한다. 클래스가 가지고 있는 메소드가 모두 바디를 가지고 있으면 구체적 클래스라 부를 수 있다.

    - 메소드가 바디를 가지고 있지 않고 메소드의 인터페이스 부분(선언부)만 갖고 있는 메소드가 하나라도 있으면 이 클래스를 추상클래스라 부른다.

    - 이때 바디 없이 메소드의 선언부만 갖고 있는 메소드 를 추상메소드라 한다. 추상메소드는 메소드의 선언부 다음에 (세미콜론)이 온다.

     

     

     

    [추상 클래스 선언]

    - 메소드의 끝이 {}없이 :(세미콜론) 으로 마무리된다. 추상클래스로부터 상속을 받는 경우 추상메소드의 바디부분을 반 드시 구현해야 한다. 반드시 추상메소드는 오버라이딩해야 한다.

     

    - 추상 클래스는 객체를 생성할 수 없다.

     

    - 객체를 생성하려면 클래스가 가지고 있는 메소드가 모두 바디를 가지고 있어야 한다.

     

    - 추상 클래스는 상속을 통해서 완전해진다.

     

    - 추상 클래스 선언시 abstract 키워드를 써서 선언한다.

     

     

     

     

     

     

    [ex]

    -> 추상 클래스라면 이 부분들에 반드시 abstract 키워드를 필수적으로 써야한다.

     

     

     

     

    -> 이후 이렇게 @Override 를 통해 추상 메서드들을 구현한다.

    -> 추상 메서드에서 구현해야할 area()와 length()는 반드시 구현해야 에러가 안난다.

     

     

     

     

     

     

     

     

     

     

    [추상 클래스 간의 상속]

    - 추상 클래스들간에도 상속이 가능하다. 

     

    - 일반 클래스들간의 상속 과 유사하지만 추상 클래스들간의 상속에서는 상속 받은 추상 메서드들을 꼭 재정의할 필요는 없다.

     

    - 그냥 상속만 받아두고 있다가 언젠가 일반 클래스와 상속관계가 이루어 질 때가 있을 것 이고, 이때 재정의 하지 못했던 상속 받은 추상 메서드들을 모두 일반 클래스 내에서 재정의 해도 되기 때문이다.

     

     

    [추상 클래스 사용 목적]

    - 추상 클래스를 상속받는 클래스는 추상 클래스의 추상 메소드를 모두 오버라이딩 해야한다. 오버라이딩을 하지 않으면 에러가 난다.

     

    - 추상메소드는

     

    1. 그 클래스를 상속받는 클래스가 여러개여서 공통의 내용을 기술할 수 없거나 할 필요가 없는 경우

    2. 어떠한 클래스에서 상속받을 지 알 수 없기 때문에 내용을 기술할 수는 없지만, 반드시 작성해야 하는 메소드의 상속을 받는쪽에서 반드시 구현(implements) 하도록 강제할 경우

     

    에 사용한다.

     

    - 필수적으로 작성해야 하는 메소드의 경우에 추상메소드로 선언해서 강제로 구현하도록 한다.

     

     

     

     

     

     

     

    [pakage/import]

    package : 클래스들의 모임.
    - 클래스이름은 패키지명을 포함한다.

    - package 설정은 파일의 처음에 한번만 설정이 가능하다.

    - 하나의 파일에 있는 모든 클래스는 같은 패키지에 속한 클래스다.

     


    import : 패키지명을 생략할 수 있도록 머리 사용된 클래스의 패키지를 선언하는 문장.

    - 클래스의 이름을 생략할 수 있는 경우
          1. 같은 패키지에 속한 클래스는 패키지명을 생략 가능함.

          2. java.lang 패키지에 속한 클래스들은 패키지명을 생략 가능함.
          3. import 구문으로 설정된 클래스는 패키지 생략 가능

    300x250

    댓글

Designed by Tistory.