Day 17

dokiru·2023년 2월 23일
0

학원

목록 보기
14/51

퀴즈 피드백

  • String을 출력하는 방법
  1. 원하는 string 값들 +로 이어서 출력
  2. String.format의 활용
  • return의 활용
    : 값을 return해서 활용하면 정보 확인용, 검증용, 비교용 등으로 다양하게 쓰일 수 있음. 하지만 내부에서 값을 출력하고 끝나버리면 사용용도가 고정된다.

  • java의 모든 클래스는 Object라는 클래스를 상속 받는다
    Sample이라는 클래스의 생성

class Sample(extends Object) {
}
  • 메소드 재정의할 때 제한사항
  1. 부모클래스 메소드와 동일한 구성 형태
  2. 접근 제한자가 더 좁아지면 X

스마트폰 객체의 형성 (액정, 배터리, 카메라 객체를 받아서 저장)

액정 클래스 - 액정의 기본 기능
액정을 상속 받은 강화유리, 주변반사 클래스 - 세부기능 구현

배터리 클래스 - 배터리의 기본 기능 (ex. 충전)
배터리를 상속받은 삼성, 애플 클래스들 - 메소드를 재정의해서 세부 기능을 구현 (ex. 무선충전)

  1. 다른 main 메서드에서 강화유리 객체, 삼성 배터리 객체를 넣어서 스마트폰 클래스를 만든다고 가정
  • 부모는 자식의 객체를 담을 수 있으므로, 유리 타입, 배터리 타입으로 정의를 해도 그 클래스를 상속받은 자식은 그 타입 안에 저장될 수 있다.
  1. 스마트폰 객체의 어떤 메서드를 실행
  • 스마트폰 객체의 메소드를 실행하면, 그 안에 담겨있던 자식 객체의 오버라이딩된 메서드가 실행되서 자식 객체들이 세부 기능을 구현해놓은 메서드가 실행된다.
    -> 겉으로는 스마트폰한테 배터리를 충전하라고 하거나, 액정 기능을 켰을 뿐이지만 내부로는 부모의 타입 안에 담긴 자식의 객체를 타고 가서 메소드를 실행.

강제 타입 변환(casting)

  • 부모 타입을 자식 타입으로 변환하는 것
  • 자식 타입이 부모 타입으로 자동 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환 사용 O
자식클래스 변수 = (자식클래스) 부모클래스타입;
						   -> 자식 타입이 부모 타입으로 변환된 상태
  • 자식 타입에 선언된 필드와 메소드를 사용해야 한다면 강제 타입 변환 사용 (자동변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능)

ex.

// class B가 class A를 상속받았다
1. A a = new B(); // B가 부모 타입인 A로 자동 변환
2. B b = (b) a; // a를 자식 타입인 b로 강제 변환

* 1이 선행되어야 2가 가능하다 (a가 자식이 있음을 인지하고 있어야 강제 변환 가능)

객체 타입 확인 (instanceof)

  • 객체가 어떤 클래스의 인스턴스인지 확인하는 연산자
boolean result = 좌향(객체) instanceof 우향(타입)
  • 타입 확인하지 않고 강제타입 변환시에 ClassCastException 예외 발생 O

추상 클래스 (abstract class)

  • 추상 : 실체들 간에 공통되는 특성을 추출한 것 (ex. 삼성, 현대, LG -> 회사)

  • 추상 클래스
    : 실제 클래스들의 공통되는 필드와 메소드 정의한 클래스
    : 추상 클래스는 실체 클래스의 부모 클래스 역할
    : 추상 클래스는 공통되는 필드와 메소드를 추출해서 만들었기 때문에 new 연산자를 통해 객체를 직접 형성할 수는 없다.
    : 실체를 가진 자식이 접근해야만 가능 (상속을 통해서 자식 클래스만 만들 수 있다)

추상 클래스의 선언

public abstract class Phone {
	// 필드
    public String owner;
    
    // 생성자
    public Phone(String owner) {
    	this.owner = owner;
    }
    
    // 메소드
    public void turnOn() {
    	System.out.println("전원을 켭니다");
    }
    
    // 추상 메소드 (자식 클래스에서 반드시 재정의 필요)
    public abstract void touch(); // 중괄호 생략

}

추상 클래스의 용도

  1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적 (여러 사람이 설계하면 동일한 기능임에도 이름이 여러개여서 사용법이 달라질 수 있다)
  2. 실체 클래스를 작성할 때 시간을 절약 (공통적인 필드와 메소드는 추상클래스에 선언해놓고 좀 더 구체적이고 다른 점만 실체 클래스에 선언하게 되면 시간 절약 가능) => 설계 규격으로 사용

추상 클래스의 사용

  • 공통으로 관리해줘야하는 필드, 메서드를 빼서 사용
  • 자식 클래스에서 반드시 재정의해야 하는 메서드는 추상 메서드 선언을 통해 오버라이딩하지 않을 경우 오류가 발생할 수 있게 한다
  • 그렇지 않고 공통으로 사용하는 것은 그냥 메서드로 선언 (일반 클래스와 같이)
  • 부모 클래스에서 공통으로 접근할 수 있는 것은 자식 클래스에서 삭제
profile
안녕하세요!

0개의 댓글