instanceof
- 객체 비교
- A instanceof B
- A가 B타입이 맞는지 확인하여 boolean 타입의 데이터를 리턴
셋 다 맞다고 출력 ~!
진도 플러스~~
추상화 – 추상메소드 – 추상클래스
기본 세팅
- 부모 클래스 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를 붙여준다.
- 빨간 줄이 그어진다.. why????
- 현재 상태에서 코드상으로 new Car(); 해서 Car객체를 만들 수 있다.
- Car 객체는 색깔 있는 Car들을 묶어주기 위한 목적으로만 만든 클래스다.
- 객체가 만들어지면 안 된다..
2. 클래스 앞에 abstract를 붙여준다.
abstract 해주어야하는 - 첫 번째 이유 –
- 객체가 만들어지지 않도록
- 클래스 앞에 abstract 키워드 추가 – 추상 클래스로 만들어준다. - Car 객체 생성 불가능하게 해 준다
abstract 해주어야하는 - 두 번째 이유 –
- 추상 메소드를 포함하고 있어서 ( 미완성 메소드가 있기 때문에 )
- Car 객체가 생기면 - Car야 시동 걸어줘 했는데 시동 거는 방법 모른다..
3. Car 클래스의 나머지 메소드(브레이크, 악셀)도 추상 메소드로 만들어 주기
1. 부모 클래스 Car에 있는 ( 브레이크 밟기 / 악셀 밟기 기능 ) 도 - 모든 자식 클래스에서 본인만의 기능으로 구현한다면
- 굳이 부모 클래스에서 구현부를 가지고 있을 필요가 없다
2. 추상 메소드로 만들어주자!
3. 자식 클래스들 에러 난다
- 부모인 Car 클래스의 - 추상메소드 구현하라고 에러 난다.
- 상속받았는데 기능의 값( 기능 실행 부분 { } )이 없어서
- 동작 이름은 있는데 - 무슨 동작을 할지 모르는 객체는 존재할 수 없다.
4. 메소드 오버 라이딩해주자~!~!
추상 클래스와 추상 메소드 총 정리
- 현업에서는 추상 클래스 사용할 일이 많지 않다 - 인터페이스 많이 사용
- but – 인터페이스를 사용하려면 abstract 개념에 대해 이해가 필요하다.
> 추상 클래스
- -abstract 키워드를 붙여주면 됨
- -0개 이상의 추상메소드를 가지고 있음
- -객체화 불가능
> 추상 메소드
- -abstract 키워드를 붙여주면 됨
- -메소드 바디가 존재하지 않는다.
> 추상 클래스를 사용하는 경우
- 추상 메소드를 포함하는 경우
- 객체 생성을 바라지 않는 경우( 포괄적으로 담아두기 위한 상위 타입을 만든 목적 )
+@ 추가 개념
- 추상 메서드가 없으면 추상 클래스를 못 만들어준다? - NO!
- 클래스가 추상 클래스로 만들어야 하면 만들어주어야 한다.!
Question
추상 클래스의 일반 메소드를 사용할 수 있는 부분 관련 질문입니다.
추상 클래스는 그 클래스 스스로는 객체화가 불가능하고
자식 클래스를 이용해서는 추상 클래스도 객체화가 가능한 것이란다..
그래서 만들어진 추상 클래스의 객체의 메소드를 사용 가능한 것이다.
라고 이해했는데 맞을까요?
진도~
interface - 인터페이스
1. 추상 메소드만 가지고있는 애
2. 추상 메소드 밖에 없는 - Car 클래스
- 클래스를 만든 목적이 “색깔있는Car” 객체들을 담아두기 위한 목적으로 존재한다면
- 추상 메서드만을 담고 있는 interface를 만들어서 같은 기능을 수행하도록 할 수 있다.
3. 사용하는 이유 :
- 공통된 객체들 묶어줄 상위 타입이 필요하고,
- 자식 객체들이 어차피 다 각각 메소드를 구현해야 하는 경우에 사용
4. 모든 자동차는 – 공통된 추상화된 기능의 - 문서를 토대로 - 만들어진다!
- ex) 내차는 홍차인데 녹차 운전도 가능하다 – 이유는? 사용법이 다 써져있어서
예시
- 모든 자동차는 액셀 밟으면 앞으로 간다.
- ( 하지만 어떻게 앞으로 가는 방식(구현 방식)은 각각의 자동차마다 구현한다 )
- 전기로 가던 / 화석연료로 가던 / 뭘로 가던지 / 상관없다.-
- ‘앞으로 간다’는 추상적인 기능을 – 구현한 자동차는 생성 가능!
>가상메소드는 선언부만 있다~ 구현부 없다.
>악셀을 밟으면 앞으로 가게 해– 앞으로 가는 방식은 꼭 구현해야 하지만 정해놓진 않을게
>go() 실행하면 int값 나오게 해– int값 나오게 하는 방식은 꼭 구현해야 하지만 정해 놓진 X 않을게 -
5. 이렇게 하면 장점
- 다른 Car 타도 기능이 존재하는 것을 알 수 있고
- 추상적으로나마 실행 결과를 알고 있기 때문에 기능 수행 가능
- RedCar도 Car라고 할 수 있다. GreenCar도 Car라고 할 수 있다.
- Car로 묶어서 관리 / 명령 / 등등 - 편하고 쉽게 할 수 있다.
- +@ 인터페이스에는 – 일반 변수 가질 수 없다. / 상수는 가질 수 있다.
인터페이스 실습 스타트!
1. 색깔차들 받아 줄 공통된 애를 만들어 주자! - 인터페이스로 !
- why? 모든 메소드를 추상 메소드로 가지고 있을 거고, 객체 생성 필요 없으므로.
2. 모든 자동차가 공통적으로 가져야 할 메소드 ( 추상 메소드 ) 만들어주기
!인터페이스 안에 있는 모든 메소드는 public 이다!
!인터페이스 안에 있는 모든 메소드는 abstract 이다!
!따라서 interface 안에서 컴퓨터가 알아서 적용해준다! ( 생략가능하다)
3. 상속받을 자식 클래스에 implement 표시 ( extends아님 )
3-1 extends 하면 에러 -
3-2 implements 해주면 에러 -
- 추상메소드 구현하라고 에러 났다.
- -> 해결 방법 : 상속받는 인터페이스의 모든 추상메소드를 구현해야 됨
- -> 그래야 현재 클래스 파일을 이용해서 객체가 생성될 수 있음
- == 인터페이스를 상속받는 경우, 무조건 모든 메소드를 오버 라이딩해야 함
- == 인터페이스는 메소드 오버 라이딩을 강제화하기 위해서 사용함.
4. 메소드 오버라이딩
4-1 나머지 greenCar 와 whatCar에도 똑같이 만들어 주자!
5. 메인에서 객체 생성 / 출력 테스트
5-1 참조 변수의 데이터 타입을 수정해보자~
> 우리가 만든 인터페이스도 타입으로 담아줄 수 있다. == 관리, 수정하기 편하다
인터페이스 상속
- 인터페이스가 인터페이스를 상속받을 수도 있다.
- 인터페이스끼리 상속을 할 경우에는 extends
- 클래스 – 클래스 : extends
- 클래스 – 인터페이스 : implements
- 인터페이스 – 인터페이스 : extends
- 부모 : 클래스는 하나만 가능, 인터페이스는 몇 개든 상관없음
교재 보면서 인터페이스 마무리
1번 특징 : 상수는 사용 가능하다. ( public 은 깔고 들어간다 )
2번 특징 : 다중 상속에 제한이 없다.
- 인터페이스 사용하는 이유 : 다중 상속에 제한이 없기 때문에
- 전기차는 Car문서도 있지만 전기차만의 다른 문서도 참조해서 만들어야 한다.
2-1. 새로운 인터페이스 ElectronicCar 생성
2-2. 새로운 문서 참조 추가
- WhatCar 클래스에 새로 만든 인터페이스 문서도 implements 해줌
- 여러 개의 인터페이스 문서 추가해주는 방법
- 콤마 (,) 찍고 추가해준다.
- 추가한 ElectronicCar의 추상 메서드 구현해주면~ 끝!
2-3 인터페이스 ElectronicCar에 인터페이스 Car 상속
- 이렇게 해주면 WhatCar 는 implemensts Car, ElectronicCar 해줄 필요 없이
- ElectronicCar 만해주면된다.
2-4 WharCar 클래스 implemensts 수정
3 charge() 메소드 사용해보기 – 주석 참조
review
객체 비교, 추상 클래스와 메소드, 인터페이스
instanceof는 왜 사용하는가? 는 말 안 해 주심
내가 알고 있기로는 명시적 형 변환 시에
에러 방지하기 위한 안정적 체크 수단으로 활용한다는 것
하나 알고 있다 ㅎㅎ
추상 클래스와 인터페이스에서는
클래스 - 인터페이스 : implements
인터페이스 - 인터페이스 : extends
인터페이스는 메소드 오버라이드를 할 수 없어서
인터페이스만 상속이 가능한 점 체크!
어느덧 abstract와 implement까지 와버렸다.
점점 예습했던 내용들이 끝나가는 시점
설레기도 하고 두렵기도 하다 ㅎㅎ
java 끝나면 DB나
어렵다는 서버 부분도 배워야 할 텐데 후후
화이팅!
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 4월' 카테고리의 다른 글
22.04.29 - Generic, 향상된 for문(enhanced for), 예외(Exception) (0) | 2022.05.10 |
---|---|
22.04.28 - Collection ( ArrayList, HashSet, HashMap), Stack, Queue (0) | 2022.05.03 |
22. 04. 26 - 상속(super, override), 다형성, 바인딩 (0) | 2022.04.29 |
22. 04. 25 - 시험, 주말 과제 발표 (0) | 2022.04.27 |
22. 04. 22 - 접근 제한자(Access Modifier), 인자 값을 받는 생성자 (0) | 2022.04.26 |