상속, 패키지, 제네릭컬렉션
그림은 "명품 자바프로그래밍" 책을 참고하였습니다.
5장. 상속 (=extends)
1. 장점
① 클래스의 간결화 - 멤버의 중복작성 불필요
② 클래스 관리용이 - 클래스의 계층적 분류
③ 생산성 향상 - 클래스의 재사용과 확장 용이
2. 특징
① 다중상속은 지원되지 않는다.
② 상속 횟수에 제한두지 않는다. (=무제한)
③ 모든 클래스는 java.lang.Object를 상속받는다.
3. 상속과 생성자
① 생성자의 목적은 객체초기화이다.
② 슈퍼클래스의 생성자 실행 후 서브클래스 생성자 실행
③ 슈퍼클래스의 생성자를 명시적으로 지정하지 않으면 슈퍼클래스의 기본생성자를 호출한다.
④ super()를 사용하거나 슈퍼클래스에 기본생성자 생성
⑤ super()은 항상 맨 첫 줄에 와야한다.
⑥ 모든 서브클래스의 생성자는 매개변수 유무에 상관없이 슈퍼클래스의 기본생성자와 짝을 이룬다.
4. 메소드 오버라이딩
① 슈퍼클래스에 선언된 메소드와 같은 이름, 같은 리턴타입, 같은 매개변수 타입과 개수를 갖는 메소드를 서브클래스에서 재 작성 하는 것
② 메소드 무시하기 혹은 덮어쓰기로 표현
③ 슈퍼클래스의 메소드를 무시하고 서브 클래스에서 오버라이딩 된 메소가 무조건 실행되게 하는 것을 동적바인딩이라 한다.
④ 오버라이딩의 목적은 하나의 인터페이스에 서로 다른 내용 구현이라는 다형성의 성질을 내포한다.
5. 오버라이딩 제약사항
① @Override 로 다음문장은 오버라이딩 할 것이니 오버라이딩이 정확한지 확인하도록 컴파일러에게 지시
② 동일한 원형으로 작성해야 한다.
③ 슈퍼클래스 메소드의 접근지정자보다 접근 범위를 좁혀 오버라이딩 할 수 없다.(확장은 가능)
④ static이나 private 또는 final로 선언된 메소드는 서브클래스에서 오버라이딩 할 수 없다.
6. 동적바인딩
① 실행할 메소드를 컴파일 시 결정하지 않고 실행 시 결정하는 것을 말한다.
② 오버라이딩 된 메소드가 있다면 동적바인딩을 통해 항상 실행되도록 보장한다.
7. 오버라이딩과 super메소드
① super는 슈퍼클래스에 대한 레퍼런스이다.
② super을 이용하면 슈퍼클래스의 필드와 메소드 모두 접근이 가능하다.
③ super로 메소드를 접근하면 정적바인딩이다.
④ this는 현재 객체 모든 멤버에 접근이 가능하고, super는 현재 객체의 슈퍼클래스 멤버에 접근이 가능하다.
⑤ this()와 super()는 모두 메소드 호출이며, this()는 생성자에서 다른생성자를 호출하고, super()는 서브클래스의 생성자에서 슈퍼클래스의 생성자를 호출할 때 사용한다.
8. 메소드 오버로딩 vs 메소드 오버라이딩
① 추상클래스를 작성할 때는 abstract 키워드와 함께 원형만 선언하고 코드는 작성하지 않는다.
② 추상클래스는 추상메소드를 포함하거나 포함하지 않을 수 있다. (추상메소드가 있으면 무조건 추상클래스로 선언)
③ 추상메소드를 포함한 추상클래스는 처음 상속받는 서브클래스에서 추상메소드를 구현하였다면 그 후 상속받는 서브클래스는 추상메소드를 필요에 따라 구현해도 되고 안해도 된다.
④ 추상메소드를 포함하지 않은 추상클래스는 서브클래스도 추상클래스이며 추상메소드를 선언해야 서브클래스가 추상클래스가 아닐 수 있다.
⑤ 오버라이딩은 내용이 있지만 추상메소드는 내용이 없다.
⑥ 추상클래스는 객체를 생성할 수 없다.
⑦ 추상클래스는 레퍼런스변수를 선언할 수 있다.
⑧ 추상클래스를 상속받는 서브클래스는 추상클래스의 추상메소드를 전부 구현하여야 한다.
⑨ 상수필드, 변수필드, 추상메소드, 일반메소드 전부 사용 가능
10. 추상클래스의 장점
① 추상클래스는 추상메소드를 통해 서브클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할을 하고, 서브 클래스는 추상메소드를 목적에 맞게 구현하려는 다형성을 실현할 수 있다.
② 추상클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다.
③ 계층적 상속관계를 가지는 클래스들의 구조를 만들 때 적합하다.
11. 인터페이스
① interface 키워드를 이용하여 선언한다.
② 인터페이스는 다양한 클래스에 들어갈 수 있다.
③ 추상메소드와 상수만 있고 필드가 없는 클래스
④ 모든 상수는 public static final 타입이며 생략가능
⑤ 모든 메소드는 public abstract 타입이며 생략가능
⑥ 다른 인터페이스에 상속가능
⑦ 인터페이스 타입의 레퍼런스변수는 선언 가능
12. 인터페이스 상속
① 인터페이스 상속은 extends를 사용
② 인터페이스는 다중상속을 허용(부모 여러 명 가능)
③ 인터페이스는 클래스에게 구현할 메소드들의 원형을 모두 알려주어, 클래스가 자신의 목적에 맞게 메소드를 구현하도록 하는 것이 목적이다.
13. 인터페이스 구현
① 인터페이스의 추상메소드를 모두 구현한 클래스를 작성하는 것을 말한다. implements 키워드를 사용한다.
14. 인터페이스의 목적
① 인터페이스는 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언이며, 클래스의 다형성을 실현하는 도구이다.
15. 인터페이스의 다중구현
① 클래스는 하나 이상의 인터페이스를 구현할 수 있다.
② 다중구현 시 각 인터페이스의 모든 추상메소드를 구현하여야 한다.
③ 클래스를 상속받음과 동시에 인터페이스를 구현할 수 있다.
16. 추상클래스 vs 인터페이스
17. 프로그램 제작 시 고려사항
- 다형성(Polymorphism) : 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현한 것을 말한다.
- 캡슐화(Encapsulation) : 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것을 말한다.
- 상속(Inheritance) : 슈퍼클래스에 만들어진 필드와 메소드를 서브 클래스가 물려받을 수 있도록 하는 것을 말한다.
- 추상클래스 : 추상메소드를 통해 서브클래스가 구현할 메소드를 명료하게 알려주는 것을 말한다.
- 인터페이스 : 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격선언을 말한다.
크게 상관없는 클래스들이 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우
사용하는 것을 말한다.
18. Wrapper 클래스
- 기본 타입의 값을 객체로 다룰 수 있게 하는 클래스이다.
19. 주요패키지
- java.lang : 시스템, 수학, 문자, 입출력 등 기본적인 클래스와 인터페이스 제공
import문을 사용하지 않아도 자동으로 import
- java.util : 날짜, 시간, 벡터, 해시맵 등 다양한 유틸리티 클래스와 인터페이스 제공
- java.jo : 키보드, 모니터, 프린터, 파일에 입출력하는 클래스와 인터페이스 제공
- java.awt / javax.swing : swing패키지로서 gui 프로그래밍에 필요한 클래스와 인터페이스 제공
20. boxing 과 unboxing
- boxing : 기본타입의 값을 Wrapper 객체로 변환하는 것
- unboxing : Wrapper 객체를 기본타입의 값으로 변환하는 것
21. 컬렉션(Collection)
① 배열이 가진 고정크기의 단점을 극복하기 위해 객체들을 쉽게 삽입, 삭제, 검색할 수 있는 가변크기의 컨테이너
② import java.util.* 로 호출
③ Vector<> 와 Arraylist<>는 가변 크기의 배열을 구현
④ Stack<> 은 stack을 구현 [Vector를 상속]
⑤ HashSet<> 은 집합을 구현
⑥ ③④⑤는 Collection<>을 상속받고,
단일클래스의 객체만을 요소로 다름
⑦ HashMap<K, V>은 키와 값의 쌍으로 이루어지는 데이터를 저장하고 키로 값을 쉽게 검색 가능
⑧ 제네릭타입을 가진 제네릭 클래스 이다,
22. 컬렉션의 특징
① 컬렉션 클래스 이름에는 타입매개변수가 포함
② 여러 타입의 값을 다룰 수 있도록 변신이 가능한 자료구조
③ 컬렉션을 사용할 때는 지정된 특정타입의 값만 저장가능
④ 컬렉션의 요소는 객체들만 가능(기본타입 불가능)
23. 제네릭(Generic)
① 클래스나 메소드를 타입 매개변수를 이용
② 타입매개변수(Generic type)을 이용하여 선언
③ c++의 템플릿과 동일
④ 형판 = 본 떠 찍어내기 위해 만들어진 틀
⑤ 즉, 클래스 코드를 찍어내듯이 생산할 수 있도록 일반화 시키는 도구
24. 제네릭 타입매개변수
① E = Element, 요소
② T = Type
③ V = Value
④ K = Key
25. 제네릭 사용법
① Vector<Integer> v;
정수형 벡터 제네릭컬렉션에 대한 레퍼런수변수 v 선언
② v = new Vector<Integer>( );
정수형 벡터 객체 선언
선언에서 크기를 정하지 않으면 Default 10
③ v.add(index, value); , ex) v.add(2, 100); 은
2번 index에 100을 넣고 기존 값들은 1index씩 밀기
null도 삽입 가능
④ v.remove(index); ex) v.remove(2); 는
2번 index의 값을 삭제 후 기존 값들은 1index씩 밀착
⑤ v.removeAllElements( ); 는 모든 인덱스 값 삭제
단, v.capacity( ); 는 그대로
⑥ v.capaciry( ); 는 선언된 공간크기 리턴
⑦ v.size( ); 는 사용하는 배열 개수 리턴
v.add(index, value); 시 size보다 큰 index에 넣기 불가
26. Iterator (컬렉션의 순차검색 용도)
Vector<Person> v = new Vector<Person>( );
Scanner sc = new Scanner(System.in);
while(sc.hasNext) {
name = sc.next();
age = sc.nextInt();
① v.add(new Person(name, age));
}
② Iterator<Person> it = v.iterator( );
③ while(it.hasNext()) {
④ Person p = it.next( );
⑤ System.out.println(p);
}
① Vector 객체 v에 Person type 객체 하나씩 생성
② Iterator 객체 it에 v의 요소를 순차적으로 검색할 수 있는 iterator( )를 호출하여 타입에 맞는 Iterator 객체 반환
③ 방문할 index가 있으면 true
④ 객체 p에 Person type객체를 반환 후 다음 index가리킴
= it로 v의 요소를 순차방문
⑤ 객체 자신을 출력하면 그 객체의 toString이 출력
27. HashMap <키, 값> (순차적으로 저장 x)
HashMap<String, String> dic
= new HashMap<String, String>( );
① dic.put(“apple”, “사과”);
① dic.put(“love”, “사랑”);
② Set<String> keys = dic.ketSet( );
③ Iterator<String> it = keys.iterator( );
while(it.hasNext()) {
String key = it.next();
④ String value = dic.get(key);
System.out.println(key + “, ” + value);
}
for (int i = 0; i < 3; i++) {
System.out.print(“찾을 단어 입력 = ”);
String word = sc.next( );
⑤ System.out.println(dic.get(word));
}
① put(key, value) 메소드는 key와 value를 받아 해시함수를 실행하고 해시함수가 리턴하는 위치에 key와 value를 저장
② keySet() 메소드는 해시맵의 모든 키를 담은 Set<K> 컬렉션 리턴
③ Iterator 객체 it에 keys의 key를 순차적으로 검색할 수 있는 iterator( )를 호출하여 타입에 맞는 Iterator 객체 반환
④ get()은 key의 value를 리턴
⑤ get(key) 메소드는 키를 이용하여 동일한 해시함수를 실행하여 값이 저장된 위치를 알아내어 값을 리턴
⑥ 위치를 알 수 없고, 삽입순서와도 관계 x
⑦ 삽입, 삭제 시간이 매우 빠름
⑧ 검색은 더욱 빠름
⑨ index를 이용하여 접근 불가
'Programming Language > JAVA' 카테고리의 다른 글
클래스와 객체 (0) | 2018.07.14 |
---|---|
test (0) | 2018.07.14 |
댓글