1. Inherite[상속]

  1. [상속?]
    1. 부모클래스의 메서드변수같은 멤버와 자원을 자식 클래스가 사용할 수 있음
    2. 다중 상속을 지원하지 않는 대신 객체의 명확성을 높였음
    3. 중복된 코드를 줄이고 코드의 재사용성을 높여 유지보수가 편리
      1. 부모클래스
        1. Parent Class
        2. Base Class
        3. Super Class
        4. 상위 Class
      2. 자식클래스
        1. Children Class
        2. 후손 Class
        3. Sub Class
        4. 하위 Class
      • [상속받을 시]
        • 부모 클래스의 필드메서드와 같은 멤버등 물려받음
      • [유의]
        • 접근제어자가 private를 가지고 있는 멤버는 불가능함
        • 부모클래스와 패키지가 다를 경우 접근제어자가 default인 멤버도 상속을 받을 수 없음!
  2. [상속형식]
    1. 항상 자식 클래스 뒤extends부모 클래스명시해줘야함

    2. [예제]

      // 자식 class
      class 자식 클래스명 extends 부모 클래스명 {
      
      }
      
      // ex) child, paraents
      class child extends parents {
      
      }
      
    3. 하나의 자식 클래스가 여러개의 부모 클래스를 만드는 다중 상속은 불가하며 자식 클래스는 1개의 부모 클래스를 가지는 단일 상속만 가능하고, 부모 클래스여러개의 자식 클래스를 가질 수 있음!

2. Override[오버리이딩]

  1. [설명]

    1. 부모 클래스에서 정의된 메서드를 자식 클래스에서 메서드의 동작을 재정의하여 사용할 수 있다는 의미를 말함
  2. [규칙]

    1. 부모 클래스메서드의 리턴타입동일하게 해야함

    2. 메서드의 매개변수가 동일해야함

    3. 접근지정자동일하거나 더 큰 범위만 가능

    4. 부모 클래스메서드보다 더 큰 범위의 예외를 선언 할 수 없음

    5. static, final, private 지정자를 가진 메서드는 오버라이딩이 불가능

    6. [예제]

      // 부모 Class
      class Parents {
      	public void print() {
      		System.out.println("부모 클래스 메서드!");
      	}
      }
      
      // 자식 Class
      class Child {
      	public void childRead() {
      		// override가 되었기에 자식 클래스의 print가
      	  // 호출됨!
      		this.print(); // "자식 클래스 메서드!"
      		
      	}
      
      	@Override // 어노테이션
      	public void print() {
      		System.out.println("자식 클래스 메서드!");
      	}
      }
      
  3. [super?]

    1. [설명]
      1. 부모클래스로부터 상속받은 멤버변수나 메서드를 자식 클래스에서 참조할때 사용하는 reference변수
      2. 부모클래스와 자식 클래스멤버의 이름이 같을 경우 super를 사용하여 부모 클래스의 멤버에 접근할 수 있음
      3. 인스턴스 메서드에만 사용이 가능하며 클래스 메서드에는 사용불가함
      4. thissuper인스턴스 주소값을 저장하는데 static 메서드와는 상관없이 사용이 가능
  4. [Super()?]

    1. [설명]
      1. 부모 클래스의 생성자를 호출 할때 사용함

      2. 자식클래스의 인스턴스를 생성하면 부모 클래스의 모든 멤버까지 포함

      3. 자식클래스에서 부모 클래스의 멤버를 사용하기 위해서는 부모 클래스의 멤버를 먼저 초기화 해줌

      4. 부모 클래스의 멤버를 초기화하기 위해서는 부모 클래스의 생성자를 자식 클래스의 생성자 첫줄에서 호출해야함

      5. 부모클래스 호출상속관계에 따라 객체 클래스까지 거슬러 올라가기도 함

      6. 객체 클래스를 제외한 부모 클래스의 생성자를 명시적으로 호출하지 않으면 자식 클래스의 생성자 첫 줄에 자동으로 super()를 추가하여 실행함

      7. 클래스에 생성자가 하나도 정의되지 않았을때만 자동으로 디폴트 생성자를 호출함

      8. 디폴트 생성자 이외의 다른 생성자를 사용할 경우 디폴트 생성자도 명시적으로 정의해야 컴파일 오류가 나지 않음

      9. [예제]

        // 매개변수를 가지는 생성자 선언시 
        // 디폴트 생성자도 명시적으로 선언함
        class Parent {
        	Parent() {
        		name = "기본값";
        	}
        	
        	Parent(String str) {
        		name = str;
        	}
        }
        
        // 상속관계인 클래스에 super를 이용함
        class Parent {
        	Parent() {
        		name = "기본값";
        	}
        
        	Parent(String str) {
        		name = str;
        	}
        }
        
        class Child extends Parent {
        	Child() {
        		super("자식"); // 부모클래스 생성자 호출
        	}
        	
        	Child(String name) {
        		super(name);
        	}
        }
        
        // 부모 클래스의 디폴트 생성자를 먼저 호출
        Child ch1 = new Child();
        Chile ch2 = new Child("자식");