본문 바로가기
혼공단/혼공자

혼공자 - 4주차

by 珠延 2024. 1. 29.

Chap 7-1 상속

상속

- 부모 클래스(상위 클래스)를 자식 클래스(하위,파생 클래스)에게 물려주는 것
- 자신 클래스는 상속을 통해 부모 클래스를 이용할 수 있다.
- 이미 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여주고
- 유지 보수 시간을 최소화할 수 있다.

 

클래스 상속

자식 클래스에서 부모 클래스를 상속하는 법

class 자식클래스 extends 부모클래스{
	//extends를 하여 부모클래스로부터 상속시킴
}
  • 여러 개의 부모 클래스를 상속할 수 없다. (다중 상속x)
  • extends 뒤에는 단 하나의 부모 클래스만 와야 한다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
  • 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다.

부모 생성자 호출

자식 클래스(매개 변수 선언, ...){
	super(매개 값, ...); //자식 생성자 선언 후 부모 생성자 호출
}

 

  • super()는 부모의 기본 생성자를 호출한다
  • 부모 생성자는 자식 생성자 맨 첫 줄에서 호출됨
  • 자식 생성자에서 반드시 부모 생성자 호출을 위해 super()을 명시적으로 호출해야 된다.
  • 만약 super()가 생략되면 컴파일러에 의해 super()가 자동적으로 부모의 기본 생성자를 만들어준다.

 

메소드 오버라이딩

자식 클래스에서 부모 클래스의 메소드를 다시 정의 하는 것
  • 부모의 메소드와 동일한 시크너처(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다
  • 새로운 예외를 throws할 수 없다
  • 접근 제한을 더 강하게 재정의 할 수 없다
  • 부모 메소드가 public 접근 제한을 가질 경우 재정의 하는 자식 메소드는 default나 private 접근 제한으로 수정할 수 없다.
  • 메소드가 재정의 되면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출된다.

 

상속할 수 없는 final 클래스

더보기
클래스 선언 시 final 키워드를 class 앞에 붙이면 최종적인 클래스가 되어 자식 클래스를 만들 수 없다.
public final class Member{   
//class 앞에 final을 붙이면 자식 클래스를 만들 수 없음
}

 

재정의할 수 없는 final 메소드

더보기
부모 클래스에서 메소드 선언 시 final을 붙이면 최종적인 메소드가 되어 재정의할 수 없다.
public final void stop() {
//메소드에 final을 붙이면 자식 클래스에서 재정의할 수 없음
}

 

protected 접근 제한자

protected 접근 제한자는 같은 패키지에서는 접근 제한이 없지만 다른 패키지에서는 자식 클래스만 접근을 허용한다.

Chap 7-2 타입 변환과 다형성

다형성

사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질
다형성을 구현하려면 메소드 재정이와 타입 변환이 필요하다

자동 타입 변환

더보기
자식타입을 부모타입으로 변환하는 것!
부모타입 변수 = 자식타입;

Cat cat = new Cat();
Animal animal = cat; or Animal animal = new cat();

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다

예외 ) 메소드가 자식 클래스에서 재정의 되었다면 자식 클래스의 메소드가 대신 호출된다.

 

필드의 다형성

필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장되어 결과가 달라짐

 

매개 변수의 다형성

  • 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 있다.
더보기
class Driver{
	void drive(Vehicle vehicle){ //dirve메소드에 Vehicle 타입의 매개 변수를 선언
    vehicle.run();
    }
}
Driver driver  = new Driver();
Vehicle vehicle = new vehicle();
driver.drive(vehicle); //drive()메소드 호출

매개 변수의 타입이 클래스인 경우, 해당 클래스 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다.


 

강제 타입 변환

부모 타입을 자식 타입으로 변환한다.
자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
Parent parent = new Child(); //자동 타입 변환
Child child = (Child) parent; //강제 타입 변환
자식타입 변수 = (자식타입) 부모타입;

 

객체 타입 확인

Parent parent = new Parent(); //부모 타입으로 생성(자동 타입 변환x)
Child child = (Child)Parent; //강제 타입 변환이 안됨​
  • 강제 타입 변환은 자동 타입 변환 후 가능하기에 처음부터 부모 타입으로 생성된 객체는 자식 타입으로 변환할 수 없다.
    그래서 객체가 어떤 타입인지 확인하기 위해 instanceof  연산자를 사용한다.

 

instanceof  연산자

강제 타입 변환 전에 변환이 가능한지 조사할 때 사용
주로 매개값의 타입을 조사할 때 쓰인다. (매개값이 어떤 객체인지 확인 후 강제 타입 변환해야 된다)
boolean result = 좌항(객체) instanceof 우항(타입)​

public void method (Parent parent){
	if(parent instanceof Child){ //parent 매개 변수가 참조하는 객체가 Child인지 조사
    Child child = (Child) parent;
    }
}​

 

Chap 7-3 추상 클래스

추상 클래스

추상 클래스 : 실체 클래스에서 공통되는 필드와 메소드를 선언한 클래스
  • 실체 클래스 : 객체를 직접 생성할 수 있는 클래스
  • 추상 클래스(부모)와 실체 클래스(자식)는 상속의 관계를 가진다.

 

추상 클래스의 용도

1)  공통된 필드와 메소드의 이름을 통일할 목적

  • ex) phone이란 추상 클래스에 소유자인 owner 필드와 trunOn()메소드 선언하고, Telephone과 SmartPhone은 Phone을 상속함으로써 필드와 메소드 이름을 통일할 수 있다.
  • 이미지 첨부

2) 실체 클래스를 작성할 때 시간 절약

  • 공통된 필드와 메소드는 추상 클래스에 모두 선언해두고, 다른 점만 실체 클래스에 선언한다.

추상 클래스 선언

클래스 선언에 abstract 키워드를 붙인다.
- abstract를 붙이면 new 연산자를 이용해 객체를 만들지 못하고, 상속을 통해서 자식 클래스만 만들 수 있다.
- 자식 객체 생성시 super()를 호출해 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.
public abstract class Phone{
	public Sring owner; //필드
    public Phone(String owner){
    	this.owner = owner; //생성자
    }
}

 

추상 메소드

추상 클래스 설계 시 하위 클래스가 반드시 실행 내용을 채우도록 강제하고 싶은 메소드가 있을 경우 사용
  • 추상 클래스에서만 선언 (메소드의 선언부만 있고 실행 내용은 없다)
  • 실행 내용은 자식 클래스에서 재정의한다. (추상 메소드 오버라이딩)

그러면 밑에 코드를 보면서 좀 더 자세하게 이해해보도록 하자!

 

추상 메소드 선언

 

추상 클래스에서 추상 메소드를 선언한다.
이때 추상 메소드는 선언부만 있고 실행 내용은 없다! 

 

 

✨ 추상 메소드 재정의

 Dog와 Cat 클래스를 만들어 Animal 클래스를 상속받는다.
그리고 sound() 추상 메소드를 재정의 시켜준다.

 

✨실행 클래스

그 후 Dog, Cat 객체를 만들고 sound() 메소드를 호출 시켜주면 각각 "멍멍"과 "야옹"이 출력되는 것을 볼 수 있다.

 


▶ 미션

기본 미션 

더보기
클래스 타입 변환에는 어떤 것들이 있는지 정리하기
클래스 타입 변환에는 자동 타입 변환과 강제 타입 변환으로 나눈다.
자동 타입 변환 : 자식 타입을 부모 타입으로 변환 시키는 것
부모타입 변수 = 자식타입;
Cat cat = new Cat();
Animal animal = cat;


강제 타입 변환 : 부모 타입을 자식 타입으로 변환하는 것 
이때 자식 타입이 부모 타입으로 자동 타입 변환 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.

자식타입 변수 = (자식타입)부모타입;
Parent parent = new Child(); //자동 타입 변환
Child child = (Child)parent; //강제 타입 변환​

 

선택 미션

더보기
P367 7-3 확인 문제 3번 풀이하기

 

Public class LoginServlet extends Httpservlet{
@Override
public void service(){
	System.out.println("로그인 합니다"); //추상 메소드 재정의
}
}

Public class FileDownloadServelt extends Httpservlet{
@Override
public void service(){
	System.out.println("파일 다운로드합니다"); //추상 메소드 재정의
}
}
1. HttpServelt 클래스로부터 상속받아 LoginServlet과 FileDownloadServelt 크래스를 선언한다.
2. 각 클래스에 service() 추상 메소드를 재정의 해준다.

 

'혼공단 > 혼공자' 카테고리의 다른 글

혼공자 - 6주차  (1) 2024.02.13
혼공자 - 5주차  (0) 2024.02.05
혼공자 - 3주차  (1) 2024.01.21
혼공자 - 2주차  (0) 2024.01.13
[혼공자] 1주차  (0) 2024.01.02