본문 바로가기
방통대/Java

4-2 상속

by 꿈꾸는 몽나 2024. 3. 15.
728x90

1. 클래스의 재사용

-합성

: 기존 클래스를 새로운 클래스 정의에서 데이터 필드의 자료형으로 사용

: "has-a" 관계

ex) calss Line { Point begin, end; ... }

 

-상속

: 기존 클래스(부모)를 사용하여 새로운 클래스(자식)를 정의

: 코드의 중복 작성을 줄이고 프로그램의 확장성이 좋아짐

: 상속은 기존 클래스를 확장 or 특화하는 것

: 자식 "is-a" 부모의 관계

 

 

 

 

2. 클래스의 상속

-상속은 부모 클래스와 자식 클래스 간의 관계

: 자식 클래스가 부모 클래스의 필드와 메소드를 상속 받음

: 기존 클래스를 상속받을 때 키워드 extends를 사용함

ex) class Manager extends Employee {...}

// 자식 : Manager

// 상속 : extends

//  부모 :  Employee

: 자식 클래스에서 상속받은 메소드를 재정의(오버라이딩)할 수 있음

 

-클래스의 상속은 단일 상속만 가능

: 인터페이스 상속의 경우는 다중 상속 가능

 

ex)

 

// 접근제어자 때문에 오류 발생

// 오류를 발생시키지 않으려면 sub.setPrivate(40);으로 출력해야 함.

 

 

 

3. 메소드 오버라이딩

: 부모로부터 상속받은 메소드의 몸체를 자식 클래스에서 재정의 하는 것

: 부모와 자식에서 같은 이름의 메소드가 다른 기능을 수행하게 됨

 

-오버라이딩 방법

: 메소드의 이름, 인자의 개수와 자료형, 반환형이 같은 메소드를 정의

: 단, 반환형은 서브 타입(상속 관계에서 자식 클래스)도 가능함

: 접근 제어자의 가시성(접근 범위)은 같거나 커져야 함

-> protected인 경우, protected 또는 public이 가능

-> public인 경우, public만 가능

 

ex)

// Shape 클래스를 상속받은 자식 클래스 Triangle

// Triangle 클래스는 Shape클래스의 getArea()메소드를 상속받아 사용할 수 있다.

// Triangle 클래스에서 Shape 클래스의 h * w를 h * w * 0.5로 재정의.

// Main클래스에서 Triangle()객체 생성

// Triangle()객체는 Shape클래스의 getArea()메소드와 Triangle 클래스의 getArea()메소드 둘 다 사용 할 수 있다.

// t가 가리키는 실제 유형이 Triangle 객체이기 때문에 Triangle의 getArea()를 사용한다.

 

// Shape 클래스. 즉, 부모유형의 변수는 자식 유형의 객체도 가질 수 있다.

 

 

 

4. this

: 메소드 호출 시, 숨은 인자로 this가 메소드에 전달됨

-> this는 현재 객체에 대한 참조값을 가지고 있음

-> c1.display()과 c2.display()의 결과가 다른 이유임

 

: 인스턴스 메소드나 생성자에서 필드를 참조하거나 메소드를 호출할 때 사용 가능(생략 가능함)

* this.필드이름

* this.메소드이름(인자)

 

ex)

 

 

 

5. super

: this와 같으나 자료형이 부모 클래스 유형임

: 자식 클래스의 인스턴스 메소드나 생성자에서 사용됨

-> this와 마찬가지로 static 메소드에서는 사용할 수 없음

: 부모 클래스에서 오버로딩 당한 메소드를 호출하거나 상속되었으나 감춰진 필드에 접근할 때 필요함

* super.필드이름

* super.메소드이름(인자)

 

ex)

// this와 super의 차이점

// super.f();의 값은 CSuper. this.f();의 값은 CSub.

 

 

 

6. this와 super의 사용 예

// sub 객체는 x가 2개가 존재한다.

// 부모 클래스에서 상속 받은 x = 100.0

// 자식 클래스의 x = 10.0

 

 

 

7. 상속과 생성자

- this()

: 같은 클래스의 다른 생성자를 호출하는 것

 

- super()

: 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출하는 것

->상속받은 데이터 필드를 초기화하기 위해 사용

->자식 클래스의 생성자 몸체에서 부모 클래스 생성자의 명시적 호출이 없다면, 인자가 없는 생성자인 super()가 자동 호출

: this()와 super()는 생성자 몸체의 맨 앞에 위치해야 함

 

ex)

// Main 클래스의 Cylinder(3, 10)으로 radius=3, h=10

 

 

 

9. 메소드 체이닝

: 하나의 명령문에서 동일 객체에 대해 연속적으로 메소드 호출을 하는 프로그래밍 기법

-> 메소드 체이닝에 사용되는 메소드는 현재 객체의 참조값(this)을 반환해야 함

: 메소드 체이닝은 프로그램의 가독성을 향상시키고, 코딩을 단순화 함

 

ex)

p.estName("홍길동").setAge(30).setAddress("서울");

 

 

ex2)

// getName() : name을 받아 옴.

// setName() : name값을 설정 or 변경 함.

// String name이 2개이기 때문에 this를 써서 첫 번째 name을 가져 온다.

// 만약, setName(String s)였다면 this.name=s;에서 this 생략 가능.

 

// 차이점

// setName에서 현재객체 return. 따라서 반환형은 People.

// p.setName("홍길동")에서 this를 return하기 때문에 결과적으로 p가 리턴 됨.

// 그런식으로 p.setAge(), p.setAddress()로 메소드 체이닝이 이루어짐

 

 

 

728x90