변수
변수의 종류
- 클래스변수 (class variable)
- 선언 방법 : 클래스 영역에 선언하고 변수 앞에
static
을 붙인다. - 사용 방법 :
클래스이름.클래스변수
- 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.
- 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지된다.
public
을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 전역변수의 성격을 갖는다.
- 선언 방법 : 클래스 영역에 선언하고 변수 앞에
- 인스턴스변수 (instance variable)
- 선언 방법 : 클래스 영역에 선언한다.
- 사용 방법 : 클래스의 인스턴스 생성 후
클래스인스턴스.인스턴스변수
- 지역변수 (local variable)
- 선언 방법 : 클래스 영역 이외의 영역(메서드 등)에서 선언한다.
- 지역변수가 선언된 블럭{} 내에서만 사용 가능하다.
변수의 종류 | 선언 위치 | 생성시기 |
---|---|---|
클래스변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스변수 | 클래스 영역 | 인스턴스가 생성되었을 때 |
지역변수 | 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 |
1
2
3
4
5
6
7
8
class Variables {
int iv; // 인스턴스변수
static int cv; // 클래스변수
void method() {
int lv = 0; // 지역변수
}
}
메서드
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.
메서드의 선언과 구현
메서드 = 선언부 + 구현부
메서드 선언부(method declaration, method header)
메서드 선언부 = 반환타입 + 메서드이름 + 매개변수선언
- 매개변수 선언(parameter declaration)
- 메서드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것
,
(쉼표)를 통해 구분한다.- 일반적인 변수 선언과 달리 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다.
- 메서드 이름(method name)
- 메서드의 기능을 쉽게 알 수 있도록 의미있는 이름을 짓도록 노력해야 한다.
- 반환타입(return type)
- 메서드의 작업수행 결과(출력)인 ‘반환값(return value)’의 타입을 적는다.
- 반환값이 없는 경우
void
를 적어야 한다.
메서드 구현부(method body, 메서드 몸통)
메서드를 호출했을 때 수행될 문장들을 넣는다.
- return문
- 메서드의 반환타입이
void
가 아닌 경우 반드시 포함되어야 한다. (void인 경우 컴파일러가 자동으로 return;을 추가해준다.) - 반환값은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
- 단 하나의 값만 반환할 수 있다.
- 메서드의 반환타입이
- 지역변수
- 메서드 내에 선언된 변수
메서드의 호출
1
메서드이름(값1, 값2, ...)
인자(argument, 인수)
- 메서드를 호출할 때 괄호() 안에 지정해준 값들
- 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.
- 인자의 타입은 매개변수와 타입이 일치하거나 자동 형변환이 가능한 것이어야 한다.
매개변수와 반환값의 타입
매개변수와 반환값이 기본형일 때는 기본형의 값이 복사되고, 참조형일 때는 인스턴스의 주소가 복사된다.
👉 주소를 넘겨주면 값을 읽어오는 것뿐만 아니라 변경하는 것도 가능하다.
👉 메서드는 단 하나의 값만을 반환할 수 있지만 이것을 응용하여 여러 개의 값을 반환하는 것과 같은 효과를 얻을 수 있다.
+) Java에서는 매개변수로 값 또는 주소값이 넘어가는 것이기 때문에 Call by value이다.
오버로딩
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
- 오버로딩을 통해 같은 이름의 메서드들이 같은 기능을 할 것이라고 예측하도록 할 수 있다.
선언 조건
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
반환타입은 오버로딩을 구현하는 데 아무런 영향을 주지 못한다.
1
2
int add(int a, int b) {return a + b;}
long add(long a, long b) {return a + b;}
가변인자(varargs) 사용
메서드의 매개변수 개수를 동적으로 지정하는 것 (JDK1.5 이상)
1
2
3
4
5
6
7
8
9
10
11
12
String concatenate(String s1, String s2) { ... }
String concatenate(String s1, String s2, String s3) { ... }
// 가변인자를 사용해서 메서드 하나로 대체
String concatenate(String... args) {
String result = "";
for(String str : args) {
result += str;
}
return result;
}
선언 방법 :
타입... 변수명
매개변수 중에서 가장 마지막에 선언해야 한다.호출 방법 : 인자가 아예 없어도 되고, 배열도 인자가 될 수 있다.
1 2 3
concatenate(); // 인자가 없음 concatenate("A"); // 인자가 하나 concatenate(new String[]{"A", "B"}); // 배열도 가능
가변인자를 선언한 메서드를 오버로딩할 경우 : 메서드가 구분되지 않는 경우에 발생하여 컴파일 에러
생성자(Constructor)
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
선언 조건
- 생성자 이름이 클래스 이름과 같아야한다.
- 생성자는 리턴값이 없다.
오버로딩이 가능하다.
1
2
3
4
클래스이름(타입 변수명, 타입 변수명, ...) {
// 인스턴스 생성 시 수행될 코드
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
수행과정
1
Card c = new Card();
- 연산자 new에 의해 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
- 생성자 Card()가 호출되어 수행된다.
- 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
기본 생성자(default constructor)
클래스에 정의된 생성자가 하나도 없을 때에만 컴파일러는 기본 생성자를 추가한다.
this, this()
this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스의 주소가 저장되어 있다.
- 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
this(), this(매개변수)
- 생성자
- 같은 클래스의 다른 생성자를 호출할 때 사용한다.
변수의 초기화
변수를 선언하고 처음으로 값을 지정하는 것
- 멤버변수는 초기화하지 않아도 자동적으로 번수의 자료형에 맞는 기본값으로 초기화가 이루어진다.
- 지역변수는 사용하기 전에 반드시 초기화해야 한다.
멤버변수의 초기화 방법
- 명시적 초기화
- 생성자
- 초기화 블럭
- 인스턴스 초기화 블럭
- 클래스 초기화 블럭
명시적 초기화
변수를 선언과 동시에 초기화하는 것
1
2
3
4
class Car {
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}
초기화블럭
- 인스턴스 초기화 블럭
- 인스턴스 변수의 복잡한 초기화에 사용된다.
- 작성 방법 : 클래스 내에
{}
블럭을 만든다. - 수행 시기 : 인스턴스를 생성할 때 (생성자보다 인스턴스 초기화 블럭이 먼저 수행된다.)
- 클래스 초기화 블럭
- 클래스 변수의 복잡한 초기화에 사용된다.
- 작성 방법 : 클래스 내에
static{}
블럭을 만든다. - 수행 시기 : 클래스가 메모리에 처음 로딩될 때 한번만
1
2
3
4
5
6
7
8
9
10
11
class InitBlock {
static {
// 클래스 초기화 블럭
}
{
// 인스턴스 초기화 블럭
count++;
serialNo = count;
}
}
멤버변수의 초기화 시기와 순서
클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화된다.
인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화된다.
클래스 변수의 초기화 순서 : 기본값 👉 명시적초기화 👉 클래스 초기화 블럭
인스턴스 변수의 초기화 순서 : 기본값 👉 명시적초기화 👉 인스턴스 초기화 블럭 👉 생성자
출처📎
- 자바의 정석