유디의 공간정보·개발일기
7-1. 0713_ Interface, Abstract class 본문
- 인터페이스 : 통로
프로토콜 : 약속
- implements Calc : 인터페이스 Calc를 지키겠다는 의미
- abstract class : 추상클래스, 미완성이라 실제 객체를 못 만듦, 아직 사용할 수 없는 틀
Calculator (abstract class) | implements Calc |
Calculator2 (class, Calculator를 상속) | extends Calculator |
Calc (interface) |
[Calc interface]
package com.lx.calc;
public interface Calc {
public int add(int a, int b);
public int subtract(int a, int b);
public int multiply(int a, int b);
}
- Calc에 divide메서드를 약속해 두지 않아서 Test1에서 호출할 수 없다.
[Calculator abstract class]
package com.lx.calc;
public abstract class Calculator implements Calc {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
[Calculator2 class]
package com.lx.calc;
public class Calculator2 extends Calculator {
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) {
return a / b;
}
}
- Calculator2에서만 divide 메서드 실행 가능
[Test1]
package com.lx;
import com.lx.calc.Calc;
import com.lx.calc.Calculator;
import com.lx.calc.Calculator2;
public class Test1 {
public static void main(String[] args) {
//Calculator calc1 = new Calculator(); //가능
Calculator2 calc1 = new Calculator2(); //가능
//Calculator calc1 = new Calculator2(); //가능
//Calc calc1 = new Calculator2(); //가능, 변수 크기로 Calc 가능해짐
int result = calc1.add(10, 10);
System.out.println("더하기 결과 : " + result);
// (미완성인)인터페이스(Calc)를 사용할 때
Calc calc2 = new Calc() { // {}안에 들어오는 내용은 한 번 사용되고 버려짐
// 빨간 밑줄에 커서 두고 파란글씨 누르면 인터페이스 내에 명시했던 약속들이 override돼서 나옴
//new Calc는 Calc calc2 변수에 넣어주기
@Override // @ : annotation, 주석
public int add(int a, int b) {
return a + b;
}
@Override
public int subtract(int a, int b) {
return a - b;
}
@Override
public int multiply(int a, int b) {
return a * b;
}
};
//재정의 해줬으니 이제 사용가능함
int result2 = calc2.add(20, 20);
System.out.println("더하기 결과 : " + result2);
Calculator calc3 = new Calculator() {
@Override
public int multiply(int a, int b) {
return a * b;
}
};
int result3 = calc3.multiply(10, 10);
System.out.println("곱하기 결과 : " + result3);
//calc1.add( )로 실행하는 것 대신 실제 계산기 객체 넣어보기, show함수 호출
show(calc1);
show(new Calculator() {
@Override
public int multiply(int a, int b) {
return a * b;
}
});
}
//show() 함수 정의하기
static void show(Calc calc) {
int result = calc.add(10, 10);
System.out.println("show 함수 호출됨 : " + result);
}
}
- static : Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만,
Garbage Collector의 관리 영역 밖에 존재하므로 Static을 자주 사용하면 프로그램의 종료시까지 메모리가
할당된 채로 존재하므로 자주 사용하게 되면 시스템 실행에 좋지 않다.
- static 변수 : 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 변수로,
메모리에 한번 할당되므로 여러 객체가 해당 메모리를 공유
- static 메서드 : 객체의 생성 없이 호출이 가능하며, 객체에서는 호출이 불가능
'JAVA' 카테고리의 다른 글
H1. 0716_ JAVA 기초 (0) | 2021.10.31 |
---|---|
7-2. 0713_ Hashmap (0) | 2021.10.24 |
6. 0712_ try-catch절, Getter and Setter (0) | 2021.10.24 |
5. 0709_ 널체크(Null Check), ArrayList (0) | 2021.10.23 |
4. 0708_생성자함수, if문 (리뷰) (0) | 2021.10.23 |