minlog
article thumbnail

1.  

2. 클래스 상속

 

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

 

 

2.1.  

2.2. 💡 상속 문법

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

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

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

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

 

2.3.  

2.4. 💡 상속이 가능한 경우

 

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

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

 

 

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

 

 

 

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

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

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

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

 

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

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

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

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

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

 

 

1) 매개 변수가 없는 부모

<java />
public class 부모클래스 { private String model; private String color; //생성자 선언 public 부모클래스(){ System.out.printIn("생성자 실행") } }
<java />
public class 자식클래스 extends 부모클래스 { private int number; //생성자 선언 public 자식클래스(int number){ super(); //부모클래스 호출 this.number = number; } }

 

2) 매개 변수가 있는 부모

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

 

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

 

 

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

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

 

 

 

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

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

2.8.2. 참조변수 instanceof  클레스 

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

<java />
GeneraMember g1 = new GeneraMember("id_a", "홍길동", "서울시" , "일반"); SpecialMember bb = (SpecialMember) g1; if(g1 instanceof SpecialMember){ SpecialMember sm = (SpecialMember )g1 sm.printPoint(); }

 

 

 

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

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

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

 

 

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

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

 

 

 

 

 

 

3. 다형성이란 ?

 

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

 

 

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

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

 

 

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

<java />
ArrayList<도형> 도형리스트 = new ArrayList<도형>(); 도형 사각형 = new 사각형(); 도형 삼각형 = new 삼각형(); 도형 원 = new 원(); 도형 [] arr = {new 사각형(),new 삼각형(),new 원()}; //향상된 for문 for(도형 도형그리기 : 도형리스트){ 도형그리기.draw(); }

 

 

profile

minlog

@jimin-log

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