객체지향 프로그래밍 2
1. 상속
생성자와 토기화 블럭은 상속되지 않는다. 멤버만 상속된다.
자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
접근 제어자가 private 또는 default인 멤버들은 상속되지 않는다기보다 상속은 받지만 자손 크래스로부터 접근이 제한되는 것이다.
상속관계 '~은 ~이다.(is-a)' 포함관계 '~은 ~을 가지고 있다.(has-a)'
단일 상속
자바에서는 단일 상속만을 허용한다. 그래서 하나 이상의 클래스로부터 상속을 받을 수 없다.
Object 클래스
Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
2. 오버라이딩
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것.
오버라이딩의 조건
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
이름이 같아야 한다.
매개변수가 같아야 한다.
반환타입이 같아야 한다.
조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때
접근제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
조상 클래스의 메서드보다 많은 수의 에외를 선언할 수 없다.
인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
오버로딩 vs. 오버라이딩
오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것(new) 오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것(change, modify)
super
super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다. 그래서 this와 마찬가지로 super역시 static메서드에서는 사용할 수 없다.
super()
Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.
3. package와 import
패키지
하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
모든 클래스는 반드시 하나의 패키지에 속해야 한다.
패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
패키지는 물리적으로 클래스파일(.class)을 포함하는 하나의 디렉토리이다.
import 문
소스코드에 사용되는 클래스이름에서 패키지명을 생략할 수 있다.
4. 제어자
제어자는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
접근 제어자 public, protected, default, private 그 외 static, final, abstract, native, teansient, synchronized, volatile, strictfp
static - 클래스의, 공통적인
사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭
대상
멤버변수
모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.
클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.
클래스가 메모리에 로드될 때 생성된다.
메서드
인스턴스를 생성하지 않고도 호출이 가능한 static메서드가 된다.
static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.
final - 마지막의, 변경될 수 없는
사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수
대상
클래스
변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 다른 클래스의 조상이 될 수 없다.
메서드
변경될 수 없는 메서드, 오버라이딩을 통해 재정의 될 수 없다.
멤버변수, 지역변수
값을 변경할 수 없는 상수가 된다.
인스턴스 변수의 경우 final이 붙은 변수를 생성자에서 초기화 되도록 할 수 있다.
abstract - 추상의, 미완성의
사용될 수 있는 곳 - 클래스, 메서드
대상
클래스
클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드
선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다.
접근 제어자
사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 생성자
private - 같은 클래스 내에서만 접근이 가능하다. default- 같은 패키지 내에서만 접근이 가능하다. protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다. public - 접근 제한이 전혀 없다.
접근 범위 public > protected > default > private
접근 제어자를 사용하는 이유
외부로부터 데이터를 보호하기 위해
외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
제어자의 조합
메서드에 static과 abstract를 함께 사용할 수 없다.
클래스에 abstract와 final을 동시에 사용할 수 없다.
abstract메서드의 접근 제어자가 private일 수 없다.
메서드에 private과 fianl을 같이 사용할 필요는 없다.
Last updated