열혈 Java 프로그래밍

[윤성우의 열혈 Java 프로그래밍] Chapter 07 클래스와 인스턴스

잉여진행중 2020. 7. 29. 01:12

개인적으로 헷갈리는 것 중요한 것 위주로 정리해두고 연습문제를 풀어본 글입니다.

 

클래스 내에는 인스턴스 변수인스턴스 메소드가 있다. (각각 클래스 내의 변수와 메소드)

클래스 안에 있는 변수와 메소드는 인스턴스 를 만들어서 사용할 수 있다. (new 사용)

 

class BankAccount {
    // 인스턴스 변수
    int balance = 0;
    
    // 인스턴스 메소드
    public int deposit(int amount) { }
    public int withdraw(int amount) { }
    public int checkMyBalance() { }
}

BankAccount myAcnt; // 참조변수 선언
myAcnt = new BankAccount(); // 인스턴스 생성
BankAccount myAcnt = 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 checkMyBalance() {
        System.out.println("잔액 : " + balance);
        return balance;
    }
}

class BankAccountOO {
    public static void main(String[] args) {
        //두 개의 인스턴스 생성
        BankAccount kim = new BankAccount();
        BankAccount lee = new BankAccount();
        
        //예금
        kim.deposit(5000);
        lee.deposit(3000);
        
        //출금
        kim.withdraw(2000);
        lee.withdraw(2000);
        
        //잔액 조회
        kim.checkMyBalance();
        lee.checkMyBalance();
    }
}

/*
출력 결과 (java BankAccountOO)

잔액 : 3000
잔액 : 1000

*/

참조변수는 참조하는 인스턴스 값을 바꿀 수 있다. 또한 하나의 인스턴스를 다수의 참조변수가 동시에 참조할 수 있다.

참조변수가 갖고있던 인스턴스 값을 버릴 때 null을 대입하면 된다.

BankAccount ref = new BankAccount();

 

ref = null; //null 값 대입

 

- String 클래스는 문자열을 참조변수로 선언할 수 있다.

String myLanguage = "Korean";

 

main 메소드를 갖고있지 않는 클래스에 있는 변수와 메소드를 사용하려면

인스턴스를 생성하여 사용할 수 있다.

ex)

class A { //main 없음 }

class B { //main 있음

    A first = new A();

    //first.-- 로 A의 변수와 메소드 사용 가능

    //이때 first가 참조변수

    }

 

- 생성자는 인스턴스를 생성할 때 초기화를 위해 자동으로 호출되는 메소드이다.

  생성자의 이름은 클래스 이름과 동일해야 한다.

  생성자는 반환형 값이 없고 표시하지 않는다.

생성자를 사용하지 않았을 때, 참조변수를 생성한 뒤 initAccount로 초기화를 진행해야 한다.
생성자를 사용했을 때, 참조변수를 생성하면서 클래스와 이름이 같은 BankAccount 생성자로 초기화도 진행할 수 있다.

* BankAccount 클래스 내부에서는 정의한 accNumber, ssNumber, balance만 사용하고 

  외부에서 BankAccount를 사용할 때 생성자로 정의한 acc, ss, bal을 사용한다!

 

- 디폴트 생성자

public BankAccount( ) { }

컴파일러가 자동으로 넣어주는 것으로 인자를 전달받지 않는 형태지만,

이것으로 인스턴스 생성을 위한 생성자 호출 조건을 부합할 수 있다. (엔간하면 직접 생성자 정의)

 

클래스 이름 > 첫 문자는 대문자 ex.AppleBanana

메소드 이름 > 첫 문자는 소문자 ex.appleBanana

상수 이름    > 모든 문자를 대문자 단어연결 시 언더바(_) ex.APPLE_BANANA


<문제 07-1.>

class Triangle {
    int base;
    int height;
    
    //생성자 정의
    public Triangle(int b, int h) {
        base = b;
        height = h;
    }
    
    public void setBase(int b) { //밑변 변경
        base = b;
    }
    public void setHeight(int h) { //높이 변경
        height = h;
    }
    public double TriangleArea() { //넓이 계산
        return (base * height) * 0.5;
    }
}  
 
class ApplicTriangle {
    public static void main(String[] args) {
        Triangle shape = new Triangle(5, 7);
        
        System.out.println("삼각형의 넓이 : " + shape.TriangleArea());
        
        shape.setBase(10); //밑변 변경
        shape.setHeight(8); //높이 변경
        System.out.println("바뀐 삼각형의 넓이 : " + shape.TriangleArea());
    }
}

/*
출력결과

삼각형의 넓이 : 17.5
바뀐 삼각형의 넓이 : 40.0

*/