클래스 = 데이터 + 메소드 = 모든 프로그램은 다음 두 가지로 이뤄진다.
데이터 : 프로그램상에서 유지하고 관리해야 할 데이터
기능 : 데이터를 처리하고 조작하는 기능
클래스의 구성과 인스턴스화
class BankAccount{
int balance = 0;
public int deposit(int amount){...}
public int withdraw(int amount){...}
public int checkMyBalance(){...}
}
위와 같이 클래스 내에 위치한 변수와 메소드를 가리켜 각각 다음과 같이 부른다.
인스턴스 변수 : '클래스 내에 선언된 변수'
인스턴스 메소드 : '클래스 내에 정의된 메소드'
'인스턴스 변수는 같은 클래스 내에 위치한 메소드 내에서 접근이 가능하다'
참조변수 선언과 인스턴스의 생성
"참조 변수는 인스턴스를 참조한다."
"참조변수는 인스턴스를 가리킨다."
BankAccount myAcnt1 = new BankAccount();
BankAccount myAcnt2 = new BankAccount();
class BankAccount{
int balance = 0;
public int deposit(int amount){
balance += amount;
return balance;
}
public int withdraw(int amount){
balance -= amount;
return balance;
}
public int checkMyBalace(){
System.out.println("잔액 : " +balance);
return balance;
}
}
public class BankAcountOO {
public static void main(String[] args) {
BankAccount yoon = new BankAccount();
BankAccount park = new BankAccount();
yoon.deposit(5000);
park.deposit(3000);
yoon.withdraw(2000);
park.withdraw(2000);
yoon.checkMyBalace();
park.checkMyBalace();
}
}
----------------------------------------------------------------------
잔액 : 3000
잔액 : 1000
참조변수의 특성
변수는 저장된 값을 바꿀 수 있다. 그래서 이름이 변수이다. 마찬가지로 참조변수도 변수이다.
따라서 참조변수도 다음과 같이 참조하는 인스턴스를 바꿀수 있다.
BankAccount ref1 = new BankAccount();
BankAccount ref2 = ref1;
참조변수의 매개변수 선언
메소드를 호출할 때 값을 전달할 수 있고 이 값은 매개변수에 저장된다. 이와 유사하게
메소드를 호출하면서 인스턴스의 참조값을(주소값)을 전달하는것도 가능하다.
class BankAccount{
int balance = 0;
public int deposit(int amount){
balance += amount;
return balance;
}
public int withdraw(int amount){
balance -= amount;
return balance;
}
public int checkMyBalace(){
System.out.println("잔액 : " +balance);
return balance;
}
}
public class BankAcountOO {
public static void main(String[] args) {
BankAccount ref = new BankAccount();
ref.deposit(5000);
ref.withdraw(2000);
check(ref);
}
public static void check(BankAccount acc){
acc.checkMyBalace();
}
}
-----------------------------------------------------------------------
잔액 : 3000
----------------------------------------------------------------------
public static void check(BankAccount acc){
acc.checkMyBalace();
}
위 메솓의 매개변수로 BankAccount의 참조변수가 선언되었다. 즉 이 메소드는 인자로
인스턴스의 참조값(주소값)을 전달받는다. 따라서 메소드 내에서는 전달된 참조 값의 인스턴스
대상으로 메소드를 호출할 수 있다.
참조변수에 null 대입
때로는 참조변수가 참조하는(가리키는) 인스턴스와의 관계를 끊고 아무런 인스턴스도 참조하지
않도록 할 필요가 있다. 그리고 이때는 참조변수에 null을 대입하면 된다.
-----------------------------------------------------------------------
BankAccount ref = new BankAccount();
...
ref = null;
----------------------------------------------------------------------
그리고 참조변수에 null 저장 유무를 다음과 같이 확인할 수 있어서 유용하다.
if(ref == null)
생성자
생성자는 메소드와 모습이 같다. 따라서 생성자를 '생성자 메소드'로 표현하는 경우도 있다.
그러나 생성자는 다음과 같은 부분에서 메소드와 차이가 있다.
1.'생성자의 이름은 클래스의 이름과 동일해야 한다.'
2.'생성자는 값을 반환하지 않고 반환형도 표시하지 않는다.'
위의 조건을 만족하면 자바 컴파일러에 의해서 생성자로 인식된다.
따라서 인스턴스 생성시 자동으로 호출되어 인스턴스를 초기화하게 된다.
-----------------------------------------------------------------------
class BankAccount{
String accNumber;
String ssNumber;
int balance = 0;
public BankAccount(String acc, String ss, int bal){
accNumber = acc;
ssNumber = ss;
balance = bal;
}
public int deposit(int amount){
balance += amount;
return balance;
}
public int withdraw(int amount){
balance -= amount;
return balance;
}
public int checkMyBalace(){
System.out.println("계좌 번호 : " +accNumber);
System.out.println("주민번호 : "+ ssNumber);
System.out.println("잔액 : " +balance);
return balance;
}
}
public class BankAcountOO {
public static void main(String[] args) {
BankAccount yoon = new BankAccount("11-11-11","999999-9999999",10000);
BankAccount park = new BankAccount("22-22-22","999999-9999991",10000);
yoon.deposit(5000);
park.deposit(3000);
yoon.withdraw(2000);
park.withdraw(2000);
check(yoon);
check(park);
}
public static void check(BankAccount acc){
acc.checkMyBalace();
}
}
-----------------------------------------------------------------------
계좌 번호 : 11-11-11
주민번호 : 999999-9999999
잔액 : 13000
계좌 번호 : 22-22-22
주민번호 : 999999-9999991
잔액 : 11000
--------------------------------------------------------------------
yoon = new BankAccount("11-11-11","999999-999999",10000);
소괄호 안에 값을 전달하고 있는데 이 값들은 생성자가 호출될때 생성자의 매개변수로 전달이 된다.
즉 위와 같이 문장을 구성하면'인스턴스 생성 마지막 단계'에서 다음으 생성자가 호출되면서
값들이 전달된다. 그리고 이 값들로 인스턴스 변수가 초기화된다.
public BankAccount(String acc, String ss, int bal){
accNumber = acc;
ssNumber = ss;
balance = bal;
}
생성자와 관련해서 다음 사실을 반드시 기억해야 한다.
'인스턴스 생성의 마지막 단계는 생성자 호출이다'
'어떠한 이유로든 생성자 호출이 생략된 인스턴스는 인스턴스가 아니다'
출처 : 윤성우의 열혈 Java 프로그래밍