static

정적(static) 변수

1. 개별 객체에 생성하지 않아도 메모리에 로드된다 

2. 클래스명.정적멤버변수명

    객체명.정적멤버변수명        

3. 일반메소드 및 정적메소드 내부에서 자유롭게 접근할 수 있다(정적변수의 값을 불러올 수 있다)

 

정적(static) 메소드

1. 정적멤버변수만 접근할 수 있다

2. 일반 멤버변수는 접근할 수 없다(정적메소드는 미리 메모리에 올라와 있어 사용할 수 있지만

멤버변수는 객체를 생성해야 사용할 수 있기 때문, 생성도 하지 않았으니 사용할수없음)

3. 클래스명.정적메소드()

     객체명.정적메소드()

4. 정적메소드 내부에서 정적메소드만 호출가능하다

5. 객체 생성 없이 호출할 수 있다

 

초기화블럭(static{ })

{} 안에 메소드, 변수 등을 static으로 정해주고자 할때 사용

 

 

package j210114;

class Car{
	String color;
	String model;
	String owner;
	static int serialNumber;//0
	
	public Car(String color, String model, String owner ) {
		this.color=color;
		this.model=model;
		this.owner=owner;
		serialNumber++;//공통으로 모든 객체가 불러서 사용할 수 있음
	}

	public String getColor() {
		return color;
	}
	public static int getNumber() {
		return serialNumber;
	}
	static {
		System.out.println("a");
	}
}
public class CarFactory {

	public static void main(String[] args) {
		// TODO Auto-generated method stub\
		Car c1 = new Car("Red","SM5","테스트");
		System.out.println("지금까지 차의 생산량은?"+ c1.serialNumber);
		System.out.println("지금까지 차의 생산량은?"+ c1.getNumber());
		//객체명.정적변수명
		//객체명.정적메소드명
		
		Car c2 = new Car("Blue","Sonata","임시");
		Car c3 = new Car("Blue","Matiz","임시2");
		System.out.println("지금까지 차의 생산량은?"+ Car.serialNumber);
		System.out.println("지금까지 차의 생산량은?"+ Car.getNumber());
		//클래스명.정적변수명
		//클래스명.정적메소드명
	}
}
/*
a
지금까지 차의 생산량은?1
지금까지 차의 생산량은?1
지금까지 차의 생산량은?3
지금까지 차의 생산량은?3
*/

final 

클래스, 메소드, 변수 앞에 붙여줄 수 있다 

 

- final + 멤버변수 또는 지역변수 

상수화된다, 내용을 변경할 수 없다, 대문자로 작성한다

- final + 메서드명 

상속은 허용해주지만 오버라이딩(=재정의)은 금지된다

원래의 메소드 기능을 그대로 유지하면서 사용해야하고 강제변경또한 안된다

- final + 클래스명

내용이 변경되면 안되는 중요한 클래스 앞에 붙는다, 상속금지 된다

상속된다는 것은 소유권이 이전된다는 것이므로 중요한 클래스에 

final 키워드를 붙여 상속되지 못하게 해야한다

예) System 클래스 

//final키워드
//3. final + 클래스명
final class Parent{
	//1. final + 멤버변수 또는 지역변수 
	final int COUNT=1;
	
	//2. final + 메서드명 
	public final void sum(int a, int b) {
		System.out.println(a+b);
	}
}

/*Parent클래스는 final로 선언되어있어 상속이 불가하다
public class FinalTest extends Parent {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Parent p = new Parent();
		//p.COUNT=5; 변경불가
		System.out.println("p.COUNT=> "+p.COUNT);
	}
    //오버라이딩 불가
    public final void sum(int a, int b) {
		System.out.println(a*b);
	}
}*/

 


추상메소드

1) 메소드의 body(내용)부분이 없고 선언만 되어있는 메소드를 추상메소드라고 한다

2) 일반메소드와 구분하기 위해서 메소드명 앞에 abstract 키워드를 써준다(반환형 앞에 쓴다)

3) 클래스 중에서 이러한 추상메소드를 한개라도 가지고 있으면 추상클래스가 된다

추상클래스는 일반클래스와 구분하기 위해서 abstract class 클래스명 으로 적어준다

abstract class ImTest{//추상클래스
	public int sum(int x, int y) {//일반메소드
		return(x+y);
	}
	public abstract void draw();//추상메소드
	abstract public void go();//추상메소드
}

 

추상클래스 개요 및 특징

 

1) 개요 

클래스 내부에 추상메소드가 한개라도 존재하면 추상클래스라고 한다

2) 특징

추상클래스를 상속받은 자식클래스는 무조건 추상메소드를 오버라이딩 해야한다(강제성을 띤다)

일반메소드, 추상메소드를 모두 가질 수 있다

static 이나 final 이 아닌 변수를 지정할 수 있고, public, protected, private 메소드를 가질 수 있다.

객체를 생성할 수 없다(인스턴스화 될 수 없다)

abstract 키워드를 붙여주어야 한다

자바는 다중상속을 지원하지 않으므로 단일상속만 가능하다

3) 사용목적

전체 프로그램의 명세서(설계목적) 

 

//추상메소드, 추상클래스
abstract class ImTest{//추상클래스
	public int sum(int x, int y) {//일반메소드
		return(x+y);
	}
	public abstract void draw();//추상메소드
	abstract public void go();
}
public class Test extends ImTest{
	
	public void draw() {}
	public void go() {
		int result=sum(10,20);
		System.out.println("result=>"+result);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test t = new Test();
		t.go();
		System.out.println(t.sum(30,40));
		//t.sum으로 접근 혹은 sum메소드를 static으로 선언해야한다
		//정적메소드 내부에서는 일반메소드를 직접 호출할 수 없다(객체명.메소드명)
		}
}

 

메소드  호출 하는법

1. 정적메소드 -> 일반메소드

정적메서드 내부에서는 일반메서드를 직접 호출할 수 없다(객체명.메서드명)

2. 일반메소드 -> 일반메소드

자기 클래스 내부에서는 자기객체명을 사용하지 못함(this 생략가능)

3. 정적메소드 -> 정적메소드

클래스명.정적메소드명

(자기 클래스내부에서 작성한 정적메소드인 경우는 클래스명 생략 가능)

 

+ Recent posts