본문 바로가기

프로그래밍 언어/JAVA

[NO.4] 상속

반응형

객체지향언어에서 상속의 장점

클래스의 간결화

: 멤버의 중복 작성 불필요

 

클래스 관리 용이

: 클래스들의 계층적 분류

 

소프트웨어의 생산성 향상

: 클래스 재사용과 확장 용이


자바 상속의 특징 / 접근 지정자

| 자바에서는 클래스의 다중 상속을 지원하지 않는다
| 자바에서는 상속의 횟수에 제한을 두지 않는다
| 자바에서는 계층 구조의 최상위에 java.lang.Object 클래스가 있다

 

슈퍼 클래스 멤버에
접근하는 클래스 종류
슈퍼 클래스 멤버의 접근 지정자
private 디폴트 protected public
같은 패키지에 있는 클래스 X O O O
다른 패키지에 있는 클래스 X X X O
같은 패키지에 있는 서브 클래스 X O O O
다른 패키지에 있는 서브 클래스 X X O O

 


업캐스팅과 instanceof 연산자

캐스팅 ▶ 타입 변환
JAVA 캐스팅 종류: 업캐스팅, 다운캐스팅

 

업캐스팅

 

서브 클래스의 객체에 대한 레퍼런스를 슈퍼클래스 타입으로 변환하는 것을 업캐스팅(upcasting)이라고 한다.

Person p;
Student s = new Student();
p = s; 	// 업캐스팅

 

다운캐스팅

 

업케스팅의 반대, 업케스팅과 달리 명시적으로 타입 변환을 지정해야한다.

Student s = (Student) p; 	// 다운캐슽팅, (Student)의 타입 변환을 반드시 표시

 

instanceof 연산자

 

레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해 사용하는 연산자

Person p = new Student();

if(p instanceof Person) {}		// Person을 상속받은 Student 객체+업캐스팅 --> true
if(p instanceof Student) {} 		// Student 객체 --> true
if(p instanceof Professor) {}		// false

오버라이딩

메소드 오버라이딩 제약 사항
  • 슈퍼 클래스의 메소드와 동일한 원형으로 작성
  • 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위를 좁여 오버라이딩 할 수 없다 ( ex. private → public)
  • static이나 private 또는 final로 선언된 메소드는 서브 클래스에서 오버라이딩 할 수 없다.

 

동적 바인딩(dynamic binding)

실행할 메소드를 컴파일 시(compile time)에 결정하지 않고 실행 시(run time)에 결정하는 것을 말한다. 

      → 자바에서는 동적 바인딩을 통해 오버라이딩 된 메소드가 항상 실행되도록 보장한다.

 

오버로딩과 오버라이딩 비교
비교 요소 메소드 오버로딩 메소드 오버라이딩
선언 같은 클래스나 상속 관계에서
동일한 이름의 메소드 중복 작성
서브 클래스에서 슈퍼 클래스에 있는 메소드와
동일한 이름의 메소드 재작성
관계 동일한 클래스 내 혹은 상속 관계 상속 관계
목적 이름이 같은 여러개의 메소들르 중복 작성하여
사용의 편리성 향상,
다형성 실현
슈퍼클래스에 구현된 메소드를 무시하고 서브 클래스에서 새로운 기능의 메소드를 재정의 하고자 함,
다형성 실현
조건 메소드 이름은 반드시 동일하고,
매개변수 타입이나 개수가 달라야 성립
메소드 이름, 매개변수 타입과 개수,
리턴 타입이 모두 동일하여야 성립
바인딩 정적 바인딩,
호출될 메소드는 컴파일 시에 결정
동적 바인딩,
실행 시간에 오버라이딩된 메소드 찾아 호출

추상 클래스

추상 메소드(abstract method)

 

선언은 되어있으나 코드가 구현되어 있지 않은 껍데기만 있는 메소드, 이를 작성하기 위해서는 abstract 키워드와 함께 원형만 선언하고 코드는 작성하지 않는다.

public abstract String getName();
public abstract void setName(String s);

 

추상 클래스가 되는 경우
  • 추상 메소드를 포함하는 클래스
abstract class Shape {				// 추상 클래스 선언
	public Shape() {}
    public void paint() { draw() };
    abstract public void draw();		// 추상 메소드 선언
}

 

  • 추상 메소드가 없지만 abstract로 선언한 클래스
abstract class Shape {				// 추상 클래스 선언
	public Shape() {}
    public void paint() { 
    	System.out.println("paint");
    };

}

 

추상 클래스의 용도
  • 설계와 구현 분리
  • 계층적 상속 관계를 가지는 구조 만들때 적합

 


인터페이스(interface)

인터페이스: 서로 다른 하드웨어 장치들이 상호 데이터를 주고받을 수 있는 규격

 

인터페이스 특징
  • 인터페이스는 객체를 생성할 수 없다
  • 인터페이스 타입의 레퍼런스 변수는 선업 가능하다
  • 인터페이스끼리 상속된다
  • 인터페이스를 상속받아 클래슬르 작성하면 인터페이승의 모든 추상 메소드를 구현하여야 한다.

 

인터페이스 구현 → implements

 

 

반응형