chap08 : 인터페이스
(클래스 ~ 인터페이스까지가 젤 중요)
sec01 - exam01 : 인터페이스 : 명칭 표준화 (추상클래스보다 인터페이스를 더 많이 씀)
: 속성은 무조건 전역상수가 됨 ( ex. int MAX_VOLUME = 10;) -> 바로 값을 넣어야함
: 함수는 무조건 추상함수가 됨 -> abstract, {} 없음
RemoteControl : 인터페이스 #1
1. 클래스 만들때 인터페이스로 만들면 앞에 아이콘과 class 대신 interface 가 붙음
2. 인터페이스에서는 속성이라는 건 없고, 무조건 속성처럼 정의하면 전역상수가 된다(static final 이 생략되어있음)
그래서 바로 값을 넣어야함!
3. 인터페이스에서 모든 함수는 추상함수가 된다! abstract 가 안붙어있어도 무조건 중괄호가 없는 추상함수임
그래서 중괄호 쓰면 안되고 예약어 abstract 를 붙일 필요가 없음!!
Searchable : 인터페이스 #2
1. 함수 만들기 : 검색 함수
2. 자식클래스가서 Searchable도 상속받기 = 다중상속 (인터페이스는 상속보다는 구현이라는 말을 더 많이 씀)
SmartTelevision : 자식클래스
<1. RemoteControl 인터페이스 >
1. 인터페이스도 상속가능! implements RemoteControl
2. 속성 작성
3. 오버라이딩 alt + insert -> 메소드 구현 클릭하는게 좋음
4. 함수 값 수정
5. setVolume 은 조건문으로 만들기
volume > RemoteControl의 전역상수인 MAX_VOLUME 이면
이 volume 값에 RemoteControl.MAX_VOLUME 하겠다
<2. Searchable 인터페이스 >
1. 상속 하나더 받기
2. 오버라이딩
SmartApplication 실행클래스
<1. RemoteControl 인터페이스 >
1. 자식 클래스 만들고
2. RemoteControl 클래스에 자식 클래스 저장
* 볼륨을 1보다 작게해도 1이 나온다.
* 볼륨을 10보다 크게해도 10이 나온다.
<2. Searchable 인터페이스 >
1. 자식 클래스는 이미 만들어져있고
2. Searchable 클래스에 자식 클래스 저장
인터페이스는 생성자함수가 없어서 new 붙이면 안됨
* 자바에서의 다중상속의 문제점
부모클래스 1 | 부모클래스 2 |
void sum(){} | void sum(){} |
=> 자식클래스가 상속받음 : 부모 1,2로 부터 재산을 다 상속받음
sum을 실행하면 1,2중에 누가 실행될지 모름 -> 에러발생하여 자바에서는 금지
* 인터페이스에서는 다중상속 가능
인터페이스는 무조건 함수 재정의를 해야함 = 자식쪽에서 sum을 하나 만들어야함
1,2 중에 누가 실행되는지 상관없이 무조건 자식 sum이 실행됨
=> 그래서 클래스는 다중 상속이 안되고 인터페이스는 다중 상속이 가능함
sec01 - exam02 : 인터페이스 연습 : 자식클래스 완성하기
RemoteControl : 인터페이스
Television : 자식클래스 #1
1. 인터페이스 상속받기
2. 오버라이딩 후 함수 출력값 바꾸기
Audio : 자식클래스 #2
1. 인터페이스 상속받기
2. 오버라이딩 후 함수 출력값 바꾸기
RemoteApplication : 실행클래스
* 헷갈리는거 참고!!
=> 두줄을 한줄로 만든것
sec02 - exam01 : 인터페이스를 이용한 다형성 : #1 대입연산자
Tire : 인터페이스
1. 함수 만들기 : 모든 함수는 추상함수
KumhoTire : 자식클래스 #1
1. 인터페이스 상속받기
2. 오버라이딩
HankookTire : 자식클래스 #2
1. 인터페이스 상속받기
2. 오버라이딩
Car : 여기서 인터페이스 사용
Car 클래스는 실행클래스가 아니다! 실행클래스에서 쓸때 frontTire가 변수가 되는거지 여기서는 그냥 속성명임
frontTire와 backTire의 속성에 HankookTire의 클래스를 끼워넣은것!!
* 이해를 돕기위한 참고
1. Car : 여기서 오른편에 있던 값 new HankookTire(); 를 없애고
2. CarApplication : 여기에 car.frontTire = new HankookTire(); 를 넣으면 똑같음
CarApplication : 실행클래스
sec02 - exam02 : 인터페이스를 이용한 다형성 : #2 함수 (함수의 매개변수를 이용)
Soundable : 인터페이스 : 부모역할
Cat : 자식클래스 #1
1. 상속받기
2. 함수재정의
이번에는 return 예약어써서 출력해보기 -> 문자열 "야옹" 이 나옴
Dog : 자식클래스 #2
1. 상속받기
2. 함수재정의
이번에는 return 예약어써서 출력해보기 -> 문자열 "멍멍" 이 나옴
여기에 출력하는 함수가 없음
그래서 실행클래스에서 print라는 함수가 soundable.sound()를 출력하는 함수니까
밑에 print의 매개변수에 dog를 넣으면 "멍멍" 이 출력됨
SoundableApplication : 실행클래스
main 함수 위에 전역함수 만들어보기 : 앞에 static 붙이면 됨
sec02 - verify - exam01 : 자식클래스 완성하기
Vehicle : 인터페이스
Bus : 자식클래스
BusApplication : 실행클래스
* 강제 자동형변환
sec02 - verify - exam02 : 자식클래스 직접 만들어보기
Flyable : 인터페이스 #1
Swimable : 인터페이스 #2
Bat : 자식클래스
Sparrow : 자식클래스
Whale : 자식클래스
DriverApplication : 실행클래스
sec02 - verify - exam03 : 자식클래스 완성하기
Buy : 인터페이스 #1
Sell : 인터페이스 #2
Customer : 자식클래스
order은 일반함수
CustomerApplication : 실행클래스
instanceof : seller 변수가 Customer 클래스인가 체크
order은 재정의 함수가 아니라 일반 함수
sec03 - exam01 : 접근제한자 4가지
korea 패키지 - Person : 부모클래스
korea 패키지 - Korean : 자식클래스 #1
1. Person 상속받기
2. 출력해보기 : protected, default, private
3. 함수 재정의
부모 public -> 자식 public 가능, default 불가 : 부모가 풀어놓는다면 자식은 풀어놓기만 가능
부모 default -> 자식 public 가능, default 가능 : 부모가 엄격하다면 자식은 엄격 ~ 풀어놓기 가능
=> 자식이 부모보다 더 엄격할 수 없다.
other 패키지 - Amerian : 자식클래스 #2
1. 다른 패키지면 korea.Person이 import 되어있어야 함
2. 출력해보기 : protected, default
chap15 : 컬렉션 프레임워크
(코딩테스트, 포트폴리오, 프로젝트, 기술면접 多)
sec01 - exam01 : 컬렉션 프레임워크 - ArrayList ★ 이거만 기억해도 됨 + List 계열 특징 ★
: 자바에서 사용되는 자료구조(여러가지 값 저장하는 구조)를 통칭함
ArrayList, Vector, LinkedList : 이미 자바에서 상속받아놨음
ArrayListApplication
1. main 함수
2. List<자료형> list = new ArrayList<>(); 하면 빨간줄뜨는데 alt + enter -> 자동으로 import 해줌
3. 값 추가 : 변수.add(값);
4. 출력
(배열은 배열형태로 출력해야하는데, 향상된 배열은 변수만 적으면 바로 출력됨)
5. 값 수정 : 변수.set(인덱스번호, 값);
6. 출력
7. 값 삭제 : 변수.remove(인덱스번호);
8. 출력
9. 값 조작하기(반복문) : 변수.get(인덱스번호);
sec01 - exam02 : 컬렉션 프레임워크 - Vector
equals(문자열), hashCode()
String : 문자열 클래스. 이미 함수재정의가 되어있어서 값을 바로 비교할 수 있음
cf) 값 비교 : 기본자료형(int, char, long 등)은 == 사용
cf) 문자 비교 : equals 사용
.equals (문자열) : 일반클래스들은 비교를 못함. 개발자가 만든 Member, Student 등등 일반 클래스는 불가
String 클래스만 값 비교 가능
그래서 일반클래스는 그냥 사용하면 주소값(방번호)이 비교됨. 값을 비교하려면 함수재정의를 해야한다.
Board
1. 속성 작성 ★ 이걸 작성해야 생성자, 동등비교 가능 ★
2. alt + insert 로 생성자 만들기
3. alt + insert -> equals() 및 hashCode() 생성 클릭 -> 다음 -> 다음 -> 생성
크게 캡쳐
BoardApplication
1. main 함수
2. Vector 클래스 생성 : 클래스 변수 = new 생성자함수();
List<Board> // 여기서 Board 클래스도 자료형
빨간줄 : alt + enter : 자동 import 해줌
3. List<Board> list = new ArrayList<>(); 에서 ArrayList 를 Vector 로 수정
4. 너무 길어서 매개변수를 집어넣는곳에 바로 넣기
5. 출력해보기
6. 값이 아니라 방번호가 출력됨
다시 Board가서 재정의하기
1. alt + insert -> toString() 클릭 -> 확인 -> 저절로 만들어줌
=> 그냥 출력하면 방주소가 출력됨
=> 속성값을 출력하도록 함수 재정의를 해야함
보라색이 속성값
equals(), hashCode(), toString()
이 3가지는 꼭 함수재정의를 해야함
다시 BoardApplication 가서 출력해보기
1. 값 출력
2. 값 삭제
3. 배열값 반복문 돌려서 출력하기
* ArrayList, Vector 상관없이 형태는 다 똑같음
get(); size(); add() remove();
그 이유 :
List : 인터페이스 : 부모
-> ArrayList로 함수 재정의 (상속받음) : 자식
-> Vector로도 함수 재정의 (상속받음) : 자식
그래서 알맹이가 ArrayList 든지 Vector 든지 함수이름이 똑같은 것
sec01 - exam03 : 컬렉션 프레임워크 - ArrayList vs LinkedList 속도비교 : 기술면접대비
LinkedListApplication
<ArrayList 측정>
1. main 함수 - ArrayList, LinkedList 작성
2. 변수 생성
3. 처음시간 -> 시간측정함수
4. 반복문 : 10000번 반복문 돌리는데 걸린 시간
5. 종료시간 -> 시간측정함수
<LinkedList 측정>
<시간 비교>
<인터페이스>
1. 인터페이스
- 객체의 사용방법을 정의, 인터페이스는 추상클래스와 유사하며 모든 속성은 상수, 모든 함수는 추상함수
- 인터페이스는 부모로 사용되고, 구현된 클래스는 자식클래스(재정의된 함수)
- 그래서 다른 개발 코드가 인터페이스의 함수를 호출하면 인터페이스는 객체의 재정의된 함수를 호출해줌
2. 상수 속성 : 전역 상수
인터페이스는 기본적으로 속성이 공유상수로(상수)로 이루어져 있음 - public static final 생략됨
관례적으로 모두 대문자로 작성되며, 선언 시 반드시 값 대입
3. 함수 속성 : 전역 함수(추상 함수)
인터페이스에 선언된 함수는 public abstract, {} 가 생략되어있으며, 함수 선언부만 있는 추상함수
구현 클래스는 반드시 추상함수를 재정의 해야함
4. implements
구현 클래스는 어떤 인터페이스로 사용 가능한지 기술하기위해 클래스 선언시 implements 키워드를 사용함
5. 인터페이스 사용
(부모)인터페이스 변수 = new (자식)구현클래스();
<속성(필드) 다형성>
1. 자동형변환
- 기본자료형에 자동형변환/강제형변환이 있듯이, 인터페이스에도 있음
- 구현 객체가 인터페이스 변수에 대입되는 것(저장)
2. 다형성
- 상속은 같은 종류의 하위 클래스를 만드는 기술이고,
인터페이스는 사용 방법이 동일한(함수가 동일한) 클래스를 만드는 기술.
- 다형성을 구현하는 방법 (함수재정의 + 타입변환)은 똑같음
3. 강제형변환
- 인터페이스에 저장된 구현 객체를 다시 원래 구현 클래스 타입으로 변환하는 것
4. instanceof
- 강제형변환 하기전 변환이 가능한지, 인터페이스에 자식클래스가 있는지 조사할 때 사용