JAVA의 정석 | Chapter 7 : 객체지향프로그래밍 2 (1)

Yunny.Log ·2022년 6월 7일
0

JAVA

목록 보기
15/29
post-thumbnail

1.상속

1.1 상속의 정의와 장점

상속을 받을 때

  • 생성자와 초기화 블럭은 상속되지 않는다, 오로지 멤버만 상속
  • 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다
  • 상속을 받게 되면 조상클래스만 변경돼도 모든 자손 클래스에, 손자 클래스까지 영향
    => 클래스 간 상속관계 맺어준다면 자손 클래스들의 공통적인 부분은 조상클래스에서 관리, 자손 클래스는 자신에 정의된 멤버들만 관리
    => 관리 easy
  • 자손 클래스의 인스턴스 생성 시, 조상 클래스의 멤버도 함께 생성
    => 따로 조상 클래스의 인스턴스 생성 안해도 조상 클래스 멤버 사용 가능

A는 B이다 => 상속관계 (자손-조상)
A는 B를 가진다 => 포함관계 (A 클래스에 B클래스 포함시키기)

  • 프로그램의 모든 클래스를 분석해 가능한 많은 관계 맺도록 노력해, 코드의 재사용성 높이기

1.4 단일 상속

  • 자바에서는 단일 상속만을 허용
    => 클래스 간 관계가 명확 , 코드 더 신뢰 가능
  • 다중 상속을 허용 시 클래스 간 관계가 매우 복잡, 서로 다른 클래스로부터 상속받은 멤버 간의 이름이 같은 경우 구별 X 라는 단점

2. 오버라이딩

  • 상속받은 메서드의 내용을 변경하는 것

    오버라이딩의 조건
    1) 이름이 같기
    2) 매개변수 같기
    3) 반환타입 같기

조상클래스의 메서드를 자손 클래스에서 오버라이딩할 때
1) 접근 제어자를 조상 클래스 메서드보다 좁은 범위로 변경 불가능
2) 예외는 조상클래스 메서드보다 많이 선언 X
3) 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경 x

2.3 오버로딩 vs 오버라이딩

  • 오버로딩 : 기존에 없는 새로운 new 메소드 정의 (new)
  • 오버라이딩 : 상속받은 메서드 내용 변경 (modify, change)

2.4 super

  • super : 자손 클래스에서 조상클래스로부터 상속받은 멤버 참조하는데 사용되는 참조 변수

  • 멤버변수와 지역변수 간의 이름 the same할 때 this로 구별했듯, 상속받은 멤버와 자신의 멤버와 이름이 같을 때 super을 붙이는 것

  • 인스턴스 메소드에서는 자신이 속한 인스턴스 주소가 지역변수로 저장, 이는 참조변수인 this와 super의 값이 됨

조상의 멤버와, 자신의 멤버를 구별한다는 데 사용되는 점을 제외하고는 super, this는 근본적으로 the same

  • static 메소드는 인스턴스와 관련 x, 따라서 this 와 마찬가지로 super 역시 statuc에선 쓸 수 없음

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

this() : 같은 클래스의 다른 생성자 호출에 사용
super() : 조상 클래스의 생성자 호출에 사용

  • 자손 클래스 인스턴스 생성 시 , 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스 생성

  • 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용 가능
    => 이를 위해서는 조상 클래스 멤버의 초기화 작업 수행 필요
    => 자손 클래스 생성자에서 조상 클래스 생성자 호출돼야 함

  • 생성자 첫 줄에서 조상 클래스 호출이유는, 자손 클래스의 멤버가 조상 클래스 멤버 사용할 수도 있어서, 조상 멤버들이 먼저 초기화 needed

  • Object 클래스 제외한 모든 클래스의 생성자 첫 줄에, 생성자, this() 또는 super() 을 호출해야 한다, 그렇지 않으면 컴파일러가 자동적으로 super()을 생성자 첫 줄에 삽입

4. 제어자

  • 접근 제어자 : public, protected, default, private
    => 접근 제어자는 한번에 하나만 선택 가능

4.2 static : 클래스의, 공통적인

  • static : 클래스의, 공통적인

  • 클래스 변수는 인스턴스에 관계 없이 같은 값을 가진다.

  • 하나의 변수를 모든 인스턴스가 공유하기 때문

  • static이 붙은 멤버변수와 메서드, 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것, 인스턴스 생성 않고도 사용 가능

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

  • 변수에 사용되면 값을 변경할 수 없는 상수
  • 메서드에 사용되면 오버라이딩 불가
  • 클래스에 사용되면 자신을 확장하는 자손 클래스 정의 x
    => final은 변경 불가, 오버라이딩 재정의 부락, final 지정 클래스는 조상 클래스 될 수 없음

4.4 abstract : 추상의, 미완성의

  • 메서드의 선언부만 작성, 실제 수행내용은 구현치 않은 추상메소드 선언하며 사용
  • 추상 클래스는 아직 완성되지 않은 메서드가 존재하는 미완성 설계도! => 인스턴스 생성 불가

4.5 접근 제어자

private 자신 클래스 안에서만 가능
default 같은 패키지 내
protected 같은 패키지 내 + 다른 패키지의 자손 클래스에서 접근 가능
public 접근 제한 어디서나

  • 접근제어자 => 캡슐화의 기능 제공

    1) 외부로부터 데이터 보호 위해
    2) 외부에는 불필요한 내부적으로만 사용되는 부분 감추기 위함

4.6 제어자의 조합

  1. 메서드에 static과 absract 함께 사용 불가능
  • static은 몸통이 있는 메서드에서만 사용 가능
  1. 클래스에 abstract와 final 동시 사용 불가
  • final 은 클래스 확장 x, abstract는 상속 통해 완성돼야 한다는 것=> 서로 모순
  1. abstract메서드의 접근 제어자가 private일 수 없음
  • abstract메서드는 자손클래스에서 구현해줘야 하는데, 접근 제어자가 private이면 자손클래스에서 접근 불가능

0개의 댓글