minlog
article thumbnail

 

클래스 상속

 

  • 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현
  • 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속함
  • 이미 개발된 클래스를 재사용, 중복코드를 줄여준다.
  • 부모(상위)클래스의 필드나 메서드는 자식(하위)클래스의 소유로 사용할 수 있다.
  • 자바의 다형성을 보여준다.
  • 상속은 클래스간의 결합도가 높은 설계

 

 

 

💡 상속 문법

public class 자식클래스(현재 파일 클래스 명) extends 부모클래스 { }

※ extends 키워드 뒤에는 단 하나의 클래스만 올 수 있음

= 자식은 한명의 부모로 부터만 상속이 가능하다.

= 자바는 단일 상속(single inheritance)만을 지원함

 

 

💡 상속이 가능한 경우

 

클래스 상속 ⇒ 트럭은 차이다. ⇒  YES

클래스 상속 ⇒ 사람은 차이다. ⇒  NO 

 

 

  • 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가짐
  • 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가짐
  • 하위 클래스가 상위 클래스의 속성과 기능을 확장 (extends)한다는 의미

 

 

 

💡 자식클래스를 사용할때, 부모클래스의 필드(변수)와 메서드 사용이 가능한 이유?

자식을 호출하면 부모가 먼저 호출된다!

모든 객체는 생성자를 호출해야지 생성이 된다.

부모 클래스는 자식클래스 생성자의 맨 첫줄에 숨겨진 super() 에 의해 호출된다.

 

※ super() 는 하위 클래스에서 가지는 상위 클래스에 대한 참조 값이다.

상위 클래스의 기본 생성자를 호출하는데, 코드에 적지 않아도 defult로 생성된다.

super에서 상위 클래스의 인스턴스 참조값을 가지므로 상위 클래스의 메서드나 멤버 변수에 접근할 수 있다.

- 모든 클래스에 디폴트 생성자가 꼭 필요한 이유이기도 하다. 

만약 부모 클래스에 디폴트 생성자가 없다면 부모 클래스를 불러올 수 없다.

 

 

1) 매개 변수가 없는 부모

public class 부모클래스 { 
	private String model;
	private String color;

	//생성자 선언
	public 부모클래스(){
		System.out.printIn("생성자 실행")
	}

}
public class 자식클래스 extends 부모클래스 { 
	private int number;

	//생성자 선언
	public 자식클래스(int number){
		super(); //부모클래스 호출
		this.number = number;
	}

}

 

2) 매개 변수가 있는 부모

public class 부모클래스{ 
	private String model;
	private String color;

	//생성자 선언
	public 부모클래스(String model,String color){
		System.out.printIn("생성자 실행")
	}

}

 

public class 자식클래스 extends 부모클래스 { 
	private int number;

	//생성자 선언
	public 자식클래스(int number){
		super(매개값, 매개값, .....); //부모클래스 호출
		this.number = number;
	}

}

 

 

💡업 캐스팅 ( Up Casting ) - 형 변환

부모클래스 vc = new 자식클래스();
  • 상위 클래스의 변수에 하위 클래스 생성자로 인스턴스를 생성 할수 있다. 
  • 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능하다.
  • 상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업캐스팅)이 가능하며 반대로는 불가능하다
  • 부모 클래스로 형 변환 된 자식 클래스는 부모클래스의 변수와 메서드만 사용 가능하다. (*오버라이딩 된 메서드 제외)

 

 

 

💡다운 캐스팅 ( Down Casting ) - 형 변환

※ 참조 변수가 클레스를 참조하고 있는지 확인하고 형변환을 해주어야 안전하다.

참조변수 instanceof  클레스 

원래 인스턴스의 형이 맞는지 여부를 체크하는 키워드 맞으면 true 아니면 false를 반환한다.

GeneraMember g1 = new GeneraMember("id_a", "홍길동", "서울시" , "일반");
SpecialMember bb = (SpecialMember) g1;

if(g1 instanceof SpecialMember){
	SpecialMember  sm = (SpecialMember )g1
	sm.printPoint();
}

 

 

 

💡 자식 클래스에서 부모 클래스의 메서드 오버라이딩 (Overring)

상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우, 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있다.

@overriding 어노테이션을 사용하여 재정의된 메서드라는 정보를 제공할 수 있다.

 

 

자식 클래스가 부모클래스로 형변환이 되어도 오버라이딩 된 자식 클래스의 메서드는 사용이 가능한 이유?  자바의 모든 메서드는 가상 메서드 이다.  

가상 메서드 테이블(vitual method table)에서 해당 메서드에 대한 주소값을 가지고 있는데, 오버라이딩으로 재정의 된경우 재정의되어진 메서드의 주소를 가르킨다. 

 

 

 

 

 

 

다형성이란 ?

 

  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것이다.
  • 같은 코드에서 여러 다른 실행 결과가 나올 수 있다.
  • 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징이다.
  • 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.

 

 

💡 다형성을 사용하는 이유?

  • 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있다.
  • 다형성이 없는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워진다.
  • 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현할 수 있다.
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있다.

 

 

※ 도형이라는 부모 클래스로 모든 자식 클래스를 핸들링 할수 있다.

ArrayList<도형> 도형리스트 = new ArrayList<도형>();
도형 사각형 = new 사각형();
도형 삼각형 = new 삼각형();
도형 원 = new 원();

도형 [] arr = {new 사각형(),new 삼각형(),new 원()};

//향상된 for문
for(도형 도형그리기 : 도형리스트){
	도형그리기.draw();
}

 

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!