관리 메뉴

애독자's 공부방

[혼공자] 4주차 _ 혼자 공부하는 자바(개정판) 본문

Java/혼공학습단 12기

[혼공자] 4주차 _ 혼자 공부하는 자바(개정판)

애독자 2024. 7. 22. 01:10
728x90

혼공단 - 혼공자, 혼자 공부하는 자바(개정판)

 

 

■ 공부한 내용

# 진도 기본 숙제(필수) 추가 숙제(선택)
4주차
(7/22 ~ 7/28)
Chapter 07 클래스의 타입 변환에는 어떤 것이 있는지 정리하고 공유하기 p.389 (07-3) 확인 문제 3번을 풀고 풀이 과정 설명하기

 

 

 

□ Chapter 07

▷ 07-1
 - 상속: 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 함
 - 메소드 재정의: 부모 메소드를 자식 클래스에서 다시 정의
 - final 클래스: final로 선언된 클래스는 부모 클래스로 사용 불가
 - final 메소드: final로 선언된 메소드는 자식 클래스에서 재정의 불가

▷ 07-2
 - 클래스 타입 변환: 다른 클래스 타입으로 객체를 대입
 - 자식 타입 변환: 자식 객체를 부모 타입 변수에 대입할 때 자동으로 진행
 - 강제 타입 변환: 자식 객체가 부모 타입으로 변환된 상태에서 다시 원래의 자식 타입으로 변환하고자 할 때 캐스팅() 연산자를 사용해서 진행
 - instanceof 연산자: 객체가 어떤 타입인지 조사할 때 사용 (주로 강제 타입 변환 전에 변환이 가능한지 조사)
 - 다형성: 객체 사용 방법은 동일하지만 실행결과가 다양하게 나오는 성질
   . 구현하는 기술: 메소드 재정의와 타입 변환
     → 자식 객체가 재정의된 메소드를 가지고 있을 경우, 부모 타입으로 자동 타입 변환 후에 메소드를 호출하면 재정의된 자식 메소드가 호출되면서 다양한 실행결과 생성

▷ 07-3
 - 추상 클래스: 클래스들의 공통적인 필드와 메소드를 추출해서 선언한 클래스
 - 추상 메소드: 추상 클래스에서만 선언할 수 있고, 메소드의 선언부만 있는 메소드 (자식 클래스에서 재정의되어 실행 내용을 결정해야 함)

 

 

■ 기본 숙제

  - 클래스의 타입 변환에는 어떤 것이 있는지 정리하고 공유하기

    1) 자동 타입 변환: 자연스럽게 일어나는 형변환으로, 명시적인 코드 없이도 부모 클래스 타입 객체를 자식 클래스 변수에 대입할 수 있습니다. 물을 유리 잔에 담는 것처럼 자연스럽게 형태가 변하는 과정입니다.

      - 코드 간결성 향상: 명시적인 형변환 코드가 필요 없어 코드가 간결하고 읽기 쉽습니다.

      - 명확성 증진: 변환 의도를 명확하게 전달하여 코드 이해도를 높입니다.

class Animal { }              // 부모 클래스
class Dog extends Animal { }  // 자식 클래스

Animal animal = new Dog();    // 자동 형변환 발생 (Dog 객체가 animal 변수에 담김)

 

    2) 강제 타입 변환: () 연산자를 사용하여 자식 클래스 타입 객체를 부모 클래스 변수에 대입하거나, 객체의 실제 타입과 다른 타입으로 변환하는 경우에 사용합니다. 강제로 물을 좁은 병에 붓는 것과 같습니다.

      - 업캐스팅: 자식 클래스 타입 객체를 부모 클래스 타입 변수로 변환합니다. 큰 병에 작은 물을 담는 것과 같습니다.

        . 다형성 구현: 부모 클래스 메서드를 자식 클래스 객체를 통해 호출할 수 있도록 합니다.

        . 코드 재사용성 향상: 부모 클래스 타입 변수를 사용하여 다양한 자식 클래스 객체를 처리할 수 있습니다.

Dog dog = new Dog();
Animal animal = (Animal) dog;  // 업캐스팅 수행 (Dog 객체를 animal 변수에 담음)

      - 다운캐스팅: 부모 클래스 타입 객체를 자식 클래스 타입 변수로 변환합니다. 큰 병에 담긴 물을 작은 컵에 붓는 것과 같습니다. 실제 객체 타입이 변환하려는 타입과 일치하지 않으면 오류(ClassCastException)가 발생합니다.

        . 특정 자식 클래스의 메서드 호출 가능: 다운캐스팅을 통해 자식 클래스의 고유 메서드를 호출할 수 있습니다.

Animal animal = new Dog();
if (animal instanceof Dog) {   // instanceof 연산자로 타입 확인
  Dog realDog = (Dog) animal;  // 다운캐스팅 수행 (실제 타입이 Dog인지 확인 후 변환)
  realDog.bark();              // Dog 클래스의 bark() 메서드 호출 가능
} else {
  System.out.println("해당 동물은 Dog가 아닙니다.");
}

 

 

■ 추가 숙제(선택)

  - p.389 (07-3) 확인 문제 3번을 풀고 풀이 과정 설명하기

    . 추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해놓는데, 실체 클래스의 멤버(필드/메소드)를 통일하는데 목적이 있습니다. 추상 클래스 설계 시 하위 클래스가 반드시 실행 내용을 채우도록 강제하고 싶은 메소드가 있을 경우 해당 메소드를 추상 메소드로 선언합니다. 자식 클래스는 반드시 추상 메소드를 재정의해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생합니다.

    . 문제를 보면 HttpServletExample의 main 메소드에서 LoginServlet과 FileDownloadServlet 객체를 차례대로 method 메소드에 전달하고 있는데, method는 HttpServlet의 service 메소드를 호출하도록 구성되어 있습니다. HttpServlet은 추상 클래스로 선언되어 있으며 service는 추상 메소드로 선언되어 있기에, 각 하위 클래스인 LoginServlet과 FileDownloadServlet은 자식 클래스로서 HttpServlet를 상속받으며, 반드시 추상 메소드인 service를 재정의해서 실행 내용을 작성해야 합니다. 따라서 LoginServlet과 FileDownloadServlet은 다음과 같이 작성합니다.

 

package sec03.extra;

public class LoginServlet extends HttpServlet{
	@Override
	public void service() {
		System.out.println("로그인 합니다.");
	}
}

 

package sec03.extra;

public class FileDownloadServlet extends HttpServlet {
	@Override
	public void service() {
		System.out.println("파일 다운로드 합니다.");
	}
}

 

 

728x90