💻 수업정리 (2020)/자바

[5/22] 오버라이드와 객체 형변환

주다람 2020. 5. 22. 11:35

1. 메소드 오버라이드 : 상속관계에서만 가능함

  • 정의 : 부모클래스의 메소드를 자식 클래스에서 재선언하는것
  • 사용방법 : 부모클래스의 메소드와 같은 형태의 머릿부를 동일하게 선언
  • 기능 : 부모클래스의 메소드는 숨겨지고, 자식클래스의 메소드만 사용가능해짐

오버라이드를 사용하는 방법

참고 ) @Overide 처럼 @붙여서 사용하는 것을 annotation(어노테이션)이라고한다.


2. 상속관계에서 참조변수와 인스턴스의 사용법

1. 부모 클래스 참조변수 = new 부모 클래스();
참조변수는 부모클래스 요소에 접근가능
2. 자식 클래스 참조변수  = new 자식클래스();
참조변수는 자식클래스의 요소 / 부모클래스 요소에 접근가능(상속받았으니까)
3. 자식 클래스 참조변수 = new 부모클래스(); -> 불가능(아예 안되는 경우임)
자식인스턴스가 존재하지 않음(존재하지 않는 자식인스턴스의 정보를 저장하라고 했기때문) 하고싶다면 4번경우에서 형변환을 사용하면 된다.
4.부모클래스 참조변수 = new 자식클래스();
이렇게하면 참조변수의 자료형이 부모클래스가 되어버리므로, 자식클래스에 있는 메소드는 사용할 수 없게됨.
사용하고 싶다면 => 형변환을 하면된다.

형변환 
1. 자동 형변환 : 묵시적 객체 형변환이라고도 한다.
2. 강제 형변환 : 명시적 객체 형변환이라고도 한다.★★★★★많이사용합니다.


3. 오버라이딩

  • 형변환을 하지 않아도 자식클래스의 메소드를 호출할 수 있는 방법이다.
  • 부모가 자식것을 가져다 사용을 할 수 있게된다.(부모는 자신의 메소드를 숨기고 자식것을 쓸 수 있기 때문)
  • 부모를 상속받는 자식은 여러명일 수 있다. 따라서 오버라이딩을 사용하게 되면 참조변수 하나가지고 자식클래스 모두에것을 가져다 사용할 수 있게된다.
  • 만약(빨간선의 경우처럼)자식으로 인스턴스를 만들면 다른 자식클래스에 접근을 할 수 없으므로(비효율을 발생시킴) 4번 경우를 사용하는 것이다.

부모class 참조변수 = new 자식class(); 를 사용하는 이유
자식class가 여러개인 상속  usecase다이어그램

3-1. instaceof연산자

  • 정의 : 상속관계를 구분하기 위한 연산자(반드시 자식클래스를 명확히 구분시켜 주어야 하므로)
  • 사용방법 : 참조변수 instanceof 클래스(자식클래스)
  • 기능 : 참조변수가 자식클래스로 형변환 가능한 경우(=상속관계에 있는 경우)true를 반환
  • 명시적 객체 형변환을 하기 전에 사용하는 연산자이다.

3-2. 오버라이드에 의한 다형성

  • 자식클래스에서 오버라이드를 했기 떄문에 묵시적인 객체 형변환이 일어남
  • 자동으로 부모 인스턴스의 관련된 자식 인스턴스로 변환되어, 자식 메소드가 호출되어진다.

AcademyApp.java

 

더보기
AcademyPerson.java = 부모클래스
AcademyInstructor.java
AcademyStaff.java
AcademyStudent.java

4. Objetc 클래스 

  • 모든 클래스가 반드시 상속 받는 최선조클래스
  • 클래스를 선언할 때 상속받는 클래스가 없을 경우 자동으로 Object 클래스 상속
  • 참조변수의 인스턴스 정보를 출력하면 Object 클래스의 toString() 메소드 자동 호출한다(Object클래스의 toString()메소드를 오버라이드 선언하여 사용한다.
// 필드값을 반환해서 필드값 확인하는 메소드로 활용한다
	@Override
	public String toString() {
		return "소유주  = " + userName + ", 모델 명 = " + modelName;
	}
	

   


5. final 키워드

4-1. final 필드

  • 사용방법 : public static final 필드명 = 값; => "public + static + fianal 은 상수필드" 라고 부른다.
  • 참고) final은 값이 바뀌지 않기 때문에 public과 static과 함께써도 문제가 없기 때문이다.
  • 필드값을 변경할 수 없도록 만든다
  • 무조건 값을 넣어 저장시킨다(생성자에 들어갈 수 없음)
  • 값대신 사용하기 위한 고유명침
  • final필드명은 모두 대문자로 작성하며 _를 사용하여 만든다

4-2. final 메소드

  • 접근지정자 final 반환형 메소드명(파라메터,...)
  • 기능 : 메소드 오버라이드 선언 불가능하게 한다.

4-3. final 클래스

  • 사용 방법 : 접근지정자 final class 클래스명 { }
  • 기능 : 상속을 불가능하게 하기 위해 사용함(오버라이드 하지 못하게 함). 즉, 부모클래스로 사용하지 못하게 한다.

 


5. 추상클래스->내일~~~