본문 바로가기

Programming language/Java

Java - 14 [추상클래스, 익명클래스, Comparable 인터페이스]

추상클래스

이 사진 하나로 추상클래스는 설명이된다.

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