Programming Language/JAVA

상속, 패키지, 제네릭컬렉션

D4tai1 2018. 7. 14.

그림은 "명품 자바프로그래밍" 책을 참고하였습니다.


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 메소드 오버라이딩

 

9. 추상클래스

추상클래스를 작성할 때는 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);

2index100을 넣고 기존 값들은 1index씩 밀기

null도 삽입 가능

v.remove(index); ex) v.remove(2);

2index의 값을 삭제 후 기존 값들은 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 객체 vPerson type 객체 하나씩 생성

Iterator 객체 itv의 요소를 순차적으로 검색할 수 있는 iterator( )를 호출하여 타입에 맞는 Iterator 객체 반환

방문할 index가 있으면 true

객체 pPerson type객체를 반환 후 다음 index가리킴

= itv의 요소를 순차방문

객체 자신을 출력하면 그 객체의 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) 메소드 keyvalue를 받아 해시함수를 실행하고 해시함수가 리턴하는 위치에 keyvalue를 저장

keySet() 메소드해시맵의 모든 키를 담은 Set<K> 컬렉션 리턴

Iterator 객체 itkeyskey를 순차적으로 검색할 수 있는 iterator( )를 호출하여 타입에 맞는 Iterator 객체 반환

get()keyvalue를 리턴

get(key) 메소드는 키를 이용하여 동일한 해시함수를 실행하여 값이 저장된 위치를 알아내어 값을 리턴

위치를 알 수 없고, 삽입순서와도 관계 x

삽입, 삭제 시간이 매우 빠름

검색은 더욱 빠름

index를 이용하여 접근 불가

 


'Programming Language > JAVA' 카테고리의 다른 글

클래스와 객체  (0) 2018.07.14
test  (0) 2018.07.14

댓글