2023_10_11

Seunghee Ryu·2023년 10월 11일
0

TIL

목록 보기
9/15

오버라이딩

오버라이딩이란?

  • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
  • 덮어쓰기

오버라이딩의 조건

  • 이름이 같아야 한다
  • 매개 변수가 같아야 한다
  • 반환 타입이 같아야 한다
  • 접근제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다
    - 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다
    • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다
      • 선언된 예외의 개수가 문제가 아님 / Exception의 조상-자손 관계도 고려해야 함
    • 인스턴스 메서드는 static메서드로 또는 그 반대로 변경할 수 없다

오버로딩 vs 오버라이딩

  • 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)
  • 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것

super

  • 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수
  • static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다

super()

  • 조상 클래스의 생성자를 호출하는데 사용된다
  • 자손 클래스의 인스턴스를 생성하면 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성됨
  • 그렇기에 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용할 수 있음
  • 이때 조상 클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 함
  • 조상 클래스의 생성자를 맨 처음 호출하는 것은 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있기 때문에 초기화를 위해서임
  • 컴파일러가 자동적으로 super()를 생성자의 첫줄에 추가함
  • 조상 클래스의 멤버 변수는 조상의 생성자에 의해 초기화되도록 해야함

package와 import

패키지

  • 클래스의 묶음
  • 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어놓음으로써 클래스를 효율적으로 관리할 수 있다
  • 패키지는 물리적으로 하나의 디렉토리이다
  • 하나의 소스 파일에는 첫번째 문장으로 단 한번의 패키지 선언만을 허용한다
  • 모든 클래스는 반드시 하나의 패키지에 속해야 한다
  • 패키지는 점(.)을 구분자로 하여 계층 구조로 구성할 수 있다

패키지의 선언

  • 자바에서 기본적으로 제공하는 이름없는 패키지 덕분에 패키지 선언을 하지 않아도 문제가 없을 수 있다

import

  • 소스코드를 작성할 때 다른 패키지의 클래스를 사용하라면 패키지명이 포함된 클래스 이름을 사용해야 한다
  • import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스 이름에서 패키지명을 생략할 수 있다
    • 을 사용하면 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다
  • 클래스의 이름 대신 * 을 사용하는 것은 하위 패키지의 클래스까지 포함하는 것은 아니다

static import 문을 사용하면 static 멤버를 호출할 때 클래스의 이름을 생략할 수 있다

제어자

제어자란?

  • 제어자란 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다
  • 제어자는 접근 제어자와 그 외의 제어자로 나뉜다
  • 접근 제어자 : public protected, default, private
  • 그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp
  • 여러 제어자를 조합하여 사용하는 것이 가능하다
  • 접근 제어자는 한번에 네 가지 중 하나만 선택해서 사용 가능하다

static - 클래스의, 공통적인

  • 클래스 변수(static 멤버변수)는 인스턴스와 관계없이 같은 값을 갖는다
    - 하나의 변수를 모든 인스턴스가 공유하기 때문
  • static이 붙은 멤버변수와 메서드, 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다
  • 클래스 변수(static 멤버변수)는 클래스가 메모리에 로드될 때 생성된다

final - 마지막의, 변경될 수 없는

  • 거의 모든 대상에 사용할 수 있다
  • 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고, 클래스에 사용되면 자신을 확장하는 자손 클래스를 정의하지 못하게 된다
  • 생성자를 이용해 인스턴스 변수의 경우 final 멤버의 변수를 초기화 할 수 있다
    - 클래스 내에 매개변수를 갖는 생성자를 선언하여 인스턴스 를 생성할 때 fianl이 붙은 메버변수를 초기화하는데 필요한 값을 생성자와 매개변수로부터 제공받게 한다
  • 이 기능을 활용하면 각 인스턴스마다 fianl이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능하다

abstract - 추상의, 미완의

  • 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용된다
  • 추상 클래스는 완성되지 않은 메서드가 존재하는 미완성이므로 인스턴스를 생성할 수 없다
  • 완성된 클래스도 abstract를 붙여서 추상 클래스로 만드는 경우가 있다
    - 다른 클래스가 추상 클래스를 상속받았을 때 원하느 메서드만 오버라이딩 해도 된다는 장점이 있다

접근 제어자

  • public > protected > default > private
  • public : 접근 제한이 없다
  • protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다
  • default : 같은 패키지 내에서만 접근이 가능하다
  • private : 같은 클래스 내에서만 접근이 가능하다
  • 사용가능한 접근 제어자
    - 클래스 : public, default
    • 메서드, 멤버변수 : public, protected, default, private
    • 지역변수 : 없음
  • 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호가기 위해서인다
  • 데이터 감추기라고 하며 객체지향개념의 캡슐화에 해당하는 내용이다
  • 결합도를 낮출 수 있다
  • 접근 제어자를 사용하여 접근 범위를 최소화하도록 노력 필요
  • 생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다
  • 생성자의 접근 제어자를 private으로 지정하면 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 되지만 클래스 내부에서는 인스턴스를 생성할 수 있다
  • 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다
    - 자손 클래스의 인스턴스를 생성할 때 조상 클래스의 생성자를 호출해야 하는데 생성자의 접근 제어자가 private이므로 자손 클래스에서 호출하는 것이 불가능하기 때문이다
    - 그래서 클래스 앞에 fianl을 추가하여 상속할 수 없는 클래스라는 것을 알리는 것이 좋다

제어자의 조합

  • 메서드에 static과 abstract를 합께 사용할 수 없다
  • 클래스에 abstract와 final을 도잇에 사용할 수 없다
  • abstract 메서드의 접근 제어자가 private일 수 없다
  • 메서드에 private와 final을 같이 사용할 필요는 없다

0개의 댓글