선언위치에 따른 변수의 종류
변수는 클래스변수, 인스턴스변수, 지역변수 모두 세 종류가 있다.
변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'이다.
멤버변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버변수 중 static이 붙은 것은 클래스변수, 붙지 않은 것은 인스턴스 변수이다.
class Variables{
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static변수, 공유변수)
void method(){
int lv = 0; // 지역변수
}
}
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수 | 클래스영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 인스턴스가 생성되었을 때 | |
지역변수 | 클래스 영역 이외의 영역 | 변수 선언문이 수행되었을 때 |
- 인스턴스 변수
- 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.
- 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저 인스턴스를 생성해야한다.
- 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
- 클래스 변수
- 인스턴스 변수 앞에 static을 붙여 선언한다.
- 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.
- 인스턴스를 생성하지 않고 언제라도 바로 사용할 수 있다는 특징이 있으며, '클래스이름.클래스변수'와 같은 형식으로 사용한다.
- 클래스가 메모리에 '로딩'될 때 생성되어 프로그램이 종료될 때까지 유지된다.
- public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수'의 성격을 갖는다.
- 지역변수
- 메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용 불가능하다.
- for문 또는 while문의 블럭 내에 선언된 지역변수는, 블럭 내에서만 사용 가능하며, 블럭 벗어나면 사용할 수 없다.
메서드
'메서드(method)'는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.
메서드를 사용하는 이유
- 높은 재사용성
- 중복된 코드의 제거
- 프로그램의 구조화
메서드의 선언과 구현
반환타입 메서드이름 (타입 변수명,...){ // 타입 변수명 형태로 작업을 수행하는데 필요한 값을
// 받는것을 매개변수라고 함.
//메서드 호출시 수행될 코드
}
int add(int a, int b){
int result = a + b;
return result;
}
return문을 통해 반환값을 주는데, void타입을 제외한 나머지 타입으로 메서드를 선언할 경우,
해당 타입의 반환값을 줘야한다.
void 타입일 때, return문을 생략해줘도 되는데 이유는 컴파일러가 메서드의 마지막에 자동적으로 'return;'을 추가해준다.
메서드의 호출
메서드의 이름(값1, 값2, ...);
int result = add(3,5);
메서드를 호출할 때 괄호()안에 지정해준 값들을 '인자(argument)' 또는 '인수'라고 한다.
이 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야한다.
인자는 메서드가 호출되면서 매개변수에 대입된다.
같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만,
static메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.(인스턴스 메서드는 클래스의 인스턴스가 생성될 때 선언되고, 클래스 메서드는 클래스가 메모리 로딩될 때 선언된다.)
메서드의 저장공간 참조(JVM부분 참조) :
2022.02.24 - [Language/Java] - [Java] 자바언어의 특징과 JVM
기본형 매개변수와 참조형 매개변수
기본형 매개변수: 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수: 변수의 값을 읽고 변경할 수 있다.(read & write)
매개변수 타입이 기본형일땐 기본형 값이 복사되고, 참조형이면 인스턴스 주소가 복사된다.
참조형 반환타입
매개변수뿐만 아니라 반환타입도 참조형이 될 수 있다.
반환하는 값의 타입이 참조형이라는 얘긴데, 모든 참조형 타입의 값은 '객체의 주소'이므로 그저 정수값이 반환되는 것일 뿐이다.
반환타입이 '참조형'이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다.
class Data { int x; }
class ReferenceReturnEx {
public static void main(String[] args)
{
Data d = new Data(); // 주소 0X100
d.x = 10;
Data d2 = copy(d); // d2에 0x200 주소를 담음
System.out.println("d.x ="+d.x);
System.out.println("d2.x="+d2.x);
}
static Data copy(Data d) {
Data tmp = new Data(); // 주소 0X200
tmp.x = d.x; // 0X100의 주소를 가진 d에서 x의값 10을 가져와서 0x200 tmp의 x에 담음.
return tmp; // 0x200 주소 반환
}
}
재귀호출(recursive call)
메서드의 내부에서 메서드 자신을 다시 호출하는 것을 '재귀호출(recursive call)'이라고 하고,
재귀호출하는 메서드를 '재귀 메서드'라 한다.
void method(){
method(); // 재귀호출. 메서드 자신을 호출한다.
}
factorial 구현 등 해보면 이해가 편할 것.
메서드를 구현할 때, 탈출문을 안만들면 본인 자신을 계속 부르면서 무한 루프가 돈다.
호출 스택에 계속 데이터가 쌓여가다가 한계치를 넘어가면 '스택오버플로우 에러(StackOverflow Error)'가 발생한다.
클래스 메서드(static메서드)와 인스턴스 메서드
변수에서 그랬던 것과 같이, 메서드 앞에 static이 붙으면 클래스 메서드.
아니면 인스턴스 메서드이다.
클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)' 형태로 호출이 가능하다.
클래스 메서드 : 인스턴스(변수나 메서드)와 관계없는 메서드
인스턴스 메서드: 인스턴스변수를 필요로하는 메서드
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것을 static을 붙인다.
- 클래스 변수나 메서드는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 이미 메모리에 존재하기 때문(JVM이 Method area에 올려둠)
- 클래스 메서드는 인스턴스 멤버(변수나 메소드)를 사용할 수 없다.
- 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있으므로 막아져 있음.
- 메서드 내 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
- 인스턴스 메서드의 경우 실행 시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요해서 시간이 더 걸린다.
참조
'Java의 정석' 책
'Language > Java' 카테고리의 다른 글
[Java] 생성자(Constructor) (0) | 2022.03.02 |
---|---|
[Java] 오버로딩(overloading) (0) | 2022.03.02 |
[Java] 객체지향언어특징과 클래스와 객체 (0) | 2022.03.01 |
[Java] 배열(Array) (0) | 2022.03.01 |
[Java] 연산자(Operator) (0) | 2022.02.28 |
댓글