추상 클래스 요약
추상 클래스는 클래스의 상속에서만 다룬다.
추상 클래스가 부모 클래스이다.(추상화된 상태)
자식 클래스는 부모 클래스에 추상 메소드가 있을 때 반드시 재정의해야 한다.
이렇게 구현했을 때 구체화된 것이고 (자식 클래스)객체를 생성할 수 있다.
추상 클래스 예제: AnimalCommunity
Animal 추상 클래스
8,9라인 private 접근 제한을 갖는 필드 name, color를 선언한다.
11,12라인 출력문이 있는 기본 생성자를 선언한다.
15라인 this()로 자신의 기본 생성자 메소드를 호출하여 커스텀 생성자를 선언한다.
22라인 추상 메소드 sound()를 선언한다.
26라인 toString() 메소드를 재정의(오버라이드)한다.
각 클래스에 해당하는 TYPE 필드값을 출력하고 싶을 경우, Animal 클래스의 toString() 메소드에 TYPE 출력문을 작성하지 않고, 각각의 자식 클래스에서 toString() 메소드를 오버라이드하여 출력한다.
Puppy 클래스
3라인 Puppy 클래스는 Animal 클래스의 상속을 받는다.
5라인 static final TYPE 필드를 선언한다.
8라인 기본 생성자를 선언한다.
10,11라인 커스텀 생성자를 선언하고, Animal 클래스의 생성자 메소드를 호출한다.
15~17라인 추상 메소드 sound()를 재정의한다.
20라인 toString() 메소드를 재정의한다.
21라인 super 키워드로 Animal의 toString() 메소드를 호출하고 TYPE 필드 출력문을 추가한다.
Cat 클래스
3라인 Cat 클래스는 Animal 클래스의 상속을 받는다.
5라인 static final TYPE 필드를 선언한다.
7라인 기본 생성자를 선언한다.
10,11라인 커스텀 생성자를 선언하고, Animal 클래스의 생성자 메소드를 호출한다.
15,16라인 추상 메소드 sound()를 재정의한다.
19라인 toString() 메소드를 재정의한다.
20라인 super 키워드로 Animal의 toString() 메소드를 호출하고 TYPE 필드 출력문을 추가한다.
Rabbit 클래스
3라인 Rabbit 클래스는 Animal 클래스의 상속을 받는다.
5라인 static final TYPE 필드를 선언한다.
7라인 기본 생성자를 선언한다.
10,11라인 커스텀 생성자를 선언하고, Animal 클래스의 생성자 메소드를 호출한다.
15,16라인 추상 메소드 sound()를 재정의한다.
19라인 toString() 메소드를 재정의한다.
20라인 super 키워드로 Animal의 toString() 메소드를 호출하고 TYPE 필드 출력문을 추가한다.
Member 클래스
4,5라인 private 접근 제한을 갖는 필드 name, age를 선언한다.
7라인 커스텀 생성자를 생성한다.
15라인 boolean타입을 반환하고 Animal타입 인자를 갖는 메소드 isAdopt()를 선언한다.
18~20라인 instanceof 연산자로 animal의 타입을 확인하고, 14라인의 처리 조건에 맞게 if문을 작성한다.
21~22라인 타입에 해당하는 조건이 맞지 않을 경우 false를 반환한다.
25라인 toString() 메소드를 재정의한다.
AnimalCommunity
10라인 참조 값을 저장할 배열 animals를 선언하고 길이는 5로 한다.
12~17라인 animals의 인덱스에 자식 클래스 타입의 객체를 생성하여 저장한다.
21~23라인 animals의 인덱스의 값이 null이 아니라면 인덱스와 저장된 객체의 toString() 메소드를 출력한다.
26~28라인 animals의 인덱스의 값이 null이 아니라면 저장된 객체의 sound() 메소드를 호출한다.
33라인 Member 객체를 생성하고 필드 값을 저장한다.
34~37라인 isAdopt() 메소드로 분양 가능한 나이인지 확인한다. (animals[1]은 cat, 18세 이상이므로 false 반환)
39~41라인 Scanner 클래스로 원하는 동물의 번호를 입력 받는다.
44~47라인 if문과 isAdopt() 메소드로 분양 가능 여부에 따른 출력문을 출력한다.
결과
추상 클래스, ArrayList 예제: AnimalCommunity2
문제: AnimalCommunity를 ArrayList로 구현합니다.
10라인 ArrayList 클래스로 변수 aniList를 선언한다.
14,15라인 get() 메소드로 1번 인덱스 값(Cat())을 가져와 필드 값을 저장한다.
20~22라인 인덱스 값이 null이 아니면 get() 메소드로 각 인덱스에 저장된 값을 출력한다.(toString() 생략)
26~28라인 인덱스 값이 null이 아니면 get() 메소드로 각 인덱스에 저장된 객체의 sound() 메소드를 호출한다.
30라인 Member 객체를 생성하고 필드 값을 저장한다.
32~34라인 Scanner 클래스로 원하는 동물의 번호를 입력 받는다.
37~40라인 if문과 isAdopt() 메소드로 분양 가능 여부에 따른 출력문을 출력한다.
메소드 오버로딩(overloading)
클래스 내에 같은 이름의 메소드를 여러개 선언하는 것을 말한다.
인자의 타입, 개수, 순서 중에 다른 것이 있어야 한다.
오버로딩으로 인자값을 다양하게 받아 처리할 수 있다.
반환값 형식은 같을 수도, 다를 수도 있다.
* 참고. 인자 타입이 Object(최상위 클래스)이면 모든 클래스를 참조할 수 있다.
MyMath 클래스
6라인 arrayMaxValue() 메소드는 int타입 배열 인자를 받아 최대값을 int타입으로 반환한다.
15라인 arrayMaxValue() 메소드는 double타입 배열 인자를 받아 최대값을 double타입으로 반환할 수도 있다.(오버로딩)
46라인 arrayAvgValue() 메소드는 int타입 배열 인자를 받아 평균값을 double타입으로 반환한다.
55라인 arrayAvgValue() 메소드는 double타입 배열 인자를 받아 평균값을 double타입으로 반환한다.(오버로딩)
오버로딩 예제
11라인 Math 클래스의 min() 메소드는 두 인자 중 작은 값을 반환하는 메소드이다. 인자에 따라 리턴 타입이 다르다.
12라인 int타입 인자를 받으면 int타입을 반환하고, double타입 인자를 받으면 double타입을 반환한다.
32라인 배열에 객체를 생성하면서 저장할 수도 있다.
38라인 MyMath 클래스의 arrayMaxValue() 메소드로 정수 배열인 arr1의 최대값을 정수 값으로 반환한다.
39라인 MyMath 클래스의 arrayMaxValue() 메소드로 실수 배열인 arr3의 최대값을 실수 값으로 반환한다.
40라인 MyMath 클래스의 arrayAvgValue() 메소드로 정수 배열인 arr1의 평균값을 정수 값으로 반환한다.
41라인 MyMath 클래스의 arrayAvgValue() 메소드로 실수 배열인 arr3의 평균값을 실수 값으로 반환한다.
'수업 일지 > JAVA' 카테고리의 다른 글
16일차 - [JAVA] 날짜,시간 클래스/인터페이스 (0) | 2022.01.20 |
---|---|
15일차 - [JAVA] Math 클래스/예외 처리/파일 입력/파일 출력 (0) | 2022.01.19 |
13일차 - [JAVA] Map/증감 연산자/추상 클래스 (0) | 2022.01.17 |
12일차 - [JAVA] ArrayList/향상된 for문 (0) | 2022.01.14 |
11일차 - [JAVA] 클래스/객체/상속 (0) | 2022.01.13 |
댓글