ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바의 정석] 7장 : 객체지향 프로그래밍 II
    책/자바의 정석 3판 2024. 2. 18. 21:31
    반응형

    1. 상속 (inheritance)

    1. 상속의 정의와 장점
      • extends 키워드로 가능
      • 부모 클래스의 모든 멤버 변수와 메서드를 상속받음
        • private 또는 default인 멤버들은 상속되지 않는게 아니라 상속은 되는데 접근이 안되는 것
      • 코드의 중복을 최소화할 수 있음
    2. 클래스간의 관계 - 포함관계 (composite)
      • 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
    3. 클래스간의 관계 설정하기
      • is - a → 상속
      • has - a → 포함
    4. 단일 상속
      • 자바에서는 다중 상속을 허용하지 않음 → 단일 상속만 가능
    5. Object 클래스 - 모든 클래스의 조상
      • 누군가에게 상속받지 않는 클래스는 모두 자동적으로 extends Object가 붙는다.

    2. 오버라이딩 (overriding)

    1. 오버라이딩이란?
      • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
    2. 오버라이딩의 조건
      • 이름, 매개변수, 반환타입 전부 같아야 함
      • 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 불가능 → protected라면, protected나 public이어야 함
      • 조상 클래스 메서드보다 많은 수의 예외 선언 불가능 → 단순히 예외 개수가 아닌, 범위의 문제
      • static 조상 클래스 메서드의 경우 오버라이딩하는 것이 아닌 개별적인 static 메서드를 만드는 것
    3. 오버로딩 vs 오버라이딩
      • 오버로딩 : 기존에 없는 새로운 메서드 정의(new)
      • 오버라이딩 : 상속받은 메서드의 내용 변경(change)
    4. super
      • 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수
      • static 메서드 역시 super를 사용할 수 없다.
    5. super() - 조상 클래스의 생성자
      • 조상 클래스의 생성자를 호출하는데 사용
      • 자손 클래스 인스턴스 생성 → 자손 멤버 + 조상 멤버인 하나의 인스턴스 생성
        • 이 때 조상 클래스 멤버의 초기화 작업 해야하므로 조상 클래스의 생성자 호출
        • Object 클래스 제외한 모든 클래스 생성자 첫줄에 super(); 호출해야 함
        • 그렇지 않으면 컴파일러가 자동적으로 삽입
      • 계속 거슬러 올라가 결국 Object의 생성자까지 호출됨

    3. pagkage와 import

    1. 패키지(package)
      • 클래스의 묶음
      • 클래스의 실제 이름은 패키지명 포함한 것 ex) java.lang.String
      • 패키지는 물리적으로 하나의 디렉토리
      • 모든 클래스는 반드시 하나의 패키지에 속해야 함
    2. 패키지의 선언
      • package 패키지명;
      • 반드시 소스파일에서 첫번째 문장이어야 함
      • 패키지명은 소문자 원칙
    3. import 문
      • 사용하고자 하는 클래스의 패키지를 미리 명시하는 것
    4. import 문의 선언
      • import문에서 클래스 이름 대신 *를 사용하는 것이 하위 패키지 클래스까지 포함하지 않음
    5. static import
      • static 메서드를 호출할 때 클래스 이름 생략 가능

    4. 제어자 (modifier)

    1. 제어자란?
      • 접근 제어자 : public, protected, default, private
      • 그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp
    2. static - 클래스의, 공통적인
      • 멤버변수
        • 모든 인스턴스 공용 클래스 변수
        • 인스턴스 생성 안해도 사용 가능 → 클래스가 메모리에 로드될 때 생성
      • 메서드
        • 인스턴스 생성 안해도 호출 가능
        • static 메서드 내에서는 인스턴스 멤버 사용 불가
    3. final - 마지막의, 변경될 수 없는
      • 클래스 : 상속 불가
      • 메서드 : 오버라이딩 불가능
      • 멤버변수, 지역변수 : 값을 변경할 수 없는 상수가 됨 but 인스턴스 변수의 경우 생성자에서 초기화 가능
    4. abstract - 추상의, 미완성의
      • 클래스 - 클래스 내에 추상 메소드 선언됨을 의미 → 인스턴스화 불가능
      • 메서드 - 추상 메서드임을 의미
      • 추상 메소드가 하나도 없어도 추상 클래스로 만들 수도 있음
    5. 접근 제어자 (access modifier)
      • private : 같은 클래스 내에서만
      • default : 같은 패키지 내에서만
      • protected : 같은 패키지 내, 다른 패키지의 자손 클래스에서만
      • public : 전혀 없음
      • 클래스 : public, default
      • 메서드, 멤버변수 : 4개 다 가능
      • 이유
        • 외부로부터 데이터를 보호하기 위함 (data hiding) → 캡슐화(encapsulation)
        • 내부적으로만 사용되는 부분을 감추기 위해
      • 생성자의 접근 제어자
        • 생성자를 private로 놓으면 클래스 내부에서만 인스턴스 생성 가능
        • 대신 미리 만들어놓고 이를 리턴하도록 → 싱글톤(singleton)
    6. 제어자(modifier)의 조합

    5. 다형성 (polymorphism)

    1. 다형성이란?
      • 여러 가지 형태를 가질 수 있는 능력
      • 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조 가능
      • 조상클래스 타입의 참조변수로는 조상클래스 멤버만 접근 가능
      • 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 함
    2. 참조변수의 형변환
      • 서로 상속 관계에 있는 클래스 사이에서만 형변환 가능
      • Up-casting : 자손 → 조상 (생략 가능)
      • Down-casting : 조상 → 자손 (생략 불가)
      • 형변환은 참조변수의 타입을 변환하는 것이기 때문에 인스턴스에 아무런 영향 안 끼침
    3. instanceof 연산자
      • 참조변수 instanceof 클래스명
      • true일 경우 참조변수가 검사한 타입으로 형변환이 가능함을 의미
    4. 참조변수와 인스턴스의 연결
      • 메소드의 경우 참조 변수 타입에 상관없이 무조건 오버라이딩 된 메소드를 호출
      • 그러나 멤버 변수의 경우 참조 변수 타입에 따른 데이터를 가져옴 (이름이 같은 경우)
    5. 매개변수의 다형성
      • 다형성이 없으면, 자식 클래스에 대한 매개변수를 가진 메소드 오버로딩이 계속되어야 하지만, 다형성을 통해 조상 클래스에 대한 매개변수를 받도록 하여 메소드 수를 줄일 수 있음

    6. 추상 클래스 (abstract class)

    1. 추상클래스란?
      • 미완성 설계도
      • 인스턴스 생성 불가
      • 추상메소드를 포함하고 있다는 것을 제외하면 클래스와 동일
    2. 추상 메소드 (abstract method)
      • abstract 리턴타입 메서드이름( );
      • 만약 자식 클래스에서도 모두 구현 못하면 그 클래스도 추상 클래스가 되어야 함
    3. 추상클래스의 작성
      • 상속계층을 내려갈수록 클래스는 기능 추가 → 구체화 증가
      • 상속계층을 올라갈수록 → 추상화 증가
      • 추상화 : 클래스간 공통점을 찾아내서 공통의 조상을 만드는 것
      • 구체화 : 상속을 통해 클래스 구현 및 확장

    7. 인터페이스 (interface)

    1. 인터페이스란?
      • 일종의 추상 클래스
      • 추상메서드와 상수만을 멤버로 가질 수 있음
      • 추상 클래스가 미완성 설계도라면, 인터페이스는 기본 설계도
    2. 인터페이스의 작성
      • 인터페이스 선언부에는 public, default만 가능
      • 모든 멤버변수는 public static final이어야 하며, 생략 가능
      • 모든 메서드는 public abstract 이어야 하며, 생략 가능
        • 단, static 메서드와 디폴트 메서드는 예외
    3. 인터페이스의 상속
      • 인터페이스로부터만 상속 받을 수 있고, 다중 상속 가능
    4. 인터페이스의 구현
      • 인스턴스 생성 불가능
      • 만약 구현하는 인터페이스의 메서드 중 일부만 구현하면, abstract 붙여서 추상 클래스로 만들어야함
    5. 인터페이스를 이용한 다중 상속
      • 생략
    6. 인터페이스를 이용한 다형성
      • 인터페이스 타입 참조 변수에 이를 구현한 클래스 인스턴스 참조 가능
      • 리턴타입이 인터페이스 → 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것
    7. 인터페이스의 장점
      • 개발 시간 단축
      • 표준화 가능
      • 서로 관계없는 클래스에게 관계 맺을 수 있음
        • 서로 상속관계도 아니고, 같은 조상 클래스 가지지도 않은 관계에서 관계를 만들어줄 수 있음
      • 독립적인 프로그래밍 가능
        • 선언과 구현이 분리되어있기 때문에 한 클래스의 변경이 다른 클래스에 영향을 미치지 않게 가능
    8. 인터페이스의 이해
    9. 디폴트 메서드와 static 메서드

     

     

    https://product.kyobobook.co.kr/detail/S000001550352

    반응형
Designed by Tistory.