코딩과 결혼합니다

230918 - 자바의 정석 chapter 07 (308~361p) 본문

2세/Java

230918 - 자바의 정석 chapter 07 (308~361p)

코딩러버 2023. 9. 18. 14:07
728x90

상속 

    - 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

    - 클래스 간의 관계에서 부모와 자식의 관계만 존재한다. (형제 관계 x)

  • 장점
    • 보다 적은 양의 코드로 새로운 클래스 작성
    • 코드를 공통적으로 관리하여 코드의 추가 및 변경에 용이하다.
    • 코드의 재사용성을 높이고 코드의 중복을 제거 ➡️ 생상성, 유지보수에 크게 기여
  • 조상 클래스 =  부모클래스, 상위(super) 클래스
    • 조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받는다.
  • 자손 클래스 = 자식클래스, 하위클래스
    • 조상 클래스의 모든 멤버를 상속받는다.
    • 항상 조상클래스 보다 같거나 많은 멤버를 갖는다.
    • 자손 클래스가 변경되어도 조상 클래스에 아무런 영향을 주지 못한다.
    • 생성자 블럭은 상속되지 않는다. 멤버만 상속된다.
  • 클래스 간의 관계 - 포함관계
    • 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
하나의 거대한 클래스를 작성하는 것보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있다. 또한 작성된 단위 클래스들은 다른 클래스를 작성하는데 재사용될 수 있다. 코드를 관리하는 데에도 수월하다.
  • 클래스 간의 관계 결정하는 TIP
'~은 ~이다.' ➡️ 상속관계
'~은 ~을 가지고 있다.' ➡️ 포함관계

* 프로그램의 모든 클래스를 분석하여 가능한 많은 관계를 맺도록 노력해서 코드의 재사용성을 높여야 한다.
  • 단일 상속
    • 자바에서는 오직 단일 상속만 허용 
    • 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어주기 때문
  • 다중 상속
    • 장점 : 복합적인 기능을 가진 클래스를 쉽게 작성 가능
    • 단점 :  다중상속을 허용하면 클래스 간의 관계가 매우 복잡해지며, 다른 클래스로부터 상속받은 멤버 간의 이름이 같을 경우 구별할 수 있는 방법이 없다.
  • Object 클래스 - 모든 클래스의 조상, 최상위 조상

 

 

오버라이딩

     - 상속받은 메서드를 자손 클래스 자신에 맞게 변경하여 사용. 조상의 메서드를 오버라이딩 한다.

 ❓ 왜 오버라이딩을 사용하는지

     : 특정 클래스를 사용하던 사람들은 그 자손 클래스도 같은 형식의 메서드를 반환해 줄 거라 기대한다. 그렇기에 새로운 

       메서드를 제공하는 것보다 오버라이딩을 하는 것이 바른 선택이다.

  • 조건
    • 메서드의 내용만을 새로 작성하는 것으로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.
      • 조상클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 한다.
      • 접근 제어자는 조상 클래스의 메서드보다 좋은 범위로 변경할 수 없다.
      • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
        *exception은 모든 예외의 최고 조상으로 가장 많은 개수의 예외를 던질 수 있다.
  • 오버로딩 vs 오버라이딩
    • 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것
    • 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것

 

 

super

  • 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용한다.
  • 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구분
  • super는 static메서드에서는 사용할 수 없다. (static 메서드는 인스턴스와 관련이 없기 때문)
super.x는 조상 클래스로부터 상속받은 멤버변수 x를, this.x는 자손 클래스에 선언된 멤버변수를 뜻한다.
메서드에서도 super를 이용해서 호출할  수 있는데, 특히 조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 사용한다.

 

super() - 조상 클래스의 생성자

    - 조상 클래스의 생성자를 호출하는 데 사용된다.

  • Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.
  • 조상 클래스의 멤버변수는 조상의 생성자에 의해 초기화되도록 해야 한다.

 

 

⭐패키지와 import

  • 패키지 : 클래스의 묶음. 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리.
                 - 같은 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하다.
    • 하나의 소스파일에 단 한 번만 선언될 수 있다.
    • 소문자로 하는 것이 원칙 - 클래스명과 구분
    • 패키지를 선언하지 않고 소스파일을 작성할 수 있는 이유 : 이름 없는 패키지에 자동적으로 속하기 때문
  • import문 : 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공
    - 사용하고자 하는 패키지를 미리 명시해 주면서 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다. 
    • 패키지문 다음에, 클래스 선언문 이전에 위치
    • 한 패키지에서 여러 클래스를 사용하는 경우 '패키지명.*'과 같이 하는 것이 편리하다.
    • '*'을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것은 아니다.
    • 같은 패키지 내의 클래스들은 import문을 지정하지 않고도 패키지명을 생략할 수 있다.
    • static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다.

 

 

⭐제어자

     - 접근 제어자 / 그 외의 제어자

  • static = '클래스의' 또는 '공통적인'
    • 멤버변수, 메서드, 초기화 블록에서 사용될 수 있다.
    • 인스턴스를 생성하지 않고도 호출이 가능해 더 편리하고 속도도 빠르다.
  • final = '마지막의' 또는 '변경될 수 없는'
    • 클래스, 메서드, 멤버변수, 지역변수에서 사용될 수 있다.
    • final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
    • final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
    • 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
    • 인스턴스 변수의 경우 생성자에서 초기화되도록 할 수 있다. 이 기능을 활용하면 각 인스턴스마다 final이 붙은 멤버변수가 다른 값을 가지게 하는 것이 가능하다.
  • abstract = '미완성'
    • 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않는 추상 메서드를 선언하는 데 사용
  • 접근제어자
    • 캡슐화 - 내부의 데이터를 보호
                  - 데이터가 유효한 값을 유지하도록, 비밀번호와 같은 데이터를 외부에서 함부로 변경할 수 없도록
                     외부로부터의 접근을 제한
                  - 외부에서 접근할 필요가 없는 멤버들을 private로 지정하여 복잡성을 줄일 수 있다.
    • 상속을 통해 확장될 것이 예상되는 클래스라면 멤버에 접근 제한을 주되 자손클래스에서 접근하는 것이 가능하도록 하기 위해 protected를 사용한다.
    • 생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.
    • public인 동시에 static ➡️ 외부에서 이 클래스의 인스턴스를 사용하도록 할 수 있다. 
제어자 같은 클래스 같은 패키지 자손클래스 전체
public o o o o
protected o o o  
(default) o o    
private o      
  • 제어자의 조합
    1. static과 abstract를 함께 사용할 수 없다.
    2. abstract와 final을 동시에 사용할 수 없다.
    3. abstract메서드의 접근 제어자가 private일 수 없다.
    4. 메서드의 private과 final을 같이 사용할 필요는 없다.
      - 접근제어자가 private인 메서드는 오버라이딩 될 수 없기 때문. 이 둘 중 하나만 사용해도 충분

 

 

⭐다형성

     - 여러 가지 형태를 가질 수 있는 능력. 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함
     - 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함 (반대는 불가능)

  • 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.
  • 서로 상속관계에 있는 클래스 사이에서는 참조변수도 형변환이 가능하다.
  • 자손타입의 참조변수를 조상타입으로 형변환 하는경우는 형변환 생략 가능