본문 바로가기

JAVA

#32 [JAVA] 인터페이스, 접근제한자, 컬렉션 프레임워크(ArrayList, Vector, LinkedList)

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 가능 : 부모가 엄격하다면 자식은 엄격 ~ 풀어놓기 가능

=> 자식이 부모보다 더 엄격할 수 없다.

부모가 public 이니까 자식은 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

- 강제형변환 하기전 변환이 가능한지, 인터페이스에 자식클래스가 있는지 조사할 때 사용