TIL

2023-10-20 TIL (추상클래스와 인터페이스의 차이점)

우성팔 2023. 10. 20.

추상클래스

추상클래스( 미완성된 메서드를 가진 미완성된 클래스)를 사용하는 경우

  • 클래스들의 공통된 특징을 묶고 싶을경우
  • 부모 클래스의 어떤 메소드를 자식 클래스에서 반드시 구현해서 사용하게 할 때 

→ 반드시 오버라이딩을 해야하는 상황에서 사용!

 

abstract class A{
    private int a;
    ...
    abstract int somethingMethod();
    ...
    }
    
   Class B extends A{
        private int b;
        @Override
        int somethingMethod(){

        ....
        return 0;

        }
}

추상 클래스를 상속받으면 추상 클래스의 추상 메서드는 반드시! 반드시 구현해야 한다

 

 

인터페이스

빈 메소드를 정의하고, 인터페이스를 상속받는 클래스는 빈 메소드를 정의하여 사용해야 함!

interface Calculatable{
    public int add(int a, int b);
    public int sub(int a, int b);
    public int mul(int a, int b);
    public double div(int a, int b);
}

Class NormalCalculator implements Calculatable{
    public int add(int a, int b) {...}
    public int sub(int a, int b) {...}
    public int mul(int a, int b) {...}
    public double div(int a, int b) {....}
    // 일반용 계산기에 필요한 다른 메소드들
}

Class EngineeringCalculator implements Calculatable{
    public int add(int a, int b) {...}
    public int sub(int a, int b) {...}
    public int mul(int a, int b) {...}
    public double div(int a, int b) {....}
    // 공학용 계산기에 필요한 다른 메소드들
}

일반 계산기와 공학 계산기를 예로 들면

계산기로써 가져야 할 공통적인 기능들을 Calculatable 인터페이스에 선언해주고 

각각의 클래스에서 Calculatable 인터페이스를 implements 해줘서 사용한다!

 

인터페이스는 멤버변수를 가질 수 없음!

 

추상 클래스와 인터페이스 차이점

경우에 따라서는 두 개를 바꿔 사용해도 가능하다

 

하지만!

 

추상클래스 = 구체적인 여러 클래스들을 일반화된 개념으로 묶은 것

ex.

사과, 포도, 바나나 = 과일

슬리퍼, 운동화, 구두 = 신발

 

인터페이스 = 여러 클래스들을 행위적 일관성으로 묶은 것

(행위적인 것이기 때문에 인터페이스명은 -able 로 짓기!)

ex.

선풍기, 헬리콥터, 바람개비 = 회전할 수 있는

비행기, 잠자리, 독수리 = 날 수 있는

 

 

 

오늘의 프로그래머스 문제!

최빈값 구하기

def solution(array):
    cnt = [0] * len(array)
    for i in array:
        cnt[i] += 1 // array에 담긴 숫자별로 횟수를 cnt배열에 저장
 
    if cnt.count(max(cnt)) > 1: // array에 가장 많은 수(최빈값)가 1개 보다 많으면 -1 반환
        return -1
    
    return cnt.index(max(cnt)) // 위의 if문에 해당하지 않으면 최빈값은 1개이므로 최빈값 반환

 

이렇게 풀었다!

 

다른분께서 풀은 것을 보니

 

def solution(array):
    while len(array) != 0:
        for i, a in enumerate(set(array)): # array를 세트형으로 만들어서 중복값 없애고 i,a 에 인덱스, 숫자 대입
            # print(f'i = {i}, a = {a}, array = {array}')
            array.remove(a) # 세트형이 아닌 초기 array에서 a를 삭제하면 중복값이 있으면 중복값 중 하나가 삭제되고 단일값이면 array에서 아예 없어짐
        if i == 0: # 5번째줄에서 삭제되다가 값이 하나 남으면 i값은 0에서 멈추기 때문에 리턴해주면서 while문도 탈출
            return a
    return -1 # while문을 다 돌아도 6번째 if문에 해당하지 않는다면 즉, 최빈값이 1개가 아니라면 -1 반환
    
    
    # array = [1,2,3,3,3,4,4] 일 때 출력값들
    # 
    # i = 0, a = 1, array = [1, 2, 3, 3, 3, 4, 4]
    # i = 1, a = 2, array = [2, 3, 3, 3, 4, 4]
    # i = 2, a = 3, array = [3, 3, 3, 4, 4]
    # i = 3, a = 4, array = [3, 3, 4, 4]
    # i = 0, a = 3, array = [3, 3, 4]
    # i = 1, a = 4, array = [3, 4]
    # i = 0, a = 3, array = [3]
    # 3

간단하지만 생각해내기가 쉽지 않을 것 같은데 똑똑한 사람들이 많은 것 같다!

'TIL' 카테고리의 다른 글

2023-10-24 TIL(프로그래머스)  (0) 2023.10.24
2023-10-23 TIL(컬랙션)  (0) 2023.10.23
2023-10-19 TIL (git, 프로그래머스)  (0) 2023.10.19
2023-10-18 TIL (프로그래머스)  (2) 2023.10.19
2023-10-17 TIL(프로그래머스)  (5) 2023.10.17

댓글