클래스 메서드(static메서드) 인스턴스 메서드

static 붙으면 static 메서드

클래스는 '데이터와 데이터에 관련된 메서드 집합'

따라서 클내스 내에 있는 메서드와 멤버변수는 아주 밀접한 관계가 있다.

 

1. 클래스를 설계할 때. 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다. 
생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스변수로 정의해야 한다. 

2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다. 
static이 붙은 변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다. 

3. 클래스 메서드 (static 메서드)는 인스턴스 변수를 사용할 수 없다. 
클래스 메서드는 JVM로딩과 동시에 생성된다. 반면에 인스턴스 변수는 객체를 생성해야만 접근할 수 있다.

즉, 클래스 메서드가 존재할 때 반드시 인스턴스 변수가 존재할 거란 보장이 없다.

위와 같은 이유로 인스턴스 멤버는 반드시 클래스 멤버가 존재할 거란 보장이 되기에 아무런 문제가 없다.


4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다 
메서드의 작업내용 중에서 인스턴스변수를 필요로 한다면, static을 붙일 수 없다. 반대로 인스턴스변수를 필요로 하지 않는다면 static을 붙이자. 메서드 호출시간이 짧아지므로 성능이 향상된다. static을 안 불인 메서드(인스턴스메서드)는 실행 시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다. 

 

오버로딩(overloading)

같은 메서드 이름으로 메서드를 만드는 것, 구분 방법은 매개변수 뿐이다.

매개변수라 함은 매개변수 타입과, 개수이다.

가변인자

내부적으로 배열로 처리

가급적 가변인자는 사용하지 말 것, 명확히 배열 타입이나 컬렉션을 사용할 것

생성자(Constructor)

인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드, 메서드 이름은 클래스 이름과 같다.

 

초기화

초기화를 흔히 깨끗함, 0으로 만들기, 문자열이면 "" 같이 공백으로 넣기 등으로 생각하는 사람이 있다.

아니다. 바로 사용가능한 상태를 만드는 것이 초기화이다.

 

생성자도 근본적으로 메서드다. (반환 값이 없는 메서드)

메서드는 일련의 동작들이다. 즉, 복잡한 초기화를 할 수 있다. 

 

기본 생성자(default constructor)

매개변수가 없는 생성자

생성자가 클래스 안에 하나도 없을 자동으로 컴파일러가 추가해줌

하지만 무조건 직접 만들어주는 것을 권장

매개변수가 있는 생성자를 만들 경우 기본 생성자 추가가 자동으로 안된다. 따라서 무조건 기본 생성자는 수동으로 넣는 것이 좋다.

생성자에서 다른 생성자 호출하기 - this()

생성자 이름 대신 this를 사용하는 것

this는 객체 자신의 주소가 저장되어 있다. 

public class Constructor {
	public Constructor() {
		this(1);
		//반드시 한 개만 호출 가능
//		this(1,2);
	}
	public Constructor(int a) {
		//순환 구조가 생기면 안된다.
//		this();
		this(a,2);
	}
	public Constructor(int a,int b) {
//		super();
	}
}

변수 초기화

기본형은 초기화를 하지 않아도 기본 값이 존재한다.

참조형은 객체 주소이므로 초기값이 존재할 수가 없다. new 연산자로 힙영역에 객체를 생성해야 그 주소가 참조형 변수에 담기기 때문이다. 따라서 null 상태

char는 공백이 초기값이다.  \u0000

 

 

멤버변수의 초기화 방법

  • 명시적 초기화
    선언과 동시에 값을 대입하는 것
  • 생성자
    생성자 호출
  • 초기화 블록
    아무 이름 없이 { } 중괄호만 있는 것

public class Constructor2 {
	int a = 1;
	static {
		System.out.println("JVM에 이 클래스 적재 시 단 한번만 호출, 즉 모든 인스턴스 초기화보다 먼저 호출 됨");
//		System.out.println(a);당연히 사용 못함
	}
	{
		System.out.println(a);
		System.out.println("생성자보다 먼저 호출");
		a = 10;
	}
	public Constructor2() {
		System.out.println(a);
		System.out.println("생성자 호출");
		a = 100;
	}
	public static void main(String[] args) {
		Constructor2 c = new Constructor2();
		System.out.println(c.a);
	}
}

static 초기화 블록이 있는 이유

public class Constructor3 {
	static int a = 1;
	static {
		//클래스 멤버에 대해 복잡한 초기화가 필요할 수 있기 때문
		System.out.println("무언가 복잡한 방법으로 static a를 초기화하고 싶음");
	}
}
클래스 초기화 인스턴스 초기화
기본값 명시적 초기화블록 기본값 명시적 초기화블록 생성자

클래스 초기화는 JVM에 해당 클래스가 적재될 때 단 한 번만 수행 됨

 

 

 

 

 

 

 

 

 

 

 

 

'개발 > 자바(JAVA)' 카테고리의 다른 글

객체 지향 - 5  (0) 2023.02.01
객체 지향 - 4  (0) 2023.01.31
객체 지향 - 2  (0) 2023.01.27
객체 지향 - 1  (0) 2023.01.25
파일 옮기기  (0) 2022.07.25

+ Recent posts