반응형
클래스 상속
- 자바에서 상속이란, 연관있는 클래스에 대해 공통적인 구성 요소를 정의하고, 이를 대표하는 클래스를 정의하는것을 말한다.
- 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고 한다, 그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class)또는 하위 클래스(sub class), 파생 클래스(derived class)라고 한다
- 단 하나의 클래스 상속(단일 상속)만 가능하다.
상속 클래스의 생성자
- 각 클래스마다 생성자는 꼭 하나 이상은 존재한다.
- 호출의 순서는 상속 관계에서 자식 클래스를 인스턴스화 하면 부모 클래스의 객체가 먼저 인스턴스화가 진행되고, 자식 클래스 객체가 인스턴스화 한다.
super 키워드
- 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는데 사용하는 참조변수이다.
- 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드로 구별할수있다.
super() 메서드
부모 클래스와 자식 클래스가 서로 상속 관계를 맺고 new 키워드를 통해 자식 클래스를 초기화 할때, 반드시 자식 클래스 생성자 내에서 부모 클래스 생성자를 호출하는 메서드 super() 가 가장 먼저(첫번째 행에서) 실행 된다.
이는 원래 직접 명시해야 되지만 디폴트 생성자일 경우 개발 편의성을 위해 생략할 수 있도록 되어 있다.
만일 직접 생성자를 정의하거나 생성자 오버라이딩이 되어 있을 경우 메서드 시그니처에 맞는 생성자를 super(name) 메서드로 직접 정의해서 호출해야 된다.
메서드 오버라이딩(overrideing)
- 상속받은 메서드의 내용만 변경하여 덮어씌움
- 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 재정의하는것이다.
참조형 캐스팅
- 하나의 데이터 타입을 다른 타입으로 바꾸는 것을 타입 변화 혹은 형변환(캐스팅) 이라고 한다.
- 상속 관계의 클래스는 크게 부모클래스(슈퍼 클래스)와 자식 클래스(서브 클래스)로 구분할 수 있다.
- 상속 관계에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능하다
- 클래스는 reference 타입으로 분류되니 이를 참조형 캐스팅(업캐스팅/다운캐스팅)이라고 불리운다.
- 자식 클래스의 객체는 부모 클래스를 상속하고 있기 떄문에 부모의 멤버를 모두 가지고있다.
- 부모 클래스의 객체는 자식 클래스의 멤버를 모두 가지고 있지는 않는다.
- 참조변수의 형변환은 사용할수있는 멤버의 갯수를 조절하는것.
- 형제 클래스 끼리는 아예 타입이 다르기 떄문에 참조 형변환이 불가능하다.
업캐스팅(UpCasting)
- 자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것이다.
- 캐스팅 연산자 괄호를 생략할수있다.
- 업캐스팅을 하고 메소드를 실행할때, 만일 자식 클래스에서 오버라이딩한 메서드가 있을 경우, 부모 클래스의 메서드가 아닌 오버라이딩 된 메서드가 실행되게 된다.
업캐스팅 오버라이딩 메서드
- 업캐스팅 하면 멤버 갯수가 제한되어 자식 클래스에만 있는 멤버는 사용할수 없게 도니다.
- 업캐스팅 했지만 오버라이딩 된 메서드는 자식 클래스의 메서드로 실행이 된다.
업캐스팅의 필요성
- 공통적으로 할수있는 부분을 만들어 간단하게 다루기 위해서 이다.
- 상속 관계에서 상속 받은 서브 클래스가 몇개이든 하나의 인스턴스로 묶어서 관리할수있다.
다운 캐스팅(DownCasting)
- 거꾸로 부모 클래스가 자식 클래스 타입으로 캐스팅 되는 것이다.
- 캐스팅 연산자 괄호를 생략할 수 없다목적은 업캐스팅한 객체를 다시 자식 클래스 타입의 객체로 되돌리는데 목적을 둔다.
- 원래 있던 기능을 회복하기 위해 다운캐스팅을 하는것이다.
instanceof 연산자
- 어느 객체 변수가 어느 클래스 타입인지 판별해 true/false를 반환해준다.
- 객체에 대한 클래스(참조형) 타입에만 사용할수있다.
추상 클래스
- 추상 클래스는 객체를 생성할수 없다.
추상 메소드(abstract method)
- 선인되어 있으나 구현되어 있지 않은 메소드, abstract으로 선언
public abstract String getName();
public abstract void setName(String s);
- 추상 메소드는 서브 클래스에서 오버라이딩 하여 구현해야 함
추상 클래스(abstract method)의 종류
추상 클래스의 상속
추상 클래스의 단순 상속
- 추상 클래스를 상속받아, 추상 메소드를 구현하지 않으면 추상클래스가 됨
- 서브 클래스도 abstract으로 선언 해야함.
추상 클래스 구현 상속
- 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
- 서브 클래스는 추상 클래스가 아니다.
추상 클래스의 용도
- 설계와 구현 분리
- 계층적 상속 관계
인터페이스(interface)
- 클래스가 구현해야 할 메소드들이 선언되는 추상형
- 인터페이스 선언
- 다른 interface 상속 가능
- interface의 다중 상속 가능
- 인터페이스를 상속받는 클래스는 인터페이스의 모든 추상메소드 반드시 구현
- 인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현하여야 한다.
인터페이스에 포함
상수 포함
- public 만 허용
- public static final 생략
추상 메소드 포함
- public abstract 생략 가능
default 메소드 포함
- 인터페이스에 코드가 작성된 메소드
- 인터페이를 구현하는 클래스에 자동상속
- public 접근 지정만 허용, 생략가능
private 메소드 포함
- 인터페이스 내에 메소드 코드가 작성되어야함
- 인터페이스 내에 있는 다른 메소드에 의해서만 호출가능
static 메소드 포함
- public, private 모두 지정가능, 생략하면 public
implements
interface TestInterface{
public static int num = 8;
public void fun1();
public void fun2();
}
class InterfaceExam implements TestInterface{
@Override
public void fun1(){
System.out.println(num);
}
@Override
public void fun2() {
}
}
public class InterfaceSample{
public static void main(String args[]){
InterfaceExam exam = new InterfaceExam();
exam.fun1();
}
}
- 보모의 메소드를 반드시 오버라이딩해야 함.
- 다중상속을 대신해 준다.
- 여러개 사용가능
- 설계목적으로 구현
interface가 불가능 할때
- field(멤버변수) 선언 불가(heap에 저장되는건 못만듬, 객체가 만들어져야하는건 사용 불가능)
new PhoneInterface();//인터페이스 PhoneInterface 객체 생성불가능
- interface 타입의 래퍼런스 변수는 선언가능하다.
PhoneInterface galaxy; //galaxy는 인터페이스에 대한 래퍼런스변수
interface의 목적
- 인터페이스는 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할수 있도록 하는 클래스의 규격 선언이며, 클래스의 다형성을 실현하는 도구이다.
추상 클래스와 인터페이스 비교
유사점
- 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용
- 클래스의 다형성을 실현하기 위한 목적
다른점
반응형
'JAVA' 카테고리의 다른 글
[JAVA] Wrapper class (0) | 2023.07.18 |
---|---|
[JAVA] 중첩 클래스, 익명객체 (0) | 2023.07.18 |
[JAVA] Class(구성, 필드, 메서드, 생성자, this) (0) | 2023.07.18 |
[JAVA] 패키지, 접근지정자, static, final (0) | 2023.07.18 |
[JAVA] 객채, 클래스, 기본생성자, 객체배열 (0) | 2023.07.18 |