Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/4월

22. 04. 27 - instanceof, abstract, interface

giggs 2022. 4. 29. 12:12

 

instanceof

  • 객체 비교 
  • A instanceof B
  • A가 B타입이 맞는지 확인하여 boolean 타입의 데이터를 리턴

 

 

 

 


 

 

RedCar 는 - Object 타입이면서, Car 타입이고, RedCar 타입이다.

 

 

셋 다 맞다고 출력 ~!

 


 

List 타입은 - 아니다라고 "ㄴㄴ 아님" 출력 됨

 

 

 

 

 

 

 


 

 

 

 

진도 플러스~~

 

추상화 – 추상메소드 – 추상클래스

 

 

기본 세팅

  • 부모 클래스 Car 클래스 - 데이터와,
  • 시동걸기 메서드(startCar) / 브레이크 메서드(stop)/ 액셀 메서드(go)  가지고 있음
  • Car extends 한 자식 클래스 - RedCar, GreenCar, WhatCar 생성
  • RedCar에서는 @Override startCar 한 상태 ( 나머지는 클래스에서는 X )

 

 

Car클래스의 존재 이유?

  • 모든 컬러Car들을 Car라고 묶어주기 위해서 만들어 놓은 것!
  • 차가 시동 거는 행동을 묶어주기 위해서 만들어 놓은 것!
  • 그냥 차가 만들어지는 경우는 없다. - 색이 있는 차만이 태어날 수 있다.
  • 그냥 차가 시동거는 경우는 없다. - 색이 있는 차만이 시동을 걸 수 있다.

 

 

시동 거는 메소드 startCar() 의 존재 이유?

  • 부모 클래스는 공통적인 기능을 뽑아 온 것인데, 여기에 차 시동걸기의 - 구체적인 내용 있을 필요가 없다!
  • 모든 차들은 각자의 시동 거는 방법이 있을것이기 때문에

 

 

추상화 <-> 구체화

  • 기능만 있다고 알려줄 뿐, 그 기능이 어떻게 작동하는지는 만들어 놓을 필요 없다.
  • Car 클래스 상속받은 RedCar / GreenCar / WhatCar로 실습
  • 각 클래스마다 시동거는 메소드 startCar(){}를 각각 다 @Override 해줬었다.
  • 정작 Car 클래스에 구현해 놓은 startCar(){} 메소드를 사용하나? - 안한다.
  • 정작 Car 클래스를 이용하여 객체를 생성하는 일이 있나? - 없다

 

 

Car클래스를 추상 클래스로 만들어 준다.

시동 거는 기능의 메소드 stratCar( ) - 추상 메소드로 만들어 준다.

 

 

 

 

 


 

 

 

 

 

Car클래스와 startCar( ) - 추상 클래스와 추상 메소드로 만들어 준다.

 

 

1. 구현부를 없애고 abstract를 붙여준다.

 

 

구현부를 없애고 abstract를 붙여준다.

 

 

  • 빨간 줄이 그어진다.. why????
  • 현재 상태에서 코드상으로 new Car(); 해서 Car객체를 만들 수 있다.
  • Car 객체는 색깔 있는 Car들을 묶어주기 위한 목적으로만 만든 클래스다.
  • 객체가 만들어지면 안 된다..

 

 

 


 

 

 

2. 클래스 앞에 abstract를 붙여준다.

 

 

 

 

 

abstract 해주어야하는 - 첫 번째 이유

  • 객체가 만들어지지 않도록
  • 클래스 앞에 abstract 키워드 추가 – 추상 클래스로 만들어준다. - Car 객체 생성 불가능하게 해 준다

 

 

abstract 해주어야하는 - 두 번째 이유

  • 추상 메소드를 포함하고 있어서 ( 미완성 메소드가 있기 때문에 )
  • Car 객체가 생기면 - Car야 시동 걸어줘 했는데 시동 거는 방법 모른다..

 

 

 


 

 

 

3. Car 클래스의 나머지 메소드(브레이크, 악셀)도 추상 메소드로 만들어 주기

 

 

1. 부모 클래스 Car에 있는 ( 브레이크 밟기 / 악셀 밟기 기능 ) 도 - 모든 자식 클래스에서 본인만의 기능으로 구현한다면

  • 굳이 부모 클래스에서 구현부를 가지고 있을 필요가 없다

 

 

 


 

 

 

 

2. 추상 메소드로 만들어주자!

 

 

Car 클래스에서 구현부를 없애고, abstract 키워드 추가 해줌

 

 

 


 

 

 

 

3. 자식 클래스들 에러 난다

 

 

자식 클래스에서 - 부모의 메소드 구현하라고 에러 발생

 

 

  • 부모인 Car 클래스의 - 추상메소드 구현하라고 에러 난다.
  • 상속받았는데 기능의 값( 기능 실행 부분 { } )이 없어서
  • 동작 이름은 있는데 - 무슨 동작을 할지 모르는 객체는 존재할 수 없다.

 

 

 


 

 

 

 

4. 메소드 오버 라이딩해주자~!~!

 

 

@Override 표시해주고 구현부 만들어 주기!

 

 

 

 

 

 


 

 

 

 

추상 클래스와 추상 메소드 총 정리

 

 

 

 

나뉜다 .  추상 메소드는 구현부  { } body 를 가지지않는다 .

 

 

  • 현업에서는 추상 클래스 사용할 일이 많지 않다 - 인터페이스 많이 사용
  • but – 인터페이스를 사용하려면 abstract 개념에 대해 이해가 필요하다.

 

 

 

> 추상 클래스

  • -abstract 키워드를 붙여주면 됨
  • -0개 이상의 추상메소드를 가지고 있음
  • -객체화 불가능

 

 

> 추상 메소드

  • -abstract 키워드를 붙여주면 됨
  • -메소드 바디가 존재하지 않는다.

 

 

 

> 추상 클래스를 사용하는 경우 

  1. 추상 메소드를 포함하는 경우
  2. 객체 생성을 바라지 않는 경우( 포괄적으로 담아두기 위한 상위 타입을 만든 목적 )

 

 

 

+@ 추가 개념

  • 추상 메서드가 없으면 추상 클래스를 못 만들어준다? - NO!
  • 클래스가 추상 클래스로 만들어야 하면 만들어주어야 한다.!

 

 

 

Question

추상 클래스의 일반 메소드를 사용할 수 있는 부분 관련 질문입니다.

추상 클래스는 그 클래스 스스로는 객체화가 불가능하고

자식 클래스를 이용해서는 추상 클래스도 객체화가 가능한 것이란다..

그래서 만들어진 추상 클래스의 객체의 메소드를 사용 가능한 것이다.

라고 이해했는데 맞을까요?

 

 

 


 

 

 

 

진도~

 

interface - 인터페이스 

 

 

 

1. 추상 메소드만 가지고있는 애

 

2. 추상 메소드 밖에 없는 - Car 클래스 

  • 클래스를 만든 목적이 “색깔있는Car” 객체들을 담아두기 위한 목적으로 존재한다면
  • 추상 메서드만을 담고 있는 interface를 만들어서 같은 기능을 수행하도록 할 수 있다.

 

3. 사용하는 이유 :

  • 공통된 객체들 묶어줄 상위 타입이 필요하고,
  • 자식 객체들이 어차피 다 각각 메소드를 구현해야 하는 경우에 사용

 

4. 모든 자동차는 – 공통된 추상화된 기능의 - 문서를 토대로 - 만들어진다!

  • ex) 내차는 홍차인데 녹차 운전도 가능하다  이유는? 사용법이 다 써져있어서

 

 

예시

  • 모든 자동차는 액셀 밟으면 앞으로 간다.
  • ( 하지만 어떻게 앞으로 가는 방식(구현 방식)은 각각의 자동차마다 구현한다 )
  • 전기로 가던 / 화석연료로 가던 / 뭘로 가던지 / 상관없다.-
  • ‘앞으로 간다’는 추상적인 기능을 – 구현한 자동차는 생성 가능!

 

 

 

 

Car interface 문서를 참조해서 만든 색깔있는Car들은 저 기능들을 다 가지고있을 것이다.

 

 

 

 

>가상메소드는 선언부만 있다~ 구현부 없다.

>악셀을 밟으면 앞으로 가게 해앞으로 가는 방식은 꼭 구현해야 하지만 정해놓진 않을게

>go() 실행하면 int값 나오게 해int값 나오게 하는 방식은 꼭 구현해야 하지만 정해 놓진 X 않을게 - 

 

 

 

5. 이렇게 하면 장점

  • 다른 Car 타도 기능이 존재하는 것을 알 수 있고
  • 추상적으로나마 실행 결과를 알고 있기 때문에 기능 수행 가능
  • RedCar도 Car라고 할 수 있다. GreenCar도 Car라고 할 수 있다.
  • Car로 묶어서 관리 / 명령 / 등등 - 편하고 쉽게 할 수 있다.
  • +@ 인터페이스에는 – 일반 변수 가질 수 없다. / 상수는 가질 수 있다.

 

 

 

 

 


 

 

 

 

인터페이스 실습 스타트!

 

 

 

1. 색깔차들 받아 줄 공통된 애를 만들어 주자! - 인터페이스로 !

  • why? 모든 메소드를 추상 메소드로 가지고 있을 거고, 객체 생성 필요 없으므로.

 

 

 

 

 


 

 

 

2. 모든 자동차가 공통적으로 가져야 할 메소드 ( 추상 메소드 ) 만들어주기

 

 

 

 

 

!인터페이스 안에 있는 모든 메소드는 public 이다!

!인터페이스 안에 있는 모든 메소드는 abstract 이다!

!따라서 interface 안에서 컴퓨터가 알아서 적용해준다! ( 생략가능하다)

 

 

 

 

 

 


 

 

 

3. 상속받을 자식 클래스에 implement 표시 ( extends아님 )

 

 

 

3-1 extends 하면 에러 -

 

interface Car를 extends 하면 에러남

 

 

 

 

 

3-2 implements 해주면 에러 -

 

interface Car를 implements 해주자 - 에러 해결 / 다른 오류 발생

 

 

 

  • 추상메소드 구현하라고 에러 났다.
  • -> 해결 방법 : 상속받는 인터페이스의 모든 추상메소드를 구현해야 됨
  • -> 그래야 현재 클래스 파일을 이용해서 객체가 생성될 수 있음
  • == 인터페이스를 상속받는 경우, 무조건 모든 메소드를 오버 라이딩해야 함
  • == 인터페이스는 메소드 오버 라이딩을 강제화하기 위해서 사용함.

 

 

 


 

 

 

4. 메소드 오버라이딩

 

 

interface Car 의 추상 메소드들 @Override 구현해주면 에러 해결!

 

 

4-1 나머지 greenCar 와 whatCar에도 똑같이 만들어 주자!

 

 

 

 


 

 

 

 

5. 메인에서 객체 생성 / 출력 테스트

 

 

각각의 타입으로 담아주기

 

 

 

 

5-1 참조 변수의 데이터 타입을 수정해보자~

 

 

Car 타입으로 담아주기

 

 

> 우리가 만든 인터페이스도 타입으로 담아줄 수 있다. == 관리, 수정하기 편하다

 

 

 

 

 

 


 

 

 

 

 

인터페이스 상속

 

  • 인터페이스가 인터페이스를 상속받을 수도 있다.
  • 인터페이스끼리 상속을 할 경우에는 extends

 

  • 클래스 – 클래스 : extends
  • 클래스 – 인터페이스 : implements
  • 인터페이스 – 인터페이스 : extends
  • 부모 : 클래스는 하나만 가능, 인터페이스는 몇 개든 상관없음

 

 

인터페이스는 ==> 부모 인터페이스가 여러개여도 괜찮다.

 

 

 

 


 

 

 

 

 

교재 보면서 인터페이스 마무리

 

 

 


 

 

 

 

1번 특징 : 상수는 사용 가능하다. ( public 은 깔고 들어간다 )

 

 

 


 

 

2번 특징 : 다중 상속에 제한이 없다.

  • 인터페이스 사용하는 이유 : 다중 상속에 제한이 없기 때문에
  • 전기차는 Car문서도 있지만 전기차만의 다른 문서도 참조해서 만들어야 한다.

 

 

2-1. 새로운 인터페이스 ElectronicCar 생성

 

 

새로운 인터페이스 생성

 


 

 

2-2. 새로운 문서 참조 추가

  • WhatCar 클래스에 새로 만든 인터페이스 문서도 implements 해줌

class - interface 상속(구현)

 

 

  • 여러 개의 인터페이스 문서 추가해주는 방법
  • 콤마 (,) 찍고 추가해준다.
  • 추가한 ElectronicCar의 추상 메서드 구현해주면~ 끝!

 


 

 

2-3 인터페이스 ElectronicCar에 인터페이스 Car 상속

 

interface - interface 상속

 

  • 이렇게 해주면 WhatCar 는 implemensts Car, ElectronicCar 해줄 필요 없이
  • ElectronicCar 만해주면된다.

 

 


 

 

2-4 WharCar 클래스 implemensts 수정

Car인터페이스를 상속받은 ElectronicCar - 변경내용 확인

 

 

 


 

 

 

3 charge() 메소드 사용해보기 – 주석 참조

 

 

 

 

 

 


 

 

 

 



review


객체 비교, 추상 클래스와 메소드, 인터페이스

instanceof는 왜 사용하는가? 는 말 안 해 주심
내가 알고 있기로는 명시적 형 변환 시에
에러 방지하기 위한 안정적 체크 수단으로 활용한다는 것 
하나 알고 있다 ㅎㅎ

추상 클래스와 인터페이스에서는
클래스 - 인터페이스 : implements
인터페이스 - 인터페이스 : extends
인터페이스는 메소드 오버라이드를 할 수 없어서
인터페이스만 상속이 가능한 점 체크!

어느덧 abstract와 implement까지 와버렸다.
점점 예습했던 내용들이 끝나가는 시점
설레기도 하고 두렵기도 하다 ㅎㅎ
java 끝나면 DB나
어렵다는 서버 부분도 배워야 할 텐데 후후
화이팅!