JAN's History
자바의 정석 - CH6 객체지향 언어 1 - 2 본문
3. 변수와 메서드
변수의 선언 위치가 변수의 종류와 범위를 결정한다.
클래스 영역에서 선언하면 인스턴스 변수 혹은 클래스변수이다(공유변수). 메서드 영역은 지역변수.
▶ 인스턴스변수(instance variable)
- 인스턴스 생성 후, ‘참조변수.인스턴스변수명’으로 접근해야한다.
- 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해자동제거됨
▶ 클래스변수(class variable)
- 같은 클래스의 모든 인스턴스들이 공유하는 변수
- 인스턴스 생성없이 ‘클래스이름.클래스변수명’으로 접근할 수 있다.
- 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸
▶ 지역변수(local variable)
- 메서드 내에 선언되며, 메서드의 종료와 함께 소멸
- 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸
클래스 변수와 인스턴스 변수 차이점
인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
또 인스턴스는 ‘참조변수.인스턴스변수명’ 접근, 클래스 변수는 바로 ‘클래스이름.클래스변수명’로 접근가능.
위와 같이, 카드의 폯과 높이가 동일하므로 static으로 선언한다.
메서드 : 클래스 영역에만 정의할 수 있다.
메서드 호출 방법
1. 참조변수.메서드 이름(); // 메서드에 선언된 매개변수가 없는 경우
2. 참조변수.메서드 이름(값1, 값2..); // 메서드에 선언된 매개변수가 있는 경
return : 만나면 현재 실행중인 메서드를 종료하고 호출한 메서드로 돌아간다.
- 반환 값이 있는 메서드는 모두 return이 있어야한다.
- 없는 경우는 void로 return문이 없어도 된다.
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.
+ 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.
3 - 2 인스턴스 변수 VS 클래스변수 차이점
변수가 선언된 위치를 보면 변수의 종류를 알 수 있다.
인스턴스 변수 : 클래스 블럭 내에 선언된 변수
클래스 변수 : static이 붙은 변수
지역 변수 : 나머지 변수
int x; int y; => 인스턴스 변수는 class 내에서 선언 가능. (static없이)
Mypoint() => 이후 새로운 생성자에서 인스턴스를 참조변수 this로 객체들을 초기화 하는 것.
+생성자는 클래스명과 이름 같아야하며, 클래스에 생성자는 필수임.
+this는 인스턴스메서드에서만 사용 가능
double getDistance(int x1, int y1) => 메서드에서 static이 안붙어 있으니 인스턴스 메서드이다.
메서드 내에서 인스턴스 변수를 사용하므로 static를 붙일 수 없다.
+void가 없으니 return 값을 생성해주어야한다.(메서드에 return값은 필수)
Mypoint p = new Mypoint(1,1); => 인스턴스 변수는 참조변수.클래스명으로 접근 가능하기 때문에 참조변수 생성
sysout(p.getDistance(2,2)); => 인스턴스 변수는 참조변수.클래스명으로 접근 가능.
static double getDistance => static이 붙은 것을 보아, 클래스메소드임 (x, y는 지역변수)
+클래스변수는 객체 생성 필요없이 바로 사용가능하기 때문에 따로 객체 생성하지 않아도 됨.
+void가 없으니 return 값을 생성해주어야한다.(메서드에 return값은 필수)
sysout(getDistance(1, 1, 2, 2)); => 클래스메소드는 클래스 내에서 자유롭게 사용가능.
=> Mypoint클래스에 두 점간의 거리를 계산하는 메서드 getDistance()를 넣는다면 static 메서드 보다는 인스턴스 메서드로 정의하는 것이 더 적합하다.
4. 메서드 오버로딩
오버로딩의 조건
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
(리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)
다양하게 오버로딩된 메서드를 제공함으로써 모든 변수를 출력할 수 있도록 설계.
매개 변수의 이름이 다른 것은 오버로딩이 아니다.
리턴타입이 다른 것은 오버로딩의 성립조건이 아니다.
매개변수는 다르지만 같은 의미의 기능을 수행하므로 오버로딩이다.
'자바' 카테고리의 다른 글
자바의 정석 - CH7 객체지향 언어 2 - 3 (0) | 2023.04.12 |
---|---|
자바의 정석 - CH7 객체지향 언어 2 - 2 (0) | 2023.04.11 |
자바의 정석 - CH7 객체지향 언어 2 - 1 (0) | 2023.04.10 |
자바의 정석 - CH6 객체지향 언어 1 - 1 (0) | 2023.04.07 |
자바의 정석 - CH6 객체지향 언어 1 - 3 (0) | 2023.04.07 |