- 변수의 선언위치가 변수의 종류와 범위(scope)를 결정한다.
public class Variables{
publicint iv; //인스턴스변수
public static int cv; //클래스변수(static변수, 공유변수)
public void method(){
int lv =0; //지역변수
}
}
인스턴스변수(instance variable)
-각 인스턴스의 개별적인 저장공간. 인스턴스마다 다른 값 저장가능
-인스턴스 생성 후, '참조변수. 인스턴스변수명'으로 접근.
-인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해 자동제거된다.
-인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할수 있다.
클래스변수(class variable)
-같은 클래스의 모든 인스턴스들이 공유하는 변수
-인스턴스 생성없이 '클래스이름.클래스변수명'으로 접근.
-클래스가 로딩될 때 생성디고 프로그램이 종료될 때 소멸
-모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
class Card{
String kind;
int number; //인스턴스변수
static int width = 100;
static int height = 250; //클래스변수(static변수)
}
public class CardTest {
public static void main(String[] args) {
Card c1 =new Card();
c1.kind ="Heart";
c1.number = 7;
Card c2 = new Card();
c2.kind= "Diamond";
c2.number = 5;
System.out.println("c1은"+c1.kind+ ","+c1.number+"이며 크기는"+c1.width+","+c1.height+"입니다.");
System.out.println("c2은"+c2.kind+ ","+c2.number+"이며 크기는"+c2.width+","+c2.height+"입니다.");
c1.width=50; //인스턴스변수 width,heigh를 50,80으로 변경
c1.height=80;
System.out.println("c1은"+c1.kind+ ","+c1.number+"이며 크기는"+c1.width+","+c1.height+"입니다.");
System.out.println("c2은"+c2.kind+ ","+c2.number+"이며 크기는"+c2.width+","+c2.height+"입니다.");
}
}
지역변수(local variable)
-메서드 내에 선언되며, 메서드의 종료와 함께 소멸
-조건문,반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸
-작업을 수행하기 위한 명령문의 집합
-어떤 값을 입력받아서 처리하고 그 결과를 돌려준다.
-반복적인 코드를 줄이고 코드의 관리가 용이하다.
-반복적으로 수행되는 여러 문장을 메서드로 작성한다.
-하나의 메서드는 한가지 기능만 수행하도록 작성한다.
-관련된 여러 문장을 메서드로 작성한다.
메서드는 클래스 영억에만 정의할 수 있다.
현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다.
- 메서드가 정상적으로 종료되는 경우.
1.메서드의 블럭{}의 끝에 도달했을 때
2.메서드의 블럭{}을 수행 도중 return문을 만났을 때.
return문 사용할때 주의사항
1.반환값이 있는 메서드는 모든 경우에 return문이 있어야 한다.
2.return문을 적절히 사용하면 코드가 간결해진다.
참조변수.메서드 이름(); //메서드에 선언된 매개변수가 없는 경우
참조변수.메서드 이름(값1,값2,값3....); //메서드에 선언된 매개변수가 있는 경우
public class MyMath {
long add(long a, long b){
long result = a+b;
return result;
//return a+b;
}
}
class MM{
public static void main(String[] args) {
MyMath mm = new MyMath();
long value =mm.add(1L,2L);//매개변수가 있는 경우
System.out.println(value
);
}
}
기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.
class Data{ int x;}
public class ParameterTest {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main(): x = " + d.x);
change(d.x);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
public static void change(int x){
x = 1000;
System.out.println("change() : x = "+x);
}
}
참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.
class Data2{int x;}
public class ParameterTest2 {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main(): x = " + d.x);
change(d);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
public static void change(Data d){
d.x = 1000;
System.out.println("change() : x = "+d.x);
}
}
- 인스턴스메서드
-인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
-인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드
-메서드 내에서 인스턴스변수 사용가능- 클래스메서드(static메서드)
-객체 생성없이 '클래스이름.메서드이름()'으로 호출
-인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드
-메서드 내에서 인스턴스 변수 사용불가
-메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려.
public class ClassMethod {
public int a, b;
public int add(){ //인스턴스메서드(인스턴스변수사용)
return a+b;
}
public static int times(int a,int b){ //클래스메서드(static메서드)
return a * b;
}
}
public class ClassMethodTest {
public static void main(String[] args) {
System.out.println(ClassMethod.times(20,10)); //클래스메서드 호출
ClassMethod cm = new ClassMethod(); //인스턴스 생성
cm.a=20; //인스턴스 변수
cm.b=10;
System.out.println(cm.add()); //인스턴스메서드 호출
}
}
같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.
하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩,간단히 오버로딩이라고한다.
- 조건
1.메서드의 이름이 같아야 한다.
2.매개변수의 개수 또는 타입이 달라야 한다.
3.매개변수는 같고 리턴타입이 다른경우에는 오버로딩이 성립되지 않는다.
System.out.println() 메서드
다양하게 오버로딩된 메서드를 제공함으로써 모든 타입의 변수를 출력할 수 있도록 설계
- 매개변수의 이름이 다른 것은 오버로딩이 아니다.
-int add(int a, int b){ return a+b }
-int add(int x, int b){ return x+y } //매개변수 타입이 같아 오버로딩이 불가능- 매개변수의 타입이 다르므로 오버로딩이 성립한다.
-long add(int a,long b){ return a+b }
-long add(long a,int b){ return a+b }