JAVA - 08

월요일좋아·2022년 9월 27일
0

JAVA

목록 보기
8/12

상속

상속이란?

  • 자식( 하위, 파생 ) 클래스가 부모( 상위 ) 클래스의 멤버를 물려받는 것
  • 자식이 부모를 선택해 물려받음
  • 상속 대상 : 부모의 필드와 메소드 ( 부모의 모든 멤버를 다 받음 )

상속 개념의 활용

  • 상속의 효과
    • 부모 클래스 재사용해 자식 클래스 빨리 개발 가능
    • 반복된 코드 중복 줄임
    • 유지 보수 편리성 제공
    • 객체 다형성 구현 가능

  • 상속 대상 제한
    • 부모 클래스의 private 접근 갖는 필드와 메소드 제외
    • 부모 클래스가 다른 패키지에 있을 경우, default 접근 갖는 필드와 메소드라도 상속이 불가능

extends 키워드 (상속 키워드)

  • 자식 클래스가 상속할 부모 클래스를 지정하는 키워드

  • 자바는 단일 상속 - 부모 클래스 나열 불가


상속 문제 1

문제 1) 클래스 SumSub 와 MultiDiv 를 생성하고, SumSub 에는 멤버 변수 num1, num2를 가지고 멤버 메서드 sum(), sub()를 가지도록 하며,
MultiDiv 에는 멤버 변수 result, 멤버 메서드 Multi(), div() 를 가지도록 하고, 마지막으로 Caculator 클래스를 생성하여
두 개의 클래스 모두를 상속받아 모든 기능을 사용할 수 있는 클래스로 작성하고, 각각 사칙연산을 수행하시오.
1. SumSub > MultiDiv > Calculator 순서대로 상속받기
2. Calculator 클래스는 나머지 연산을 위한 멤버 메서드 other()를 가지고 있음

  • Main
		Calculator cal = new Calculator();
        cal.num1 = 10;
        cal.num2 = 3;

        cal.Sum();
        cal.Sub();
        cal.Multi();
        cal.Div();
        cal.other();

        System.out.println(cal.Sum());
        System.out.println(cal.Sub());
        System.out.println(cal.Multi());
        System.out.println(cal.Div());
        System.out.println(cal.other());
  • SumSub
public class SumSub {
    public int num1;
    public int num2;

    public int Sum() {
        return num1 + num2;
    }

    public int Sub() {
        return num1 - num2;
    }
}
  • MultiDiv
public class MultiDiv extends SumSub{
    // MultiDiv 에는 멤버 변수 result, 멤버 메서드 Multi(), div() 를 가지도록 하고
    public int result;

    public int Multi() {
        result = num1 * num2;
        return result;
    }
    public int Div() {
        result = num1 / num2;
        return result;
    }
}
  • Calculator
public class Calculator extends MultiDiv{
    // 두 개의 클래스 모두를 상속받아 모든 기능을 사용할 수 있는 클래스로 작성하고, 각각 사칙연산을 수행하시오.

public int other() {
    int other1 = num1 / num2;
    return other1;
}
}

JAVA 핵심

  1. 변수
  2. 연산자
  3. 제어문(if, switch)
  4. 반복문(for, while)
  5. 배열
  6. 메서드(매개변수, 반환값)
  7. 클래스(멤버변수, 멤버 메서드, 접근제한자, 정적멤버, 생성자)
  8. 상속
  9. 인터페이스
  10. 컬렉션(HashMap, ArrayList)

자바스크립트(es6)

  • dom객체

부모 생성자 호출( super(...) )

자식 객체 생성하면 부모 객체도 생성되는가? -> 생성됨

  • 부모 없는 자식 없음
    • 자식 객체 생성할 때는 부모 객체부터 생성 후 자식 객체 생성
    • 부모 생성자 호출 완료 후 자식 생성자 호출 완료
  • super(매개값,...)
    • 부모 생성자를 호출할 때 사용
    • 오버로딩
    • 매개값과 동일한 타입, 개수, 순서에 맞는 부모 생성자 호출

명시적인 부모 생성자 호출

  • 부모 객체 생성할 때, 부모 생성자 선택해 호출
  • super(매개값, …)
    • 매개값과 동일한 타입, 개수, 순서 맞는 부모 생성자 호출
  • 부모 생성자 없다면 컴파일 오류 발생
  • 반드시 자식 생성자의 첫 줄에 위치(super())
  • 부모 클래스에 기본(매개변수 없는) 생성자가 없다면 필수 작성

📌메소드 재정의(Override)

메소드 재정의 : 오버라이트 ( @Override )

  • 부모 클래스의 상속 메소드 수정해 자식 클래스에서 재정의하는것
  • 메소드 재정의 조건 : 부모 메서드와 겉모양이 같아야 함. 내용(소스코드)은 수정 가능
    • 부모 클래스의 메소드와 동일한 시그니처(반환타입, 접근제한(더 강하게 안됨))가져야
    • 접근 제한을 더 강하게 오버라이딩 불가
      • public을 default나 private로 수정 불가
      • 반대로 default는 public으로 수정 가능
    • 새로운 예외(Exception) throws 불가( 예외처리는 나중에 배움! )
  • 일종의 튜닝! 물려받은 낡은 엄마차 내부튜닝

@Override 어노테이션

  • 컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사 지시
  • 정확한 메소드 재정의 위해 붙여주면 OK
  • 메서드위에 붙여줌, 써도 정상적으로 동작하지만 쓰면 오류검사해줌
    • 안쓰고 입력랬을때 오류생겨도 못잡고, 오버라이드가 아닌 오버로딩이 되는경우 많음
  • 선언부의 모양은 바꾸면 안됨

메소드 재정의 효과

  • 부모 메소드는 숨겨지는 효과 발생
    • 자식 클래스에서는 재정의된 메소드만 호출
  • 자식 클래스에서 수정되기 전 부모 메소드 호출 - super 사용
    • super는 부모 객체 참조(참고: this는 자신 객체 참조)

final 클래스, final 메소드

final 키워드의 용도

  • final 필드 : 수정 불가 필드 ( 단한번의 데이터 입력/수정만 가능 )
  • final 클래스 : 부모로 사용 불가한 클래스 ( 상속 불가 클래스 )
    ex) Math 클래스
  • final 메소드 : 자식이 재정의( @Override )할 수 없는 메소드(오버라이딩 불가)
  • 부모 메서드에 private = 상속금지
    부모 클래스에 final 메소드 = @Override 금지

상속할 수 없는 final 클래스

  • 자식 클래스 만들지 못하도록 final 클래스로 생성

오버라이딩 불가한 final 메소드

  • 자식 클래스가 재정의 못하도록 부모 클래스의 메소드를 final로 생성

protected 접근 제한자

protected 접근 제한자

  • 상속과 관련된 접근 제한자
    • 같은 패키지: default와 동일
    • 다른 패키지: 자식 클래스만 접근 허용

static 멤버 (정적 멤버)

  • 객체 생성없이 클래스명으로 접근 가능한 멤버
  • 특징
    • 정적멤버는 정적멤버끼리 사용
    • 객체 멤버는 정적멤버에 접근가능, 정적 멤버는 객체 멤버에 접근 불가능
    • 정적 멤버는 데이터를 공유한다.
  • 정적멤버 초기화 : static {초기화}

static 멤버 선언

///////////////////////

0개의 댓글