본문 바로가기
JAVA

상속

by 융디's 2024. 3. 31.
728x90
상속

상속

@2024.03.26

상속

💡
부모 클래스로부터 필드와 메서드를 물려받아, 새로운 클래스를 만드는 것


@기본형식

[접근제한자] [abstract | final] class 클래스명 extends 부모클래스명{
}
  • A는 B이다 라고 표현할 수 있다면 상속관계
    • A는 B의 종류 중 하나다 → 일반화 시킨 것
    • 상속 = 일반화 + 확장
  • [abstract | final] → 클래스가 추상 클래스인지 또는 클래스가 더 이상 상속될 수 없는지
  • 단일 상속만 가능
  • 부모가 가지고 있는 것은 자식은 자유롭게 사용이 가능
  • 아무것도 상속을 받지 않으면 자동으로 java.lang.Object를 상속

    모든 클래스는 Object의 자손!
  • 필드는 타입을 따라가고, 메서드는 오버라이딩된 자식의 메서드가 실행

객체 묵시적 타입 변환

💡
부모 타입은 자손 타입을 참조할 수 있다
⇒ 조상은 자손을 가리킬 수 있다.


@기본 형식

부모타입 부모참조변수 = new 자식생성자(); ⇒ 다형성

Parent parent = new Chlid();
  • 부모타입이 자식을 가리킨것 → 자식안에 부모가 물려준 것만 접근 가능!
    • 부모 타입에 선언된 필드와 메소드만 사용 가능
    • 자식이 선언한 메소드, 필드는 사용 불가능

    ⇒ 사용하려면 강제 형변환이 필요!

객체 강제 타입 변환

💡
부모 타입을 자식 타입으로 변환하는 것으로, 자식 타입에 선언된 필드와 메서드를 다시 사용해야 하는 경우에 수행
  • 강제 형 반드시 instanceof 연산자를 사용하여 어느 객체 타입인지 확인해야 한다!
    • ClassCastException 예외 발생 가능
    • 이 매개변수가 참조하는 객체가 자식 클래스냐?
    • 위에 그림을 참고하여 instanceof 결과 추측
      Object obj = new Chlid();
      //obj가 Child의 인스턴스인가?
      System.out.println(obj instanceof Chlid); // true : Chlid로 형 변환 가능 
      System.out.println(obj instanceof Parent);// true : Parent로 형 변환 가능
      System.out.println(obj instanceof Object);// true : Object로 형 변환 가능
      //Child안에 본인, Parent, Object가 존재하기 때문 

생성자 오버 로딩

  • this() 생성자 : 자기 자신의 생성자를 말하며, 생성자 안에서만 사용 가능하다.
    • 코드 중복을 피하고 재 사용성이 높음
    • super() 생성자를 호출하는 코드 다음이나, 첫 번째에 위치해야 한다.
    • 방법 1
    public class Car {
        private String brand; //브랜드
        private String model; //모델
        private int year; //연식
        
        //한개의 인자를 받는 생성자
        public Car(String brand){
            this.brand = brand;
        }
        // 3개의 인자를 받는 생성자
        public Car(String brand, String model, int year){
            this(brand); // 하나의 String타입을 인자로 받는 첫번째 생성자 호출후 값 초기화  
            this.model = model;
            this.year = year;
        }
    }
    • 방법 2
    public class Car {
        private String brand; //브랜드
        private String model; //모델
        private int year; //연식
        
    	  // 3개의 인자를 받는 생성자
        public Car(String brand, String model, int year){
            this.year = year;
            this.model = model;
            this.year = year;
        }
        //한개의 인자를 받는 생성자
          public Car(String brand){
            // 다른 생성자를 호출하여 첫번째 인자에만 값을 설정 
            this(brand,"현대",2024); 
        }
    }

  • super() 생성자 : 부모 클래스가 기본 생성자를 가지고 있지 않다면, 사용자는 반드시 직접 super() 생성자를 호출하는 코드를 작성해야 한다!!
    • 자식은 부모을 상속받기 때문에, 부모가 먼저 있어야 자식도 있다.
    • 따라서 자식 객체를 생성할 때는 부모 클래스의 생성자가 호출되어 초기화되고, 그 후에 자식 클래스의 생성자가 호출되어 초기화된다.
    public class Car{
    	private String name;
    	private String year;
    	//기본생성자 존재 x
    	public Car(String name, String year){
    		this.name = name;
    		this.year = year;
    	}
    }
    
    public class Bus extends Car{
    	private String name;
    	private String year;
    	private String color; 
    	//테스트 해보기 
    	public Bus(String name, String year, String color){
    		//부모클래스에 기본 생성자가 없으므로, 오버로딩된 생성자 호출
    		// 부모 클래스의 생성자를 전달받은 매개변수로 초기화 
    		super(name, year);
    		// 아래 코드부터 자식 필드 초기화 
    		this.name = name;
    		this.year = year;
    		this.color = color;
    	}
    }

728x90

'JAVA' 카테고리의 다른 글

불변 클래스  (0) 2024.04.22
메서드 오버라이딩  (0) 2024.03.31
객체지향 프로그래밍  (0) 2024.03.31
메서드 오버 로딩  (0) 2024.03.31
클래스  (0) 2024.03.31