KOSA fullStack 교육(static, interface, abstract class)
상속 받은 child들 upgrade함수
저번 상속 워크샵 코드 중 중요한 부분
바로 CURD의 Upgrade 코드 부분이다. 다음과 같이 짜면 어떠한 객체를 보내도 그 객체로 업그레이드가 가능하다.
처음에는 empNo랑, 바꾸고 싶은 인자를 보내서 짰는데 그럼 업그레이드 함수가 엄청나게 많아진다.
public void updatEmployee(Employee e) {
for(Employee emp:employees) {
if(emp == null) break;
if(emp.getEmpNo() == emp.getEmpNo()) {
emp.setName(e.getName());
emp.setBirthDate(e.getBirthDate());
emp.setSalary(e.getSalary());
if(emp instanceof Manager) {
((Manager)emp).changeDept(((Manager)e).getDept());
}else if(emp instanceof Engineer) {
((Engineer)emp).changeTech(((Engineer)e).getTech());
((Engineer)emp).changeBonus(((Engineer)e).getBonus());
}else if(emp instanceof Designer) {
((Designer)emp).setAvailableTool(((Designer)e).getAvailableTool());
((Designer)emp).setSpecialty(((Designer)e).getSpecialty());
}
}
}
}
Static
static 키워드 성질
- static이 붙은 멤버(필드, 메소드)는 객체 생성 과정을 건너뛴다.
- static이 붙은 멤버는 객체 생성 안해도 미리 메모리에 올라가 있다.
- 자바 실행 과정에서 static은 아래 단계에서 메모리에 올라감
1) 컴파일: ~.java → ~.class
2) 실행:
→ JVM 클래스 로더(Class Loader): static 멤버 메모리 로드
→ 바이트코드 검증기(ByteCode Verifier): 적합성 검사
→ 인터프리터(Interpreter): 명령 해석
4. static 필드나 메소드를 사용할 때 어떻게 사용할까
Intege.parseInt()
Math.random()
System.arraycopy()
Arrays.copyOf()
System.out... -->out이 필드다
- Class이름.필드
- Class이름.메서드
5. static 변수는 로컬 레벨에서는 사용 못한다. -> 필드레벨만 사용가능
6. static 키워드는 final 이랑 사용되는 경우가 많다.
Access Modifier ::: public < protected < private
Usage Modifier ::: static, final, abstract
--> 얘네는 순서 안중요하다
final : 내가 마지막이야 라는 키워드
static final + variable --> 내가 마지막 변수야 라는 뜻이다. 즉 상수값을 지정하는 것이다.
->상수는 공유해서 쓰는 경우가 많기 때문에 static final 을 같이 많이 붙인다
final + Class --> 내가 마지막 클래스야. 즉 상속 금지
final + method --> 내가 마지막 메서드야. 즉 오버라이딩 금지
7. **** static 한 변수는 생성된 객체들에서 공유한다. ****
class Car{
int serialNumber; //field
static int counter; //static V(class V, 전역변수)
//객체 생성시 생성자 돔
Car() {
counter++;
serialNumber = counter;
}
}
public class StaticExamTest3 {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
Car c3 = new Car();
System.out.println("=====field=====");
System.out.println(c1.serialNumber);
System.out.println(c2.serialNumber);
System.out.println(c3.serialNumber);
System.out.println("=====field=====");
System.out.println(Car.counter);
System.out.println(c1.counter);
System.out.println(c2.counter);
System.out.println(c3.counter);
}
}
위의 코드를 그림으로 표현해 본 것이 아래
자바의 3가지 변수 비교
filed | static variable | local variable | |
선언 위치 | 클래스 아래, 메소드 바깥 | 메소드 블럭 안 | |
메모리 | Heap | Class Area | Stack |
별칭 | Member variable | Class variable, 전역 변수 | 지역 변수 Automatically variable Temporary variable |
기본값 | O | X |
실행 시 가장 먼저 실행되는 함수
public class StaticExamTest4 {
static int i = 100;
//main block
public static void main(String[] args) {
System.out.println("1. main method block..." + i);
}
//static block
//객체 생성 이전에 해야할 작업이 있다면 여기서 해야함
static {
i = 300;
System.out.println("1. static block..." + i);
}
}
static{} 함수가 제일 먼저 도는 것을 알 수 있다.
interface, abstract
인터페이스 구성 요소 2가지
1. public abstract method
2. public static final 상수값
인터페이스 특징
1. 기능의 Template
2. 추상 메소드들의 집합이다(all)
3. 필드가 없다
4. 대신 public static final 상수값은 존재 가능하다
public interface Flyer {
int MAX_SPEED = 250; //public static final이 무조건 자동으로 앞에 붙는다
void flyer(); //public abstract 가 자동으로 붙게 된다
}
interface를 implements 하는 자식 클래스들은 interface의 추상 메서드들을 상속받는다.
하지만 class는 추상 메서드를 가지면 안되기 때문에 interface의 모든 추상 메서드를 오버라이딩 해야한다.
abstract class는 한 개 이상의 (상속 받은)추상 메서드를 가지지만, 모든 메서드가 추상 메서드를 가지지 않을 때 사용한다. 그러므로 interface처럼 abstract class도 객체 생성을 할 수 없다.