💬 5일 간 자바 수업 후기: 일주일 내내 조급한 마음으로 바쁘게 공부했더니 금요일날 넉다운했다...👻 자바를 5일만에 배우다니 아직 내가 100% 흡수하진 못했으니 배웠다기보다는 접해봤다라는게 맞을 것 같다. 너무 조급하게 생각하지 말고 꾸준히 복습하고 배워나간다고 생각해야겠다. 금요일에는 마라샹궈 먹고 9시에 뻗어버려서..ㅋㅋ 조금 늦었지만 주말에 복습해야하는 내용 공부하고 TIL 적는다.🔥
템플릿 메서드는 추상 클래스를 활용한 예(=추상 클래스를 사용하여 구현할 수 있음)로 디자인 패턴의 한 방법
모든 객체 지향 프로그램에서 사용하는 구현 방법
💡 템플릿 메서드(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
예약어를 사용해서 선언한 변수는 상수
상수 값은 해당 파일 안에서만 정의해서 사용 가능
🧨 public static final
을 이용하여 선언하면 여러 파일에서 공유해서 사용 가능
public
: 외부 클래스 어디에서나 접근 가능(가장 개방적)static
: 하나만 만들어서 공통(공유)으로 사용, 기준 + 인스턴스 생성과 관련없이 클래스.변수명
으로 호출final
: 마지막으로 선언, 변경 불가final
예약어를 사용해서 선언한 클래스는 상속 불가
상속을 하면 그 안의 변수나 메서드를 재정의할 수 있게 되는데,
final
로 정의하면 메서드 안의 변수나 내용이 수정되지 않고 그대로만 사용
🧨 final
클래스 : 상속이 불가해서 그 안의 변수, 메서드 모두 수정 및 재정의 불가능
🧨 final
메서드 : 일반 클래스 안에 final
메서드가 있다면 해당 클래스를 상속받는 하위 클래스가 있다고 하더라도 final
메서드는 재정의 할 수 없음
cf. final
메서드를 포함했다고, 다 final
클래스는 아님
반면, abstract
메서드를 포함하는 클래스는 다 abstract
클래스임
💡 인터페이스(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 -- 일반 클래스
이 때,
인터페이스를 추상 클래스가 구현하는 것을 타입 상속,
추상 클래스를 일반 클래스가 상속하는 것을 구현 상속이라함
인터페이스를 통해 구현 코드 전체를 살펴보지 않고,
인터페이스 선언부만 봐도 클래스와 내부 메서드들을 어떻게 사용할 지 알 수 있음
인터페이스를 구현하는 각 클래스의 구현 방법을 몰라도,
인터페이스에서 선언된 매개 변수, 반환 값을 보고 클래스를 사용할 수 있음
인터페이스는 추상 메서드로 이루어지므로,
인스턴스 생성 ❌, 멤버 변수 사용 ❌
클래스.변수명
으로 호출💡 디폴트 메서드(default method)
: 인터페이스에서 구현 코드까지 작성한 메서드
인터페이스를 구현하는 클래스에 기본적으로 제공할 메서드
default
예약어를 사용하여 선언
public interface Calc {
...
default void description() {
System.out.println("정수 계산기를 구현합니다.");
}
}
💡 정적 메서드(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
// 정적 메서드는 클래스명.메서드명()으로 호출
클래스명.메서드명()
으로 호출💡 private 메서드
: 인터페이스 내 private 메서드는 인터페이스를 구현한 클래스에 사용하거나 재정의할 수 없음(private
의 성격)
private
예약어를 사용할 수 없음private static
으로 사용 가능, 정적 메서드에서 호출하여 사용인터페이스 내
private
메서드 : 디폴트 메서드에서 호출 가능
private static
메서드 : 정적 메서드에서 호출 가능
인터페이스 내
private
메서드에 대한 내용이 잘 이해가 되지 않음.. 추후에 따로 더 공부해보아야 할 듯
- 인터페이스 내에 private 메서드는 일반 클래스 내 private 메서드와 무엇이 다른가?
- 인터페이스 내 private 메서드를 하위 클래스에서 어떻게 호출하는가?
- 생성 및 호출과 관련한 제한 사항은 어떤 것이 있는가?
💥인터페이스 활용 목적은 => 표준화, 다형성 구현💥
기본 배열은 생성 시 배열 길이를 정하고 시작해야함
= 생성 이후 길이 변경 불가
ArrayLis는 객체 배열을 관리하는 클래스, 길이(사이즈)가 가변적
import java.util.ArrayList;
ArrayList<자료형> 배열이름 = new ArrayList<자료형>();
add()
: ArrayList를 생성할 때는 배열 길이를 미리 지정할 필요 없이, add() 메서드를 사용해 생성자를 호출하여 값을 추가해주면 됨
get()
: 요소를 하나 가져오는 메서드, for문과 get()메서드를 함께 활용하여 ArrayList에 있는 인스턴스를 순서대로 가져와서 출력할 수 있음
size()
: ArrayList에 있는 배열의 개수 출력
length()
: Array에서는 배열 안의 값의 수를 출력해주지만
ArrayList에서는 size()를 통해 List 안의 배열 개수를 출력하고, 그 배열 안의 값의 수를 알고 싶다면 ArrayList 안의 배열을 호출하고, 그 배열의 length를 호출해야 함