[JAVA] 템플릿 메서드, 인터페이스, ArrayList

지수·2021년 7월 3일
0

플레이데이터

목록 보기
5/50
post-thumbnail

💬 5일 간 자바 수업 후기: 일주일 내내 조급한 마음으로 바쁘게 공부했더니 금요일날 넉다운했다...👻 자바를 5일만에 배우다니 아직 내가 100% 흡수하진 못했으니 배웠다기보다는 접해봤다라는게 맞을 것 같다. 너무 조급하게 생각하지 말고 꾸준히 복습하고 배워나간다고 생각해야겠다. 금요일에는 마라샹궈 먹고 9시에 뻗어버려서..ㅋㅋ 조금 늦었지만 주말에 복습해야하는 내용 공부하고 TIL 적는다.🔥

1. 템플릿 메서드

추상 클래스와 템플릿 메서드

템플릿 메서드는 추상 클래스를 활용한 예(=추상 클래스를 사용하여 구현할 수 있음)로 디자인 패턴의 한 방법
모든 객체 지향 프로그램에서 사용하는 구현 방법

💡 템플릿 메서드(template method)

  • 템플릿 메서드는 한 마디로 틀이 있는 메서드
  • 템플릿 메서드는 메서드 실행 순서와 시나리오를 정의하는 것
  • 실행 순서, 시나리오를 정의한 것이기 때문에 바뀔 수 없음(재정의 불가)
  • final 예약어를 사용하여 구현

🔥 템플릿 메서드 = = 메서드 실행 순서 = 메서드 실행 시나리오
▶ 바뀌지 않음! ▶ final 예약어 사용

final public void run() {
    startCar();
    drive();
    stop();
    turnOff();
}

위의 run() 메서드가 템플릿 메서드의 예시
Car라는 추상 클래스에서 차별로 start, drive, stop, turn-off 방법은 각자 다를 수 있지만(상속 받는 클래스에서 각각 구현),
시동을 켜고 - 운전하고 - 멈추고 - 시동을 끄는 일련의 과정은 모두 동일
이러한 과정을 템플릿 메서드로 고정시켜 놓고
테스트 코드에서 run() 메서드를 실행시키면 각 차종별(상속 받은 클래스) 동작과정 확인 가능


템플릿 메서드와 다형성

  • 상위 클래스인 추상 클래스는 하위에 구현된 여러 클래스를 하나의 자료형(상위 클래스 자료형)으로 선언하거나 대입할 수 있음
  • 추상 클래스에 선언된 템플릿 메서드를 호출하면 가상 메서드에 의해 각 하위 클래스에 구현된 기능이 호출
  • 하나의 코드(템플릿 메서드 하나로)가 다양한 자료형을 대상으로 동작하는 다형성 구현

final 예약어

💡 final 예약어

  • 마지막이라는 의미로 더 이상 수정 불가능하다는 의미
  • 변수 / 메서드 / 클래스 에서 사용 가능
사용 위치설명
변수final 변수는 상수를 의미
메서드final 메서드는 하위 클래스에서 재정의 ❌
클래스final 클래스는 상속 ❌

final + 변수

final 예약어를 사용해서 선언한 변수는 상수
상수 값은 해당 파일 안에서만 정의해서 사용 가능

🧨 public static final을 이용하여 선언하면 여러 파일에서 공유해서 사용 가능

  • public : 외부 클래스 어디에서나 접근 가능(가장 개방적)
  • static : 하나만 만들어서 공통(공유)으로 사용, 기준 + 인스턴스 생성과 관련없이 클래스.변수명으로 호출
  • final : 마지막으로 선언, 변경 불가

final + 클래스/메서드

final 예약어를 사용해서 선언한 클래스는 상속 불가
상속을 하면 그 안의 변수나 메서드를 재정의할 수 있게 되는데,
final로 정의하면 메서드 안의 변수나 내용이 수정되지 않고 그대로만 사용

  • 보안과 관련이 있는 클래스를 만드는 경우 사용
  • 기반 클래스가 변하면 안되는 경우 사용
  • JDK 제공 클래스 중 예) String 클래스, Integer 클래스

🧨 final 클래스 : 상속이 불가해서 그 안의 변수, 메서드 모두 수정 및 재정의 불가능
🧨 final 메서드 : 일반 클래스 안에 final 메서드가 있다면 해당 클래스를 상속받는 하위 클래스가 있다고 하더라도 final 메서드는 재정의 할 수 없음

cf. final 메서드를 포함했다고, 다 final 클래스는 아님
반면, abstract 메서드를 포함하는 클래스는 다 abstract 클래스임



2. 인터페이스

인터페이스란?

💡 인터페이스(interface)
클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언

  • 추상 메서드상수로만 이루어져 있음
  • 구현된 코드가 없음, 메서드의 경우 {} body가 없음 ▶ 추상 메서드
  • 구현 코드가 없기 때문에 인스턴스 생성 불가 ▶ 추상 클래스
public interface Calc {
    double PI = 3.14;
    int ERROR = -999999;
    
    int add(int num1, int num2);
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);
}

🧨 인터페이스에서 선언하는 메서드는 public abstract 쓰지 않아도 컴파일 과정에서 추상 메서드로 자동 변환됨
🧨 인터페이스에서 선언한 변수는 public static final 쓰지 않아도 컴파일 과정에서 변하지 않는 상수로 자동 변환됨


인터페이스의 구현과 형 변환

인터페이스 구현

인터페이스를 클래스가 (상속처럼 받아서) 사용하는 것을
'클래스에서 인터페이스를 구현한다(implements)'라고 표현함
cf. 상속은 extends, 구현은 implements

  • 인터페이스를 구현하는 클래스는 인터페이스 내에 선언된 추상 메서드를 모두 구현해야 함
  • 일부만 구현할 경우, 해당 클래스 또한 추상 클래스로 선언해야함

인터페이스 형 변환

인터페이스 -- implements -- 추상 클래스 -- extends -- 일반 클래스

이 때,
인터페이스를 추상 클래스가 구현하는 것을 타입 상속,
추상 클래스를 일반 클래스가 상속하는 것을 구현 상속이라함


인터페이스와 다형성

  • 인터페이스는 클라이언트 프로그램에 어떤 메서드를 제공하는지 미리 알려주는 명세 또는 약속의 역할
  • 인터페이스를 통해 이를 구현(implements)한 클래스가 어떤 기능의 메서드를 제공하는지 명시

인터페이스를 통해 구현 코드 전체를 살펴보지 않고,
인터페이스 선언부만 봐도 클래스와 내부 메서드들을 어떻게 사용할 지 알 수 있음

인터페이스를 구현하는 각 클래스의 구현 방법을 몰라도,
인터페이스에서 선언된 매개 변수, 반환 값을 보고 클래스를 사용할 수 있음


인터페이스 요소

인터페이스 상수

인터페이스는 추상 메서드로 이루어지므로,
인스턴스 생성 ❌, 멤버 변수 사용 ❌

  • 변수 선언시, 자동으로 상수로 변환되기 때문에 오류 안생김
  • 해당 변수는 인스턴스 생성과 관계없이 사용 가능하기 때문에 클래스.변수명으로 호출
  • 상수는 변수명 모두 대문자로 표기 권장 예) MAX, MIN 등

디폴트 메서드

💡 디폴트 메서드(default method)
: 인터페이스에서 구현 코드까지 작성한 메서드
인터페이스를 구현하는 클래스에 기본적으로 제공할 메서드
default 예약어를 사용하여 선언

public interface Calc {
...
    default void description() {
     System.out.println("정수 계산기를 구현합니다.");
     }
}
  • default 메서드는 인터페이스에 이미 구현되어 있으므로 인터페이스를 구현한 추상 클래스나, 해당 추상 클래스의 하위 클래스 등에서 코드를 구현할 필요 ❌
  • 하위 클래스에서 디폴트 메서드에 대해 새로운/다른 기능이 필요하다면 재정의 ⭕

정적 메서드

💡 정적 메서드(static method)
: 인스턴스 생성과 관계없이 사용할 수 있는 메서드
클래스 생성과 무관하게 사용 가능한(static의 성격) 메서드
static 예약어를 사용하여 선언

// 정적 메서드 구현
static int total(int[] arr) {
    int total = 0;
    
    for(int i : arr) {
    total += i:
    }
    return total;
}

// 정적 메서드 호출
System.out.println(Calc.total(arr));
// 정적 메서드가 포함된 클래스명이 Calc
// 정적 메서드는 클래스명.메서드명()으로 호출
  • 정적 메서드는 static 변수처럼 클래스명.메서드명()으로 호출
  • 인스턴스 생성과 관계없이 구현 이후 사용 가능

private 메서드

💡 private 메서드
: 인터페이스 내 private 메서드는 인터페이스를 구현한 클래스에 사용하거나 재정의할 수 없음(private의 성격)

  • private 메서드는 코드를 모두 구현해야 하므로,(구현해서 고정해놓고 외부 접근, 재정의 ❌) 추상 메서드에서는 private 예약어를 사용할 수 없음
  • 추상 메서드에서는 private static으로 사용 가능, 정적 메서드에서 호출하여 사용

인터페이스 내
private 메서드 : 디폴트 메서드에서 호출 가능
private static 메서드 : 정적 메서드에서 호출 가능

인터페이스 내 private 메서드에 대한 내용이 잘 이해가 되지 않음.. 추후에 따로 더 공부해보아야 할 듯

  • 인터페이스 내에 private 메서드는 일반 클래스 내 private 메서드와 무엇이 다른가?
  • 인터페이스 내 private 메서드를 하위 클래스에서 어떻게 호출하는가?
  • 생성 및 호출과 관련한 제한 사항은 어떤 것이 있는가?

인터페이스 활용

  • 인터페이스는 구현 코드가 없기 때문에 한 클래스가 여러 인터페이스를 구현하는 다중 구현 가능
    cf. 자바에서 상속은 단일 상속만 가능
  • 디폴트 메서드는 인스턴스를 생성해야 호출할 수 있기 때문에, 이름이 같은 디폴트 메서드가 (하나의 클래스가 구현하는)두 인터페이스에 있으면 문제가 됨
  • 인터페이스와 인터페이스 간에도 상속이 가능함, 구현 코드를 통한 기능 상속이 아니기 때문에 이를 타입 상속이라고 함
  • 인터페이스는 여러 개를 동시에 상속받을 수 있음
  • 한 클래스에서 클래스 상속과 인터페이스 구현을 모두 할 수 있음

💥인터페이스 활용 목적은 => 표준화, 다형성 구현💥



3. ArrayList

배열과 ArrayList

기본 배열은 생성 시 배열 길이를 정하고 시작해야함
= 생성 이후 길이 변경 불가

ArrayLis는 객체 배열을 관리하는 클래스, 길이(사이즈)가 가변적

import java.util.ArrayList;

ArrayList<자료형> 배열이름 = new ArrayList<자료형>();
  • ArrayList 클래스를 활용하려면 관련 패키지를 import 해주어야 함(import java.util.ArrayList;)

ArrayList 클래스 주요 메서드

add() : ArrayList를 생성할 때는 배열 길이를 미리 지정할 필요 없이, add() 메서드를 사용해 생성자를 호출하여 값을 추가해주면 됨

get() : 요소를 하나 가져오는 메서드, for문과 get()메서드를 함께 활용하여 ArrayList에 있는 인스턴스를 순서대로 가져와서 출력할 수 있음

size() : ArrayList에 있는 배열의 개수 출력

length() : Array에서는 배열 안의 값의 수를 출력해주지만
ArrayList에서는 size()를 통해 List 안의 배열 개수를 출력하고, 그 배열 안의 값의 수를 알고 싶다면 ArrayList 안의 배열을 호출하고, 그 배열의 length를 호출해야 함



profile
사부작 사부작

0개의 댓글