💬 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를 호출해야 함