Main에 static을 사용하는 이유
- static은 java 프로그램이 실행하기 전에 static 함수나 static 변수를 첫 단계로 메모리에 올려 프로그램을 실행시킵니다. (static이 실행시 1순위)
- 프로그램이 종료될 때까지 사라지지 않습니다.
- main함수가 실행되기 위해서는 메모리에 미리 올라가야합니다.
- 메모리에 올라가있지 않으면, 시작점인 main() 메소드를 호출하려고 하는데 메모리에는 main이 없기 때문에 실행을 할 수가 없습니다.
- 그래서 main 메소드는 누군가 호출하기 전에 미리 메모리에 있어야 하기 때문에 static을 붙이는 것입니다.
각 변수의 특징
변수 | 생성 시기 | 소멸 시기 | 저장 메모리 | 사용 방법 |
---|
클래스 변수 | 클래스가 메모리에 올라갈 때 | 프로그램이 종료될 때 | 메소드 영역 | 클래스 이름.변수이름 |
인스턴스 변수 | 인스턴스가 생성될 때 | 인스턴스가 소멸할 때 | 힙 영역 | 인스턴스 이름.변수이름 |
지역 변수 | 블록 내에서 변수의 선언문이 실행될 때 | 블록을 벗어날 때 | 스택 영역 | 변수 이름 |
추상 클래스와 인터페이스의 공통점과 차이점
공통점
- 추상 클래스와 인터페이스는 선언만 있고 구현 내용이 없는 클래스입니다.
- 그래서 자기 자신이 new를 사용해 객체를 생성할 수 없으며, 추상 클래스를 extends 받거나, interface를 implemen 한 자식만이 객체를 생성할 수 있습니다.
- 상속받은 자식이 구현을 하도록 해야할 때 사용합니다.
- java에서는 type이 지정되어있기 때문에 선언된 type과 자식의 type이 같아야만 합니다.
차이점
- 추상 클래스는 말 그대로 클래스이고, interface는 구현하기 전에 메소드에 대해 명세된 것입니다.
- 그래서 상속을 받음에도 불구하고 클래스에선 상속이라고 쓰지만 interface는 implements라고 씁니다.
- 추상 클래스의 정의는 abstract 메소드가 하나라도 존재하는 클래스를 일컫습니다.
- 때문에 일부는 구현된 메소드도 있고, abstract라고 붙어있는 메소드는 구현이 되지 않아 있습니다.
- 추상클래스를 상속받는 클래스는 반드시 추상 메소드를 구현해야합니다.
- 인터페이스를 상속받는 클래스에서 반드시 인터페이스에 있는 모든 메소드를 구현해야 합니다.
- 자바는 단일상속을 지원하기 때문에 추상클래스는 단일상속이지만, interface를 사용하게 되면, 다중상속이 가능해집니다.
인터페이스의 특징
- 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 여러 인터페이스를 상속받을 수 있습니다.
- 추상클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수는 없습니다.
- 모든 추상 메소드를 구현하지 않는다면, abstract 키워드를 사용하여 추상 클래스로 선언해야 합니다
인터페이스의 장점
1. 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
2. 선언(설계)와 구현을 분리시킬 수 있게 한다.
3. 개발 시간을 단축할 수 있다.
4. 변경에 유리한 유연한 설계가 가능하다.
5.표준화가 가능하다.
6.인터페이스 덕분에 B가 변경되어도 A는 바꾸지 않아도 될 수 있게 한다. (느슨한 결합)
인터페이스 사용 전
인터페이스 사용 후
인터페이스 사용 전
import java.util.*;
class A {
public void method(B b) {
b.method();
}
}
class B {
public void method() {
System.out.println("메서드 출력");
}
}
class C {
public void method() {
System.out.println("메서드 출력");
}
}
public class test {
public static void main(String[] args) {
A a = new A();
a.method(new B());
}
}
- 인터페이스의 사용전의 경우, 클래스 C를 추가했을 때 1, 2번을 모두 수정해주어야 한다.
인터페이스 사용 후
import java.util.*;
class A {
public void method(I b) {
b.method();
}
}
interface I {
public void method();
}
class B implements I{
public void method() {
System.out.println("메서드 출력");
}
}
class C implements I{
public void method() {
System.out.println("메서드 출력");
}
}
public class test {
public static void main(String[] args) {
A a = new A();
a.method(new C());
}
}
- 인터페이스를 사용한 후에는 아래의 메인함수에서 사용할 때만 바꾸어주면 된다.
7. 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.
interface Repairable{}
class SCV extends GroundUnit implements Repairable {
}
class Tank extends GroundUnit implements Repairable {
}
class Dropship extends GroundUnit implements Repairable {
}
- SCV와 Tank, Dropship을 Repairable이라는 인터페이스로 공통점을 가지게 해주었다.