Java - Main에 static을 사용하는 이유, 추상 클래스 vs 인터페이스

YangJiWon·2020년 6월 13일
0

Java

목록 보기
5/8

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) { // 1
		b.method();
	}
}

class B {
	public void method() {
		System.out.println("메서드 출력");
	}
}

class C { //c를 추가했을 때 
	public void method() {
		System.out.println("메서드 출력");
	}
}


public class test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub;
		A a = new A();
		a.method(new B()); // 2
	}
}
  • 인터페이스의 사용전의 경우, 클래스 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{ //c를 추가했을 때 
	public void method() {
		System.out.println("메서드 출력");
	}
}


public class test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub;
		A a = new A();
		a.method(new C()); // 1
	}
}
  • 인터페이스를 사용한 후에는 아래의 메인함수에서 사용할 때만 바꾸어주면 된다.

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이라는 인터페이스로 공통점을 가지게 해주었다.
profile
데이터데이터데이터!!

0개의 댓글