추상클래스
이 사진 하나로 추상클래스는 설명이된다.
public abstract class Shape {
public abstract double getArea();
public abstract double getPerimeter();
}
public class Circle extends Shape {
public static final double PI = Math.PI;
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return radius * radius * PI;
}
@Override
public double getPerimeter() {
return radius * 2 * PI;
}
}
추상클래스를 정의할 때에는 abstract class라고 정의해야하며
빈 메소드를 정의해야할 때도 '접근제어자 + abstract' 사용해야한다.
추상클래스를 상속 받을 때는 extends를 사용하면된다.
익명클래스
- 익명클래스를 익명이라고 부르는 이유는 분명 어떤 부모클래스를 상속받아 사용하는
자식클래스임에도 자식클래스의 이름이 명시되어있지 않다는 점 때문이다. (일회성)
- 아래 코드를 보면 horse 라는 인스턴스는 분명 AbstractAnimal 클래스이나 코드 안에는 Override 된 메소드가 있는 것으로 보아 다른 클래스인것을 확인할 수 있다. AbstractAnimal 클래스를 상속받는 자식클래스이나 자식클래스의 이름이 명시되어 있지 않다.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<AbstractAnimal> animals = new ArrayList<>();
animals.add(new Cat("맥스"));
animals.add(new Dog("심바"));
animals.add(new Pig("품바"));
for (AbstractAnimal animal : animals) {
System.out.print(animal.name + "의 울음 소리: ");
animal.cry();
}
AbstractAnimal horse = new AbstractAnimal("말"){
@Override
public void cry() {
System.out.println("히잉");
}
};
}
}
위 코드를 보면 그냥 클래스 선언하듯이 만들고 끝에 ;만 붙여두면 된다.
익명클래스를 이용한 메소드 추가사용
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
ArrayList<AbstractAnimal> animals = new ArrayList<>();
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("동물원에 어떤 동물을 키울까요?");
String name = sc.next();
System.out.println(name + "의 울음소리는 어떤가요?");
String sound = sc.next();
animals.add(new AbstractAnimal(name) {
@Override
public void cry() {
System.out.println(sound);
}
});
}
System.out.println("코드잇 동물원 보유 동물들");
for (AbstractAnimal animal : animals) {
System.out.println(animal.name);
animal.cry();
}
}
}
- 위코드는 인스턴스에 메소드를 추가로 사용시키는 방법이다. 코드를 보면 add 함수는 AbstractAnimal 클래스를 인수로 받아서 사용하는 클래스이나.
원래라면 class에 해당 메소드를 추가를 한후에 사용하겠지만, animals.add(new AbstractAnimal(name){});
이러한 형태로 익명클래스를 정의해서 새로운 자식클래스인 익명클래스를 만들어 바로 인수로 넘겨주는 형식인것이다.
Comparable 인터페이스
- Compareable 이라는 자바에서 기본적으로 지원하는 interface 이다.
- 주로 비교하거나 sort함수에서 무언가를 기준으로 정렬을 할것인가 할때 사용한다.
public class Card implements Comparable<Card>{
// 상수들, 바뀔 필요가 없기에 final로 정의하였고 getter, setter 함수가 없어도 된다. (상수기 떄문에)
public final int suitNumber;
public final int rankNumber;
// 생성자 인수 : 카드 종류, 카드 랭크
public Card(int suitNumber, int rankNumber) {
this.suitNumber = suitNumber;
this.rankNumber = rankNumber;
}
@Override
public int compareTo(Card o) {
if(suitNumber == o.suitNumber){
return rankNumber - o.rankNumber;
}
return suitNumber - o.suitNumber;
}
}
위코드를 보면 Card에 Comparable 인터페이스를 상속한다.
따라서 인터페이스에서 오버라이드 해야할 함수를 보면 compareTo가 있다.
이것을 이용해서 내림차순을 정렬한다. 위 코드에서 rankNumber 변수가 o.rankNumber 변수보다
크거나 같아도 내림차순으로 정렬한다.
compareTo 함수를 작성하는 방법은 다음과 같다.
- 현재객체 < 파라미터로 넘어온 객체 : 음수 리턴
- 현재객체 == 파라미터로 넘어온 객체 : 0리턴
- 현재객체 > 파라미터로 넘어온 객체 : 양수 리턴
음수혹은 0이 리턴되면 자리는 바뀌지 않지만 양수가 리턴되면 자리바꿈을 한다.
즉, 현재객체에서 파라미터로 넘어온 객체를 빼면 내림차순 정렬
파라미터에서 현재객체를 빼면 오름차순 정렬이다.
내림차순 : 작은것이 앞에 오는 정렬 : 현재객체 - 파라미터
오름차순 : 큰 것이 앞에 오는 정렬 : 파라미터 - 현재객체
이 compareTo 함수는 Collections, Array등 다양한 곳에 기본적으로 있는 함수를 여기서 오버라이딩 한것이다.
굳이 implement Comparable<Object> 코드를 사용하지 않고도 그냥 구현해도된다.
배열을 정렬할 때는 Arrays.sort(arr);
객체를 정렬할 때는 class Solution implements Comparable <Object>{ @overide compareTo }
'Programming language > Java' 카테고리의 다른 글
Java - [공식 Document 보는방법] (0) | 2020.10.28 |
---|---|
Java - IntellJ [단축키] (0) | 2020.10.21 |
Java - 13 [Generic, 인터페이스] (0) | 2020.10.21 |
Java - 12 [캐스팅] (0) | 2020.10.19 |
Java - 실무6 [블랙잭] (0) | 2020.10.19 |