JAVA

[JAVA #7] 8. 상속(Inherit)

lyndaa 2023. 2. 28. 17:31
  • 상속
    • 다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능
      • 목적
        • 클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약 정의
      • 장점
        • 보다 적은 양의 코드로 새로운 클래스 작성 가능
        • 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이
        • 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여
  • 상속의 특징
    • 모든 클래스는 Object 클래스의 후손
      • Object 클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 간능
    • 부모클래스의 생성자,  초기화 블록은 상속안됨
      • 자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
      • 자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶으면 super() 활용
    • 부모의 private 멤버는 상속은 되지만 직접 접근 불가
      • 자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가
      • super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나 setter, getter 메소드를 이용하여 접근
  • 상속 방법과 표현식
    • 방법
      • 클래스 간의 상속 시에는 extends 키워드 사용
    • 표현식
      • [접근제한자] class 클래스명 exxtends 클래스명{}
  • 단일 상속과 다중 상속
    • 단일 상속(Single Inheritance)
      • 클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성
      • 자바에서는 다중 상속 미지원 -> 단일상속만 지원
    • 다중 상속(Multiple Inheritance)
      • c++에서 가능한 기능 여러 클래스로부터 상속을 받으며 복합적인 기능을 가진 클래스를 쉽게 작성 가능
      • 서로 다른 클래스로부터 상속 받은 멤버 간의 이름이 같은 경우 문제 발생
  • super()와 super.
    • super()
    • super.
  • 오버라이딩(Overriding) / 오버로딩 -> 하나의 클래스 동일 이름 메소드 여러개 만들 수 있음
    • 재정의
    • 상속 시 자식 클래스에서 구현
    • 자식 클래스가 상속 받은 부모 메소드를 재작성 하는 것
    • 부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미로 자식 객체를 통한 실행 시 후손 것이 우선권을 가짐
      • 특징
        • 메소드 헤드라인 위에 반드시 Annotation(골뱅이), @Override 표시
        • 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 간능
        • 부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정 가능
      • 성립 조건
        • 부모 클래스의 메소드와 자식 클래스의 메소드 비교
          • 메소드 이름 동일
          • 매개변수의 개수, 타입 동일
          • 리턴 타입 동일
          • private 메소드 오버라이딩 불가
    • final 예약어
      • final 클래스
        • 상속이 불가능한 클래스
      • final 메소드
        • 상속 시 오버라이딩이 불가능한 메소드
    • 대상에 따른 사용 가능한 제어자, 예약어
      • 클래스 : public, (default), final, abstract
      • 메소드 : 모든 접근 제어자, final, abstract, static
      • 변수 : 모든 접근 제어자, final, static
      • 지역변수 : final

* 오버라이딩 실습

package com.inherit.part02_override;

public class Run {
	public static void main(String[] args) {
		Book b1 = new Book("수학의 정석","이창진",100);
		Book b2 = new Book("이것이 자바다","홍길동",200);
		
		System.out.println("b1="+ b1); //자동으로 .tostring()으로 처리
		System.out.println("b2="+ b2);
		
		System.out.println(b1.equals(b2));
		
		Book b3 = b1;
		System.out.println(b1.equals(b3));
		
		Book b4 = new Book("수학의 정석","이창진",100);
		System.out.println("b1과 b4는 같은 객체? "+b1.equals(b4));
		
		System.out.println(b1.hashCode());
		System.out.println(b4.hashCode());
		
		
	}
}
package com.inherit.part02_override;

public class Book {
	private String title;
	private String writer;
	private int price;
	
	public Book() {}

	public Book(String title, String writer, int price) {
		super();
		this.title = title;
		this.writer = writer;
		this.price = price;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
	
	@Override
	public String toString() {
		return title+", "+writer+", "+price;
	}
	@Override
	public boolean equals(Object obj) {
		//객체의 주소가 같으면 같은 객체
		if(this == obj) {
			return true;
		}
		//전달받은 객체가 null인 경우 무조건 다른 객체
		if(obj==null) {
			return false;
		}
		
		Book other = (Book)obj;
		//전달받은 객체의 필드값과 비교하여 같은지 판단
		if(title == null) {
			if(other.title != null) {
				return false;
			}
		}else if(!title.equals(other.title)) {
			return false;
		}
		
		if(writer == null) {
			if(other.writer != null) {
				return false;
			}
		}else if(! writer.equals(other.writer)) {
			return false;
		}
		if(price != other.price) {
			return false;
		}
		
		return true;
	}
	
	@Override
	public int hashCode() {
		return (title+writer+price).hashCode();
		
	}
	
}

'JAVA' 카테고리의 다른 글

[Java 실습 #8] 9. 다형성  (0) 2023.03.02
[JAVA #8] 9. 다형성(Polymorphism)  (1) 2023.03.02
[JAVA #7] 7. 객체 배열  (0) 2023.02.28
[JAVA #6] 6. 객체  (0) 2023.02.27
[JAVA 실습 #5] 5. 2차원 배열  (0) 2023.02.26