본문 바로가기
개발자 :-)/Java

[Java] 상속

by 뚜생첨 2022. 9. 3.

1. 상속이란

부모클래스를 상속받은 자식 클래스는 부모클래스의 속성과 기능도 이용햘 수 있다.

 

 

2. 상속의 필요성

기존의 검증된 class 를 이용해서 빠르고 쉽게 새로운 class 를 만들 수 있다.

재사용 → 효율적이고 개발시간 단축

 

3. 상속 구현

extend 키워드를 이용해서 상속을 구현한다.

 

//부모클래스
package javaLec;

public class ParentClass{
	public ParentClass(){
    	System.out.println("부모클래스");
    }
    
    public void parentRun(){
    	System.out.println("부모클래스 Run");
    }
}
//자식 클래스
package javaLec;

public class ChildClass extends ParentClass{  		//부모클래스를 상속할때는 extends키워드 사용
	public ChildClass(){
		System.out.println("자식클래스");
    }
    
    public void ChildRun(){
		System.out.println("자식클래스 Run()");
    }
}
//main
ChildClass child = new ChildClass();
child.parentRun();  			//부모클래스의 메소드 실행
child.childRun();			//자식클래스의 메소드 실행

//실행 결과
부모클래스		//부모클래스 생성자먼저 실행
자식클래스		//자식클래스 생성자 실행
부모클래스 Run
자식클래스 Run()

자바에서는 하나의 클래스만 상속 가능하다!

 

4. 부모 생성자 호출

여러 상속 관계가 있다면 가장 상위 클래스부터 생성된다

ex) 자식클래스를 생성하면

      할아버지class 생성 -> 아버지 class 생성 -> 자식 class 생성

 

근데 객체는 생성자를 호출해야 생성되는데 상위 객체는 어떻게 생성될까?

명시적으로 생성자 선언을 하지 않았다면 (개발자가 별도로 선언) 컴파일러가 알아서 기본 생성자를 생성해서 호출한다.

자식클래스를 생성할 때, 

부모클래스의 생성자 선언은 자식 클래스의 생성자 선언 내부에 맨첫줄에 super();라고 생성됨

public class ChildClass extends ParentClass{
	public ChildClass(){
    	super(); 
   	}
    
    public ChildClass(int name){ 		//생성자를 별도로 선언해주었다면
    	super(name);				//부모생성자를 호출하는 부분도 필요!!!
	}
}

* 컴파일러는 기본 생성자만 생성해주니 매개변수가 있는 생성자(명시적 생성자)는 super(매개변수);를 선언해 주어야한다

 

 

5. 부모 클래스의 private 접근자

자식클래스는 부모 클래스의 모든 자원을 사용할 수 있지만, private 접근자의 속성과 메서드는 사용할 수 없다.

 

6. 메서드 오버라이드(Override)

부모클래스의 기능을 자식클래스에서 재정의해서 사용한다.

//부모클래스
package javaLec;

public class ParentClass{
	public ParentClass(){
    	System.out.println("부모클래스");
    }
    
    private void parentRun(){
    	System.out.println("private 부모클래스 Run");
    }
    
    public void makeFood(){
		System.out.println("부모클래스에서 음식만들기");
    }
}
//자식 클래스
package javaLec;

public class ChildClass extends ParentClass{  		//부모클래스를 상속할때는 extends키워드 사용
	public ChildClass(){
		System.out.println("자식클래스");
    }
    
    private void ChildRun(){
		System.out.println("자식클래스 Run()");
    }
    
    @Override
    public void makeFood(){
		System.out.println("자식클래스에서 음식만들기");
    }
}
//main
ChildClass child = new ChildClass();
child.makeFood();


//실행결과
자식클래스에서 음식만들기

자식클래스에서 재정의할 때 @Override 어노테이션을 붙여주면 더 명확함

 

7. 자료형(타입)

기본 자료형처럼 클래스도 자료형이다.

ParentClass childs[] = new ParentClass[2];
childs[0] = new FirstChildClass();
childs[1] = new SecondChildClass();

for(int i = 0; i<2; i++){
	childs[i].makeFood();
}

각 자식클래스에서 재정의한 함수를 실행하게된다.

하위 클래스의 객체를 생성할 때 상위클래스의 자료형으로 명시해도 된다.

//원래는
FirstChildClass fc = new FirstChildClass();
SecondChildClass fc = new SecondChildClass();

//상위클래스로 객체를 생성하게되면
ParentClass fc = new FirstChildClass();

상위클래스로 객체를 생성했을 때 장점

서로다른 클래스의 데이터타입을 통일시키고 배열로 관리할 수 있다.

근데 문제는 java에서는 상위클래스 타입으로 객체를 생성하면 자식클래스에만 생성한 메서드는 호출할 수 없다.

(컴파일러가 상위 클래스에서 먼저 메서드가 있는지 확인 → 하위 클래스에 있는지 확인)

실제 인스턴스의 자료형과는 관계없이 상위클래스에 정의된 메서드만 호출가능하다

 

역으로 

Child p = new Parent();

또는
Parent p = new Child();
Child ch = (Child)p;		//Parent인 p 를 강제로 Child로 형변환하는것

이러한 객체 생성은 컴파일 에러가 발생한다.

(작은 그릇에 큰그릇을 담으려고 하는 것과 같다)

 

8. Object 클래스

모든 클래스의 최상위 클래스는 Object 클래스이다.

그러므로 데이터타입을 Object 타입으로 맞춰줄 수 있다.

① toString()

  해당 인스턴스에 대한 정보를 문자열로 반환(클래스이름@주소);

② equals() 

true, false 를 반환한다.

Car car1 = new Car();
Car car2 = new Car();

if(car1.equals(car2)){
	System.out.println("두 객체가 같다");
}else{
	System.out.println("두 객체가 다르다");
}

car1과 car2는 서로 다른 객체를 가리키는 참조변수이므로  (두 객체의 주소값은 다름!)

출력결과는 "두 객체가 다르다"

③ clone()

해당 인스턴스를 복제하여 새로운 인스턴스로 반환.

Car car01 = new Car();
Car car02 = (Car)car01.clone();

단, 필드 값만 복사할 수 있고, 배열이나 인스턴스이면 제대로 복제 안됨.

(ArrayList<String> tmp = new ArrayList<String>();)

데이터 보호때문에 Cloneable 인터페이스를 구현한 클래스만 복제 가능

 

9. super 클래스

상위클래스를 호출할 때 super 키워드를 이용한다.

 

public class ParentClass{
	int openYear = 1994;
}

public class ChildClass{
	int openYear = 2005;
    
    public void getOpenYear(){
    	System.out.println("ChildClass : " + this.openYear);
        System.out.println("ParentClass : " + super.openYear);
    }
}

 

728x90
반응형

'개발자 :-) > Java' 카테고리의 다른 글

[Java] 인터페이스  (0) 2022.09.03
[Java] 내부클래스와 익명클래스  (0) 2022.09.03
[Java] 데이터 은닉  (0) 2022.09.03
[Java] 클래스 로더(Class Loader)  (0) 2022.09.03
[Java] 패키지와 static  (0) 2022.09.02

댓글