JAVA 상속

전홍영·2022년 1월 21일
0

Java

목록 보기
4/15

Java의 대표적 특징인 상속에 대해 공부해보자..

상속
1. 상속의 개념

  • 객체지향에서 상속이란 부모 클래스에 만들어진 필드와 메소드를 자식 클래스가 물려받는 것이다. 상속 선언만 하면, 자식 클래스는 부모 클래스에 만들어진 필드와 메소드를 만들지 않고도 만든 것과 같은 효과를 얻는다.
  • 상속은 클래스 사이의 상속이지 객체 사이의 상속이 아니라는 점이다.
  • 상속은 코드 중복을 제거하여 클래스를 간결하게 구현 할수 있게 한다.
  • 상속의 장점
    (1) 클래스의 간결화 - 멤버의 중복 작성이 불필요
    (2) 클래스 관리 용이 - 클래스들의 계층적 분류
    (3) 소프트웨어의 생산성 향상 - 클래스 재상용과 확장 용이
  1. 클래스 상속과 객체
  • 자바의 상속 선언
    자바에서 부모 클래스를 슈퍼 클래스, 상속받는 자식 클래스를 서브 클래스라고 부르며 상속할 때 extends 키워드를 사용한다.
  • 자바 상속의 특징
    (1) 자바에서는 클래스의 다중 상속을 지원하지 않는다. 자바는 클래스를 여러 개 상속받는 다중 상속(mulitple inheritance)을 지원하지 않는다. 그러므로 extends 다음에는 클래스 이름을 하나만 지정해야 한다.
    (2) 자바에서는 상속의 횟수에 제한을 두지 않는다.
    (3) 자바에서 계층 구조의 최상위에 java.lang.Object 클래스가 있다. 자바에서 모든 클래스는 Object 클래스를 자동으로 상속받도록 컴파일된다. Object를 상속받도록 선언하지 않더라도 마찬가지다. Object 클래스만 유일하게 슈퍼 클래스가 없다.
  1. 상속과 protected 접근 지정자
  • 슈퍼 클래스에 대한 접근 지정
    (1) 슈퍼 클래스의 멤버가 private으로 선언되면, 서브 클래스를 포함하여 다른 어떤 클래스에서도 접근할 수 없다.
    (2) 슈퍼 클래스의 멤버가 디폴트로 선언되면, 패키지에 있는 모든 클래스가 접근 가능하다. 서브 클래스라도 다른 패키지에 있다면, 슈퍼 클래스의 디폴트 멤버는 접근할 수 없다.
    (3) 슈퍼 클래스의 멤버가 public으로 선언되면, 같은 패키지에 있든 다른 패키지에 있든 모든 클래스에서 접근할 수 있다.
    (4) 슈퍼 클래스의 protected 멤버는 두가지 경우에 접근을 허용한다. 첫번째는 같은 패키지에 속한 모든 클래스는 접근이 가능하다. 두번째는 같은 패키지든 다른 패키지든 상속받는 서브 클래스는 슈퍼 클래스의 protected 멤버에 접근 가능하다.
  1. 상속과 생성자
  • 서브 클래스와 슈퍼 클래스의 생성자 호출 및 실행
    서브 클래스 객체가 생성되면 슈퍼 클래스 생성자와 서브 클래스의 생성자가 모두 실행된다.
    슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자가 실행된다. (서브 클래스의 생성자가 먼저 호출 되지만 실행은 가장 나중에 된다.)
  • 서브 클래스에서 슈퍼 클래스 생성자 선택
    (1) 슈퍼 클래스의 기본 생성자가 자동 선택되는 경우
    개발자의 명시적 지시가 없으면 슈퍼 클래스에 만들어진 기본 생성자가 선택된다. 이는 자바 컴파일러에서 강제하는 것이다. 그러나 슈퍼 클래스에 기본 생성자 없이 매개변수를 받는 생성자만 있을 경우 오류가 난다. 왜냐하면 서브 클래스 생성자가 기본 생성자일 경우 슈퍼 클래스의 생성자에도 기본 생성자가 있어야 하는데 이미 다른 생성자가 있어 기본 생성자가 생성되지 않아 짝을 이루는 생성자가 없어 오류가 일어난다.
    (2) super()를 이용하여 명시적으로 슈퍼클래스의 생성자 선택
    서브 클래스의 생성자에서 super()를 이용하면, 슈퍼 클래스 생성자를 명시적으로 선택할 수 있다. super()는 슈퍼 클래스 생성자를 호출하는 코드이다. super()는 반드시 생성자 첫 라인에 사용되어야 한다. super(매개변수) 여기서 매개변수는 슈퍼 클래스 생성자에 맞는 매개변수를 의미한다.
  1. 업캐스팅과 instanceof 연산자
  • 캐스팅(casting)이란 타입 변환을 의미한다. 자바에서 클래스에 대한 캐스팅은 업캐스팅(upcasting)과 다운캐스팅(downcasting)으로 나뉜다.
  • 업캐스팅
    (1) 서브 클래스는 슈퍼 클래스의 멤버를 모두 갖기 때문에 서브클래스의 객체는 슈퍼클래스의 객체로 취급할 수 있다.
    (2) 서브클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것을 업캐스팅이라 한다.
    (3) 업캐스팅은 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다.
    (4) 업캐스팅한 슈퍼 클래스의 객체는 슈퍼 클래스의 객체만 사용할 수 있다.
    (5) 업캐스팅은 명시적으로 타입변환을 표시할 필요는 없다.( p = (Student) s;에서 Student는 생략 가능)
    업캐스팅 참조글(https://huyncolog.tistory.com/17#:~:text=%3D%3E%20%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94,%EB%AC%B6%EC%96%B4%EC%84%9C%20%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%EC%84%9C%EC%9D%B4%EB%8B%A4.)
  • 다운캐스팅
    (1) 슈퍼클래스의 레퍼런스를 서브 클래스의 레퍼런스로 변환하는 것을 다운캐스팅이라 한다.
    (2) 다운캐스팅은 명시적으로 타입 변환을 지정해야한다.
  • 업캐스팅과 instanceof 연산자
    (1) 업캐스팅 된 객체가 어떤 서브클래스의 객체를 업캐스팅한 것인지 알 수 없다.
    (2) 객체가 어떤 클래스 객체인지 구별하기 위한 방법이 instanceof 연산자이다.
    (3) 레퍼런스 instanceof 클래스명
    (4) instanceof 연산자의 결과 값은 boolean 타입으로 레퍼런스가 가리키는 객체가 클래스 타입이면 true를 반환 하고 아니면 false를 반환한다.
    (5) instanceof 연산자는 객체에 대한 레퍼런스만 사용된다.(String 포함)
    (6) 서브 클래스 객체는 슈퍼 클래스 타입과 동일하다.
  1. 메소드 오버라이딩
  • 메소드 오버라이딩은 슈퍼 클래스에 선언된 메소드와 같은 이름, 같은 리턴 타입, 같은 매개변수 리스트를 갖는 메소드를 서브 클래스에서 재작성하는 것이다.
  • 서브 클래스의 개발자가 슈퍼 클래스의 있는 메소드로 목적하는 바를 이룰 수 없을 때 동일한 이름의 메소드를 서브 클래스에 다시 작성할 수 있다.
  • 이는 슈퍼클래스의 메소드를 무시하고 서브 클래스에서 오버라이딩된 메소드가 무조건 실행되도록 한다는 것인데, 이런 처리를 동적바인딩이라 한다.
  • 메소드 오버라이딩은 동적 바인딩을 유발시킨다.
  • 만약 업캐스팅 된 레퍼런스의 생성자를 호출할 때는 슈퍼클래스의 생성자를 호출하지만 오버라이딩된 생성자가 서브클래스에 있다면, 슈퍼클래스의 생성자를 실행하는 것이 아닌 서브클래스의 생성자가 실행된다.
  • 오버라이딩은 상속을 통해 하나의 인터페이스(같은 이름)에 서로 다른 내용 구현이라는 객체 지향의 다형성을 실현하는 도구이다.
  • 오버라이딩한 코드 앞에 @Override를 수면 오버라이딩에 오류가 있는지 컴파일러가 구별해준다.
  • 메소드 오버라이딩 제약 사항
    (1) 슈퍼클래스의 메소드와 동일한 원형으로 작성한다.
    (2) 슈퍼 클래스 메소드의 접근 지정자보다 접근 범위를 좁여 오버라이딩할 수 없다.
    (3) static이나 private 또는 final로 선언된 메소드는 서브 클래스에서 오버라이딩 할 수 없다.
  • 메소드 오버라이딩은 서브 클래스 개발자가 슈퍼 클래스의 특정 메소드를 자신의 특성에 맞게 새로 만들어 사용하고자 하는 경우에 활용된다.
  • 동적 바인딩 : 오버라이딩된 메소드 호출
    (1) 동적 바인딩(dynamic binding)은 실행할 메소드를 컴파일 시에 결정하지 않고 실행시에 결정하는 것을 말한다.
    (2) 어떤 경우이든 자바에서 오버라이딩된 메소드가 있다면 동적 바인딩을 통해 오버라이딩된 메소드가 무조건 실행된다.
    (3) 동적 바인딩 참고글https://sorjfkrh5078.tistory.com/87
  • 오버라이딩과 super 키워드
    super는 자바 컴파일러에 의해 지원되는 것으로 슈퍼 클래스에 대한 레퍼런스이다. super를 이용하면 슈퍼 클래스의 필드와 메소드 모두 접근이 가능하다.
    (ex. super.슈퍼클래스의 멤버)
  • 오버로딩(overloading)과 오버라이딩(overriding)
    오버로딩과 오버라이딩은 자바에서 다형성을 이루는 방법들이다.
  1. 추상 클래스
  • 추상 메소드(abstract method)
    추상 메소드란 선언은 되어 있으나 코드가 구현되어 있지 않는 메소드이다.
    abstract 키워드를 이용하여 선언한다. ( public abstract void SetName(String name); )
  • 추상 클래스 만들기
    추상클래스는 추상 메소드를 포함하는 클래스 혹은 추상 메소드가 없지만 abstract로 선언한 클래스 2가지 경우가 있다.
    추상 메소드를 가지고 있으면 반드시 추상 클래스로 선언되어야 한다.
  • 추상 클래스는 객체를 생성할 수 없다.
    추상 클래스는 보디 객체를 생성할 목적으로 만드는 클래스가 아니기 때문에 추상 클래스의 객체를 생성할 수 없다.
    추상 클래스에는 실행 코드가 없는 미완성 상태인 추상 메소드가 있을 수 있기 때문에, 객체를 생성하는 코드는 오류가 난다.
    그러나 추상 클래스 레퍼런스 변수를 생성할 수는 있다.
  • 추상 클래스 상속
    추상 클래스를 상속받는 서브 클래스는 추상 메소드를 그대로 상속받기 때문에 자동으로 추상 클래스가 된다. 따라서 abstract 키우드를 사용하여 추상 클래스임을 명시해야 오류가 일어나지 않는다.(서브클래스가 슈퍼 클래스의 추상 메소드를 오버라이드하면 abstract를 안 붙여도 된다.)
  • 추상 클래스의 구현과 목적
    추상 클래스의 구현이란, 슈퍼 클래스에 선언된 추상 메소드를 서브 클래스에서 오버라이딩하여 실행 가능한 코드로 구현하는 것을 말한다.
    추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할을 하고, 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수 있다.
  • 추상 클래스의 용도
    추상 클래스를 이용하면 설계와 구현을 분리할 수 있다. 추상 클래스로 기본 방향을 잡아놓고 서브 클래스에서 구현하면 구현 작업이 쉬워진다. 또한 추상 클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합하다.
  1. 인터페이스
  • 자바의 인터페이스
    인터페이스란 규격을 의미한다. 자바의 인터페이스는 interface 키워드를 사용하여 클래스를 선언하듯이 선언한다.
    ex) interface Set{}
    (1) 인터페이스 구성 - 인터페이스는 5종류의 멤버(추상 메소드, default 메소드, private 메소드, static 메소드)로 구성되며, 필드(멤버 변수)를 만들 수 없다. 추상 메소드는 public abstract로 정해져 있으며, 생략될 수 있고, 다른 접근 지정으로 지정될 수 없다. default, private, static 메소드들은 모두 인터페이스 내에서 코드가 작성되어 있어야 한다. default 메소드의 접근 지정은 public으로 고정되어 있다. private 메소드는 인터페이스 내에서만 호출 가능하다. static 메소드의 경우 접근 지정이 생략되면 public이며, private으로 지정될 수 있다.
    (2) 인터페이스는 객체를 생성할 수 없다. - 인터페이슨에 구현되지 않는 추상 메소드를 가질 수 있기 때문에 객체를 생성할 수 없다.
    (3) 인터페이스 타입의 레퍼런스 변수는 선언 가능하다.
    (4) 인터페이스끼리 상속 된다.
    (5) 인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현해야 한다.
  • 인터페이스의 구현
    인터페이스의 구현이란 implements 키워드를 이용하여 인터페이스의 모든 추상 메소드를 구현한 클래스를 작성하는 것을 말한다.
    ex) class setName implements Set{}
  • 인터페이스 상속
    클래스는 인터페이스를 상속 받을 수 없고 인터페이스만 인터페이스를 상속 받을 수 있다. 상속을 통해 기존 인터페이스에 새로운 규격을 추가한 새로운 인터페이스를 만들수 있다.
    클래스는 다중 상속이 불가능 하지만 인터페이스는 다중 상속이 가능하다.
  • 인터페이스의 목적
    인터페이스를 이용하면 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언이며, 클래스의 다형성을 실현하는 도구이다.
  • 다중 인터페이스 구현
    클래스는 하나 이상의 인터페이스를 구현할 수 있다. 이 경우 콤마로 각 인터페이스를 구분하여 나열하며, 각 인터페이스에 선언된 모든 추상 메소드를 구현해야 한다. 그렇지 않으면 오류가 일어난다.
  • 클래스 상속과 함께 인터페이스 구현
    다중 상속, 다중 인터페이스 구현은 유용하나 자치 너무 남용하게 된다면 클래스, 인터페이스 간의 관계가 너무 복잡해져 프로그램 전체 구조를 파악하기 어려울 수 있다.
  • 인터페이스와 추상 클래스 비교
    공통점 : 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스만 사용된다. , 클래스의 다형성을 실현하기 위한 목적이다.

#가독성은 떨어지지만.. 그냥 정리할 겸 상기할 겸 해서 그냥 쓰는 거기 때문에 큰 상관은 없을거다...(언젠가 다시 정리할 듯..)

profile
Don't watch the clock; do what it does. Keep going.

0개의 댓글