JAVA Study

[JAVA] 상속(Inheritance)

영하10도 아아 2024. 4. 4. 21:36

 

상속(Inheritance)

 

-기존 클래스로 새로운 클래스를 작성하는 것.(코드의 재사용)

두 클래스를 부모와 자식으로 관계를 맺어주는 것.

 

-자손은 조상의 모든 멤버를 상속받는다(생성자,초기화블럭 제외)

-자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다)

class Parent{

int age;

}



class Child extends Parent{ }

 

-자손의 변경은 조상에 영향을 미치지 않는다.

Class Parent{
	int age;
}

class Child extends Parent{
	void play(){
    System.out.println("놀자~");
    	}
    }

 

Class Point {	//부모
int x;
int y;
}

class Point3D() extends Point{	//x,y를 포함한 3개의 값이 된다.
int z;
}

 

 

<포함관계>

 

>포함(composite)이란?

 

-상속과 비슷하게 클래스를 재사용할 수 있는 방법이다. 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것이다.

즉 클래스의 속성 값에 다른 클래스를 선언하여 사용하는 것이다.

//포함관계 예시 코드

class Point {
int x;
int y;
}

class Circle {
Point c = new Point();	//원점
int r;	//반지름(radius)

}

 

상속관계 : ~은 ~이다.(is-a)

포함관계 : ~은 ~을 가지고 있다.(has-a)

 

 

<단일 상속(Single Inheritance)>

-java는 단일상속만을 허용한다.(C++은 다중상속 허용)

 

*다중상속의 문제점

>같은 이름의 다른 내용을 가진 메서드를 상속 받을 때,  하나를 정할 수 없고 충돌이 일어나게 된다.

이러한 충돌문제와 다중상속의 효과를 얻기 위해 인터페이스라는 기능이 생겼다..(나중에 자세히 설명)

 

*그럼에도 다중상속의 기능이 필요하다면, 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

>객체를 생성하여 객체로 접근하여 사용하면 된다.(포함관계)

 

<Object 클래스 - 모든 클래스의 조상>

-부모가 없는 클래스는 자동적으로 object 클래스를 상속받게 된다.(눈에 보이지는 않지만 아무튼 있음...ㅋㅋ)

-모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다.

toString(), equals(Object obj), hashCode()...등

class Tv{	//Object를 상속받았지만 보이지 않는 상태
//...
}

class SmartTv extends Tv{
//...
}


class Tv extends Object {	//컴파일러 자동추가..(원래는 이런 구조임)
//...
}

class SmartTv extends Tv {
//...
}

 

 

<오버라이딩(overriding)>

 

-상속받은 조상의 메서드를 자신에 맞게 변경하는 것

선언부는 변경이 불가하고, 구현부를 변경하여 사용한다.

class Point{
int x;
int y;

String getLocation(){
return x+y;
}
}

class MyPoint3D extends MyPoint3{
int z;
}

public class OverrideTest{
public static void main(String[] args){
		MyPoint3D p = new MyPoint#d();
        p.x = 3;
        p.y = 5;
        p.z = 7;
        System.out.println(p.getLocation());
        }
}

 

 

<오버라이딩의 조건>

1. 선언부가 조상 클래스의 메서드와 일치해야한다.

2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

 

<오버로딩 vs 오버라이딩>

 

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change,modify)

 

 

<추상 클래스>

-클래스들의 공통적인 필드와 메소드를 추출해서 선언한 클래스를 말한다.

 

우선 추상클래스는 일반적인 클래스와 동일하게 멤버변수와 메서드를 갖습니다. 그리고 추가적으로 '추상메서드'를 갖는다.

추상 메서드는 메서드의 선언부만 존재하고 구현코드가 없는 아래와 예와 같은 메서드를 말한다.

public String getUserName(int idx);

 

구현부가 없는 메서드를 단 하나라도 가진 클래스는 추상 클래스가 된다

추상 클래스가 되면 new 키워드를 사용하여 인스턴스화 할 수 없습니다. 즉, 클래스를 쓸 수 없다.

 

추상 클래스를 사용하는 경우
  • 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 멤버 통합을 할때
  • non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
  • 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
  • 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.

 

<인터페이스>

 

-인터페이스란, 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 바로 인터페이스의 역할이자 개념이다.

자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다.

 

다시 말해 구현된 여러 객체의 동일한 기능을 보장할 때 인터페이스를 사용하게 된다.

 

 

 

위의 그림에서 Turtle,Pigeon은 공통의 부모인 Animal을 상속받고 있고, Jan과 동일한 기능을 구현하기 위해

Swimable 인터페이스를 사용하고있다.

 

이처럼 공통의 부모를 두어야 한다면 추상클래스를 만들어 상속받은 뒤 기능을 확장 시키면 된다.

 

 

 

<다형성>

 

-다형성이란 같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질을 의미한다.

이를 통해 조상 클래스의 참조 변수로 자손 클래스의 참조 변수를 다루거나, 동일한 이름을 같은 여러 형태의 메소드를 만들 수 있다.

 

 

 

 

 

 

 

 

 

'JAVA Study' 카테고리의 다른 글

[JAVA] 컬렉션 프레임워크  (0) 2024.04.16
[JAVA]예외 처리  (0) 2024.04.11
[JAVA]중첩 클래스  (0) 2024.04.11
스터디 1회차 - 클래스  (0) 2024.04.02