[객체지향][자바의 정석] - 2. 변수와 메서드
6.2 변수와 메서드
2.1 선언위치에 따른 변수의 종류
변수의 선언 위치가 변수의 종류와 범위(scope)를 결정한다.
class Variables{//클래스 영역
int iv; //인스턴스 변수
static int cv; //클래스 변수(static변수, 공유변수)
void method(){ //메서드 영역
int lv = 0; //지역변수
}
}
변수의 종류 | 선언 위치 | 생성시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 인스턴스 생성시 | |
지역 변수 | 메서드 영역 | 변수 선언문 수행시 |
선언 위치에 따른 변수의 종류
- 인스턴스 변수
- 각 인스턴스의 개별적인 저장공간, 인스턴스마다 다른 값 저장 가능
- 인스턴스 생성 후 참조변수.인스턴스변수명 으로 접근
- 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지 컬렉터에 의해서 자동 제거 된다.
- 클래스 변수
- 같은 클래스의 모든 인스턴스들이 공유하는 변수
- 인스턴스 생성 없이 클래스이름.클래스변수명 으로 접근
- 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸된다.
- 지역 변수
- 메서드 내에 선언되며, 메서드의 종료와 함께 소멸된다.
- 조건문, 반복문의 블럭 {}내에 선언된 지역변수는 블럭을 벗어나면 소멸된다.
2.2 클래스 변수와 인스턴스 변수
인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
class{
//인스턴스 변수
String kind; //무늬
int number; //숫자
//클래스 변수
static int width = 100; //폭
static int height = 250; //높이
}
iv - 인스턴스 변수로 개별적으로 사용된다. (카드의 무늬, 숫자는 달라지는 것을 생각하면 됨) -> 객체를 만들때 마다 생성된다.
cv - 클래스 변수로 공통으로 사용된다. (카드의 가로 세로는 같은 것을 생각하면 됨) -> 객체 생성 없이 사용 가능
Card c = new Card(); //객체 생성
//객체 사용
//iv
c.kind = "HEART";
c.number = 5;
//cv는 iv처럼 쓰는 거 비추하고 클래스명.변수명으로 써야 정석
Card.width = 200;
Card.height = 300;
Card c1 = new Cart( ); // --> 객체를 생성하는 방법
//c1 = 참조 변수 = 별명 = 대상 객체와 동일한 곳을 참조하는 역할
//cv 클래스 변수 같은 경우엔 객체 생성 없이도 사용 가능하다.
클래스의 모든 객체가 공유하는 cv
2.3 메서드란?
1. 문장들을 묶어 놓은 것
- 작업단위로 문장들을 묶어서 이름 붙인 것이 메서드이다.
- 코드 중복을 줄일 수 있고 메서드 하나만 관리하면 되기 때문에 수월해진다.
2. 값(입력)을 받아서 처리하고, 결과를 반환(출력)
- 메서드는 함수와 똑같고 클래스 안에 존재해야 한다.
3. 메서드의 장점
- 코드의 중복을 줄일 수 있다.
- 코드의 관리가 쉽다.
- 코드를 재사용할 수 있다.
- 코드가 간결해서 이해하기 쉬워진다.
4. 메서드의 작성
- 반복적으로 수행되는 여러 문장을 메서드로 작성.
- 하나의 메서드는 한 가지 기능만 수행하도록 작성 (두 개의 작업을 하나의 메서드로 묶으면 안 된다.)
메서드 = 선언부 + 구현부
👉 메서드의 구현부
지역변수(lv): 메서드 내에 선언된 변수
👉 메서드의 호출(Call)
-메서드이름(값1,값2,...값n); //메서드를 호출하는 방법
- 메서드의 호출 값은 있어도 되고 없어도 된다.
2.4 return문
- 메서드가 정상적으로 종료되는 경우
- 메서드의 블럭의 끝에 도달했을 때
- 메서드의 블럭을 수행 도중 return문을 만났을 때
- return문
- 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다.
1. 반환값이 없는 경우 - return문만 써주면 된다.
return;
2. 반환값이 있는 경우 - return문 두에 반환값을 지정해 주어야 한다.
return 반환값;
//이때 리턴문과 타입이 일치해야 한다.
inf add(int a, int b){ //int의 타입이 일치해야 한다.
int result - a+b;
return result; //리턴문과
}
- return문 - 주의사항
- 반환값이 있는 메서드는 모든 경우에 return문이 있어야 한다.
int max(int a, int b){
if(a>b):
return a;
}
↓
int max(int a, int b){
if(a>b):
return a;
else:
return b;
}
- return문을 적절히 사용하면 코드가 간결해진다.
int max(int a, int b){
if(a>b):
return a;
else:
return b;
return result;
}
↓
int max(int a, int b){
if(a>b):
return a;
return b;
}
2.5 메서드의 호출
- 메서드의 호출 방법
참초변수.메서드 이름( ); // 메서드에 선언된 매개변수가 없는 경우
참조변수.메서드 이름(값1,값2,값3,....); // 메서드에 선언된 매개변수가 있는 경우
2.6 JVM의 메모리 구조
- 호출스택의 특징
- 메서드가 호출되면 수행에 필요한 메모리를 스택에 할당 받는다.
- 메서드가 수행을 마치면 사용했던 메모리를 반환한다.
- 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
2.7 기본형 매개변수와 참조형 매개변수
- 기본형 매개변수: 변수의 값을 읽기만 할 수 있다. (Read Only)
- 참조형 매개변수: 변수의 값을 읽고 변경할 수 있다. (Read & write)
2.8 재귀호출(recursive call)
- 재귀호출이란?
- 메서드 내에서 자기자신을 반복적으로 호출하는 것
- 재귀호출은 반복문으로 바꿀 수 있으며 반복문보다 성능이 나쁘다
- 이해하기 쉽고 간결한 코드를 작성할 수 있다
- 재귀호출의 예
- 팩토리얼, 제곱, 트리운행, 폴더목록표시 등
2.9 클래스메서드(static메서드)와 인스턴스메서드
- 인스턴스메서드
- 인스턴스 생성 후, 참조변수.메소드이름( )으로 호출
- 인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스변수 사용가능
-클래스메서드(static메서드)
- 객체생성없이 클래스이름.메서드이름( )으로 호출
- 인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스변수 사용불가
- 메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
class MyMath{
long a, b;
long add(){ //인스턴스메서드
return a+b;
}
static long add(long a, long b) { //클래스메서드(static 메서드)
return a+b;
}
}
2.10 멤버간의 참조와 호출 - 메서드의 호출
같은 클래스의 멤버간에는 객체 생성이나 참조변수 없이 참조할 수 있다. 그러나 static 멤버들은 인스턴스멤버들을 참조할 수 없다.
class TestClass{
void instanceMothod() {} //인스턴스 메소드
static void staticMethod() {} //클래스 메소드
void instanceMothod2(){ //인스턴스 메소드
instanceMethod(); //다른 인스턴스메서드를 호출한다.
staticMethod(); //stati메서드를 호출한다.
}
static void staticMethod2(){ //static메서드
instanceMethod(); //에러 발생 인스턴스메서드를 static메서드에서 호출할 수 없다.
staticMethod(); //static메서드는 호출 할 수 있다.
}
}
2.10 멤버간의 참조와 호출 - 변수의 접근
같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참좔 수 없다.
class TestClass2{
int iv;
static int cv;
void instanceMothod(){ //인스턴스메서드에서 인스턴스변수, 클래스변수를 사용할 수 있다.
System.out.println(iv);
System.out.println(cv);
}
static void staticMethod(){
System.out.println(iv); //에러 발생 인스턴스변수를 스태틱메서드에서 사용할 수 없다.
System.out.println(cv);
}
}
☞ 본 블로그 게시물의 작성은 자바의 정석 기초편 요약본을 보고 작성하였습니다.