Java의 정석 기초편(남궁성) 정리 + a/6 ~ 7. 객체지향 프로그래밍 1, 2

객체지향 프로그래밍1 11 ~ 13 + 26 ~ 29. 선언위치에 따른 변수의 종류 , 클래스 변수와 인스턴스 변수 , static메서드와 인스턴스 메서드 , static을 언제 붙여야 할까? , 메서드 간의 호출과 참조

doriver 2022. 9. 22. 18:17

변수의 선언 위치에 따라 변수를 3가지로 분류할수 있다.

: 클래스변수, 인스턴스 변수, 지역변수

 

 

멤버변수중 static이 붙은것은 클래스 변수, 붙지 않은것은 인스턴스 변수

변수의 종류 선언 위치 생성시기
멤버변수 클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 인스턴스가 생성되었을 때
지역변수 클래스 영역 이외의 영역
(메서드, 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때

인스턴스 변수 - 인스턴스마다 별도의 저장공간을 가지므로 서로 다른값을 가질수 있다.

 

클래스 변수

- 멤버변수중 static이 붙은것

- 인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와 달리, 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유.

- 한 클래스의 모든 인스턴스들이 공통인 값을 유지해야하는 속성의 경우 클래스변수로 선언

- 인스턴스를 생성하지 않고도 사용가능( '클래스이름.클래스변수' 와 같은 형식을 사용 )

 

지역변수 - 메서드 내에 선언되어 메서드 내에서만 사용 가능, 메서드가 종료되면 소멸되어 사용할수 없음

 

인스턴스 변수는 인스턴스가 생성될때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다

 

Card.width  ,  c1.width  ,  c2.width 는 모두 같은 저장공간을 참조한다

클래스변수를 사용할땐 c1.width 보단 Card.width와 같이 '클래스이름.클래스변수'의  형태로 하는것이 좋다

 

 

반환타입 메서드이름 (매개변수) {
	// 메서드 호출시 수행될 코드
}

인스턴스 메서드

앞에 static이 없는 일반적인 메서드

객체를 생성해야만 호출할수 있다.

 

 

static 반환타입 메서드이름 (매개변수) {
	// 메서드 호출시 수행될 코드
}

클래스메서드

메서드 앞에 static이 붙어 있는 메서드

객체를 생성하지 않고도 ' 클래스이름.메서드이름(매개변수) ' 로 호출 가능

인스턴스와 관계없는(인스턴스 변수, 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static메서드)로 정의한다.

 

static을 언제 붙일까?

클래스를 설계할때, 멤버변수중 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여 클래스변수로 정의

(생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스변수는 서로 다른 값을 갖는다)

 

클래스 메서드(static메서드)는 인스턴스 변수를 사용할수 없다.

인스턴스변수나 인스턴스메서드에서는 static이 붙은 멤버를 사용할수 있다.

 

메서드내에 인스턴스 변수를 사용하지 않는다면 static붙이는걸 고려한다.

( 메서드 호출시간이 짧아져 성능이 향상된다. static을 안 붙인 메서드는 실행시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요 )

 

같은 클래스에 속한 멤버들 에서

인스턴스 멤버는 인스턴스를 생성해야 존재하게 된다

 

같은 클래스내의 메서드는 서로 객체의 생성이나 참조변수없이 직접 호출 가능하지만, static메서드는 인스턴스 메서드를 호출할수 없다

같은 클래스내에서 static메서드는 인스턴스 변수를 사용할수 없다.