클래스 정의와 인스턴스 생성
Class = Data + Method
데이터 = 프로그램상에서 유지 관리
기능 = 데이터를 처리하고 조작
데이터는 변수의 선언을 통해 유지, 변수에 저장된 데이터는 메소드의 호출을 통해 처리
public class Main1 {
static int balance = 0;
public static void main(String[] args) {
deposit(10000);
checkMybalance();
withdraw(1000);
checkMybalance();
}
public static int deposit(int amount){
balance += amount;
return balance;
}
public static int withdraw(int amount){
balance -= amount;
return balance;
}
public static int checkMybalance(){
System.out.println("잔액 :" + balance);
return balance;
}
}
메소드 deposit, withdraw, checkMybalance 내에서 접근하는 변수 balance는 2행에 선언된 변수
데이터 : 변수 balance는 프로그램상에서 데이터
기능 : 메소드 deposit, withdraw, checkMybalance는 프로그램상에서의 기능
따라서 변수 balance는 메소드들과 긴밀히 연관되어 있다.
연관있는 변수들을 묶기 위해 존재하는 것이 class. 클래스를 이용하면 변수 balance 그리고 이와 관련된 모든 메소드를 하나로 묶을 수 있다.
클래스 구성과 인스턴스화
클래스 내에 위치한 변수와 메소드
인스턴스 변수 : 클래스 내에 선언된 변수
인스턴스 메소드 : 클래스 내에 정의된 메소드
public class Main1 {
static int balance = 0;
public static void main(String[] args) {
deposit(10000);
checkMybalance();
withdraw(1000);
checkMybalance();
}
인스턴스 변수는 참고로 지역변수와는 다른 개념. 인스턴스 변수가 선언된 위치는 메소드 내부가 아니므로 이 둘 성격은 다르다. (static int balance)
인스턴스 변수는 같은 클래스 내에 위치한 메소드 내에서 접근 가능
new Main1 -> Main1 클래스의 인스턴스화
클래스의 정의는 틀, 구성하는 것과 같다. 하지만 클래스가 정의된다고 해서 그 안에 위치한 변수난 메소드를 사용할 수 있는 것은 아니다. 메모리상에 인스턴스를 만들기만 해서는 사용 할 수 없음. -> 참조 변수가 필요하다.
인스턴스의 다른 표현은 객체
클래스를 정의하고 이를 기반으로 만들어진 인스턴스를 객체라고 한다.
클래스 Main1 a => 참조변수 a의 선언
참조변수를 선언하고, 새로 생성되는 인스턴스를 가리키게 할 수 있다.
a = new Main1( );
new라는 키워드를 통해 인스턴스를 생성하면 생성된 인스턴스의 주소 값 반환. 즉 참소변수에는 생성된 인스턴스의 주소값이 저장.
참조변수는 인스턴스를 참조.
참조변서는 인스턴스를 가르킨다.
참조변수 선언과 인스턴스의 생성을 한 문장으로 묶을 수도 있다.
Main1 main = new Main1( );
참조변수를 통해 인스턴스 메소드를 호출 할 수 도 있다.
a.deposit();
public class Main2 {
public static void main(String[] args) {
BankAccount yoon = new BankAccount();
BankAccount ik = new BankAccount();
BankAccount ref1 = new BankAccount();
BankAccount ref2 = ref1;
ref1.deposit(3000);
ref2.deposit(6000);
ref1.withdraw(3000);
ref2.withdraw(6000);
ref1.checkMyBalance();
ref2.checkMyBalance();
yoon.deposit(5000);
ik.deposit(3000);
yoon.withdraw(1000);
ik.withdraw(5000);
yoon.checkMyBalance();
ik.checkMyBalance();
}
}
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 checkMyBalance(){
System.out.println("잔액 :" + balance);
return balance;
}
}
참조 변수의 특성
변수는 저장된 값을 변경 가능, -> 참조 변수도 마찬가지로 변수. 따라서 참조변수도 다음과 같이 참조하는 인스턴스 변경 가능
BankAccount ref1 = new BankAccount();
BankAccount ref2 = ref1;
Ref1이 참조하는 대상을 ref2로 변경
두개의 참조변수 ref1 와 ref2가 하나의 인스턴스를 참조
참조변수의 매개변수
메소드를 호출하면서, 인스턴스의 참조 값을 전달 하는 것도 가능
public class Main3 {
public static void main(String[] args) {
BankAccount ref = new BankAccount();
ref.deposit(1000);
ref.withdraw(3000);
check(ref);
}
public static void check(BankAccount acc){
acc.checkMyBalance();
}
}
class BankAccount2 {
int balance = 0;
public int deposit(int amount){
balance += amount;
return balance;
}
public int withdraw(int amount){
balance -= amount;
return balance;
}
public int checkMyBalance(){
System.out.println("잔액 :" + balance);
return balance;
}
}
public static void check(BankAccount acc){
acc.checkMyBalance();
}
acc가 참조하는 인스턴스의 메소드 호출. 즉 다시 말해 메소드의 매개 변수로 BankAccount2의 참조변수가 선언됨.
따라서 메소드 내에서는 전달된 참조 값의 인스턴스를 대상으로 메소드를 호출 할 수 있다.
참조 변수에 null 대입
인스턴스와의 관계를 끊고, 아무런 인스턴스도 참조하지 못하도록 할 필요가 있다.
이때는 참조변수에 null 대입
Ref = null ;
생성자와 String 클래스의 소개
String 클래스에 대한 첫 소개
문자열은 참조변수를 선언해서 참조 할 수 있다.
String myName = “Hwang” ;
public class Main4 {
public static void main(String[] args) {
String str1 = "Happy";
String str2 = "birthday";
System.out.println(str1 + " " + str2);
printString(str1);
printString(str2);
}
public static void printString(String str){
System.out.println(str);
}
}
public static void printString(String str){
System.out.println(str);
}
}
이는 참조 변수를 매개변수로 선언해서 문자열을 전달 받을 수 있음
문자열은 메소드의 인자로 전달
메개변수로 String형 참조변수를 선언하여, 문자열을 인자로 받을 수 있다.
인스턴스를 구분할 수 있는 유일한 정보를 갖게 하자
public class Main5 {
public static void main(String[] args) {
BankAccount3 yoon = new BankAccount3();
yoon.initAccountBalance("12-34-89", "9090909090", 100000);
BankAccount3 park = new BankAccount3();
park.initAccountBalance("33-35-39", "707070707", 200000);
yoon.deposit(5000);
park.deposit(5000);
yoon.withdraw(3000);
park.withdraw(2000);
yoon.checkMyBalance();
park.checkMyBalance();
}
}
class BankAccount3 {
String accNumber;
String ssNumber;
int balance = 0;
public void initAccountBalance(String acc, String ss, int bal) {
accNumber = accNumber;
ssNumber = ssNumber;
balance = bal;
}
public int deposit(int amount) {
balance += amount;
return balance;
}
public int withdraw(int amount) {
balance -= amount;
return balance;
}
public int checkMyBalance() {
System.out.println("잔액 :" + balance);
System.out.println("계좌번호:" + accNumber);
System.out.println("주민번호:" + ssNumber);
return balance;
}
}
public void initAccountBalance(String acc, String ss, int bal) {
accNumber = accNumber;
ssNumber = ssNumber;
balance = bal;
}
초기화를 위한 메소드
이 메소드는 다른 메소드들과는 성격이 조금 다르다.
인스턴스의 초기화를 위한 메소드.
인스턴스 생성시 반드시 한번 호출 해서 초기화를 진행
생성자
생성자는 메소드와 같은 모습. 생성자 메소드로 표현하는 경우도 있다.
생성자가 되기 위한 조건
생성자의 이름은 클래스의 이름과 동일
생성자는 값을 반환하지 않고 반환형도 표현하지 않는다.
public class Main6 {
public static void main(String[] args) {
BankAccount4 yoon = new BankAccount4("12-34-89","909090-90909", 1000);
BankAccount4 park = new BankAccount4("12-34-89","909090-90909", 1000);
yoon.deposit(5000);
park.deposit(5000);
yoon.withdraw(3000);
park.withdraw(2000);
yoon.checkMyBalance();
park.checkMyBalance();
}
}
class BankAccount4 {
String accNumber;
String ssNumber;
int balance = 0;
public BankAccount4(String accNumber, String ssNumber, int balance) {
this.accNumber = accNumber;
this.ssNumber = ssNumber;
this.balance = balance;
}
public int deposit(int amount) {
balance += amount;
return balance;
}
public int withdraw(int amount) {
balance -= amount;
return balance;
}
public int checkMyBalance() {
System.out.println("잔액 :" + balance);
System.out.println("계좌번호:" + accNumber);
System.out.println("주민번호:" + ssNumber);
return balance;
}
}
public BankAccount4(String accNumber, String ssNumber, int balance) {
this.accNumber = accNumber;
this.ssNumber = ssNumber;
this.balance = balance;
}
생성자 생성
public static void main(String[] args) {
BankAccount4 yoon = new BankAccount4("12-34-89","909090-90909", 1000);
BankAccount4 park = new BankAccount4("12-34-89","909090-90909", 1000);
소괄호 안에 값을 전달하고 있는데 -> 생성자가 호출될 때 생성자의 매개변수로 전달된다.
인스턴스 생성 마지막 단계에서 다음의 생성자가 호출되면서 전달된다.
public BankAccount4(String accNumber, String ssNumber, int balance) {
this.accNumber = accNumber;
this.ssNumber = ssNumber;
this.balance = balance;
}
인스턴스 변수 초기화
기억해야 할 부분
인스턴스 생성의 마지막 단계는 생성자 호출
생성자 호출이 생략된 인스턴스는 인스턴스가 아니다.
디폴트 생성자
생성자가 없는 클래스를 수차례 정의해 왔다. 이들을 대상으로 인스턴스를 생성한 바가 있기도 하다. 생성자를 생략하면, 자바 컴파일러가 디폴트 생성자라는 것을 클래스의 정의에 넣어준다.
디폴트 생성자는 인자를 전달받지 않은 형태로 정의 되어 삽입. 내부적으로 하는 일은 따로 없지만, 인스턴스 생성 규칙인 생성자의 호출은 유지 된다.
상수의 이름 규칙
상수 이름은 변수의 이름과 구분되도록 대문자 사용. Final 선언을 기반으로 상수의 선언은 이와 같이 선언 하는 것이 좋다
Final int COLOR = 7;
public class Main7 {
public static void main(String[] args) {
Triangle triangle = new Triangle(3, 4);
System.out.println(triangle.area());
triangle.setLegenth(8);
triangle.setHeight(33);
System.out.println(triangle.area());
}
}
class Triangle{
int height;
int below;
public Triangle(int height, int below) {
this.height = height;
this.below = below;
}
public int setHeight(int a){
height = a;
return height;
}
public int setLegenth ( int b){
below = b;
return below;
}
public int area(){
return (height * below)/2;
}
}