꽤나 늦은시간에 글을 쓰게 되었습니다
어렵다 어렵다 했지만... 어느새 하다보니 지금 새벽 세시가 다 되었네요
오랜만에 이렇게 푹 빠져서 무언가를 새벽가지 한것이 오랜만입니다
피곤하긴 하지만 괜히 뿌듯하네요
'코딩'에 'ㅋ'만을 배웠지만 재미를 알게된것 같은 6일차였습니다
상속을 언제 사용할까
=> 여러 클래스를 생성하지 않고 하나의 클래스에 공통적인 요소를 모으고
나머지 클래스는 이를 상속받은 다음 각각 필요한 특성과 메서드를 구현하는 방법
-> 하나의 클래스에 여러 특성을 한꺼번에 구현하는 경우
많은 코드 내에 많은 if 문이 생길 수 있음
IS-A 관계 = 일반적인 개념과 구체적인 개념과의 관계
상위 클래스 -> 일반적인 개념 클래스
하위 클래스 -> 구체적인 개념 클래스
=> 단순히 코드를 재사용하는 목적으로 사용하지 않음
HAS-A 관계 = 한 클래스가 다른 클래스를 소유한 관계
코드 재사용의 한 방법
* 다운 캐스팅
= 하위 클래스가 상위 클래스로 형 변환 되는 것은 묵시적으로 이루어짐
-> 다시 원래 자료 형인 하위 클래스로 형 변환 하려면 명시적으로 다운 캐스팅을 해야 함
-> 이 때 원래 인스턴스의 타입을 체크하는 예약어 = instanceof
* 추상 클래스
= 추상 메서드를 포함한 클래스
추상 메서드 = 구현코드 없이 메서드의 선언만 있음
ex) abstract int add(int x, int y); = 선언만 있는 추상 메서드
int add(int x, int y){ } = { }부분이 구현 내용임 => 추상 메서드X
= abstract 예약어 사용
추상 클래스 = new(인스턴스 화)할 수 없음
추상 클래스 구현하기
- 메서드에 구현코드가 없으면 -> abstract로 선언해야 함
- abstract로 선언된 메서드를 가진 클래스 = abstract로
상위 클래스에서 구현하지 못한 부분 -> 하위 클래스에서 구현하는 경우 사용
상위 클래스 = 추상 메서드 사용 -> 하위 클래스에서 구체적으로 구현
* 템플릿 메서드
= 추상 메서드나 구현된 메서드를 활용하여 전체 기능의 흐름을 정의
final로 선언 -> 하위 클래스에서 재정의 할 수 없음
= 프레임 워크에서 많이 사용되는 설계 패턴
= 추상 클래스로 선언된 상위 클래스에 템플릿 메서드를 활용하여
전체적인 흐름을 정의 -> 하위 클래스에서 다르게 구현되어야 하는 부분
-> 추상 메서드로 선언해서 하위 클래스가 구현하도록 함
* PlayerLevel 클래스
public abstrat class PlayerLevel {
public abstract void run();
public abstract void jump();
public abstract void turn();
public abstract void showLevelMessage();
final public void go(int count) {
run();
for(int i = 0; < count; i++) {
jump();
}
turn();
}
}
= 각 레벨마다 run(), junp(), turn() 기능은 다르게 구현되어야 하므로 -> 추상 메서드로 선언
final 로 선언 된 go() 메서드에서 각 순서와 반복 횟수를 구현함(템플릿 메서드)
* final 예약어
= final 변수는 값이 변경될 수 없는 상우 => public static final double PI = 3.14;
final 변수는 오직 한 번만 값을 할당 할 수 있음
final 메서드는 하위 클래스에서 재정의(overriding)할 수 없음
final 클래스는 더 이상 상속되지 않음
* 여러 자바 파일에서 공유하는 상수 값 정의
= 프로젝트 구현 시 여러 파일에서 공유해야 하는 상수 값 -> 하나의 파일에 선언하여 사용하면 편리
<인터페이스>
= 구현 코드가 없는 추상 메서드들로만 선언 => 설계용으로 쓰임
= 모든 메서드가 추상 메서드로 이루어진 클래스
형식적인 선언만 있고 구현은 없음
-> interface 인터페이스 이름{
public static final float pi = 3.14f;
public void add();
}
인터페이스에 선언된 모든 메서드 = public abstract로 추상 메서드
인터페이스에 선언된 모든 변수 = public static final로 상수
인터페이스와 다형성
= 인터페이스는 Client Code와 서비스를 제공하는 객체 사이의 약속이다
어떤 객체가 어떤 interface 타입이라 함은 => 그 interface가 제공하는 메서드를 구현했다는 의미
Client = 어떻게 구현되었는지 상관없이 -> interface의 정의만을 보고 사용할 수 있음 (ex = JDBC)
다양한 구현이 필요한 인터페이스를 설계하는 일은 매우 중요한 일이다
인터페이스의 요소
상수 = 모든 변수 -> 상수로 변환됨
추상 메서드 = 모든 메서드는 추상 메서드로 구성
디폴트 메서드 = 기본 구현을 가지는 메서드, 구현 클래스에서 재정의 할 수 있음
정적 메서드 = 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
private 메서드 = 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
인터페이스 내부에서만 기능을 제공하기 위해 구현하는 메서드
private 메서드 = 인터페이스 내부에 private 혹은 private static 으로 선언한 메서드 구현
private static은 정적 메서드에서 사용가능
인터페이스 상속 = 인터페이스 간에도 상속이 가능
구현코드의 상속이 아니므로 => 형 상속이라고도 함 (type inheritance)
인터페이스 구현과 클래스 상속 함께 사용하기
= 실제 프레임 워크(스프링, 안드로이드)를 사용하면
클래스를 상속 받고, 여러 인터페이스를 구현하는 경우가 종종 있음
2023. 09. 01 (금)
프로그래머 도전기 8일차 (0) | 2023.09.04 |
---|---|
프로그래머 도전기 7일차 (0) | 2023.09.04 |
프로그래머 도전기 5일차 (2) | 2023.09.01 |
프로그래머 도전기 4일차 (0) | 2023.08.30 |
프로그래머 도전기 3일차 (3) | 2023.08.29 |