JAVA 자바 상속(extends),super,overriding,다형성,instanceof 개념과 적용예제

Devel/JAVA|2020. 8. 16. 17:28
반응형
#상속(extends)
-부모 만들고 자식 생성한다.
 
 
 
-is a 관계
같은 종의 비슷한 속성 및 동작을 가진 객체들 간의 관계이다.
 
-상속 특징:
- 반드시 객체간에 ‘is a’ 관계가 성립되어야 한다. 즉 , 같은 종(종류)이어야 한다. 
- 상속관계가 성립되면 하위 클래스에서는 부모 클래스의 멤버( 인스턴스 변수/ 메소드)를 선언없이 사용 가능하다. 단, 생성자와 private로 지정된 멤버는 상속이 안된다. 
- 자바는 단일 상속 ( single inheritance ) 만을 지원한다. - extends 키워드를 사용하여 상속관계를 표현한다. 
- 모든 클래스( 사용자 지정 클래스 및 API )는 계층구조인 상속관계로 되어있다. 
- java.lang.Object 클래스가 모든 클래스의 최상위 클래스이다. 결국 Object 클 래스의 멤버(인스턴스변수/메소드)는 모든 클래스에서 상속받아서 사용할 수 있다. extends 키워드로 지정하지 않은 클래스는 자동으로 extends Object가 추가된다.
 
-상속과 생성자
생성자는 상속되지 않는다.
항상 모든 클래스는 부모 객체를 먼저 생성한 후에 자신이 생성된다.따 라서 항상 Object 클래스가 가장 먼저 생성되고 나머지 클래스들이 생성된다.
 
#super(); // 인자없는 부모생성자 호출하는 형태
 
필요에 의해서 명시적으로 부모 생성자를 호출할 수도 있다. 단, 반드시 생성자 첫라인에서 사용해야 된다. 
예> super(); super(“홍길동”); super(“홍길동”, 20 ).
 
 
ex.

 
class Super{
       public int num1 = 10;
       protected int num2 = 20;
       int num3 = 30;
       private int num4 = 40;
       public int getNum4() {
              return num4;
       }
}
class Sub extends Super{
       private int num5;
       public void print() {
              System.out.println(num1);
              System.out.println(num2);
              System.out.println(num3);
              //System.out.println(num4);
              System.out.println(getNum4());
              System.out.println(num5);
              
       }
       
}
public class Ex06_4 {
       public static void main(String[] args) {
              Sub sub = new Sub();
              sub.print();
 
 
 

 
#오버라이딩(overriding)
• 부모클래스의 메서드를 자식이 입맛에 맞게 수정할 수 있다. 이렇게 부모클래스의 메서드를 자식이 수정한 메서드를 ‘오버라이딩 메소드 (overriding method)’라고 한다.
 
 
규칙:
-상속전제 
-메소드 이름이 반드시 동일 
-메소드 리턴타입이 반드시 동일 
-메소드 인자리스트가 반드시 동일 
-접근지정자는 같거나 확대만 가능 
-예외클래스는 같거나 축소만 가능
-static , final, private로 지정된 메소드는 overriding 불가.
 
cat의

pet의

       }
-오버로딩 ex.

 
class Employee{
        String name;
        int salary;
        public String getEmployee() {
                return name + "\t" + salary;
        }
        public Employee() {}
        public Employee(String name, int salary) {
                super();
                this.name = name;
                this.salary = salary;
        }
        
}
class Manager extends Employee{
        String depart;
        @Override
        public String getEmployee() {
                // TODO Auto-generated method stub
                return super.getEmployee()+"\t"+depart;
        }
        public Manager(String name, int salary,String depart) {
                super(name, salary);
                this.depart = depart;
        }
        
        
}
public class Ex06_6 {
        public static void main(String[] args) {
                Employee emp = new Employee("홍길동",2000);
                Manager man = new Manager("이순신",4000,"개발");
                System.out.println(emp.getEmployee());
                System.out.println(man.getEmployee());
        }
}
**
생성자가 없을때 jdk가 자동으로 생성자 만들어 준다.

다른 클래스에서 pet pet = new pet();을 호출 할때
public pet(){}을 자동으로 호출한다.
안적어도 적어도 문제 없다.
 
but,적지 않았을 경우,
 
개발자가 생성자를 인자 2개 받는 타입으로 적었을 경우,
인자 2개인 생성자를 계속 쓸 줄 알고 자동으로 public pet(){} 만들지 않는다.
 
cat클래스에서

부모의 default 생성자를 호출 했을 때, pet에 기본 생성자 없어 에러가 나기 때문에

기본 생성자도 같이 생성해 줘야한다.
 
#다형성  polymorphism
한가지 타입에 다른 객체를 담을 수 있다.
하나의 참조변수가 여러 다른 데이터형을 참조할 수 있는 능력 (기본형은 안됨.)
상속이 전제되고 , 형변환도 가능하다.
 

Employee, 부모클래스 변수로 자식 객체 저장이 가능하다.
부모 클래스 타입의 객체어 자식클래스 담기 가능하다.
반대는 성립하지 않음.
 
+

pet에도 printInfo가 있고 cat에도 있을 때, 출력은 어디로?
생성 부모 객체는 pet을 이용했더라도, 실제도 들어있는 cat에 속한 printinfo를 호출해서 사용한다. (상속이 전제되어 있을 경우, overriding이 되어 있는 경우)

고양이로 생성했지만, pet타입이기 때문에 pet에 들어간 변수와 상수만 사용 가능하다.
타입변환을 시켜 사용해줘야 한다.

 

 

 

+객체의 타입을 검사 해주는 것 : #instanceof
instanceof 주의점: 자식부터 부모로, 부모부터 시작 하면 안된다.

 
 

 
 
 
+배열로 만들때

 
 
 
 
 
 
 

 

댓글()
loading