[Java] 8. 클래스(2)

2023. 9. 22. 16:33Java언어 공부

메소드의 구현

 

구현하기 전 검토사항

 

- 객체의 상태를 바꾸는 개체 메소드 vs 바꾸지 않는 클래스 메소드

- 객체 메소드의 위치가 적절한지 ( 다른 클래스에 위치한 게 더 적절할 수 도 있음)

- 메소드의 접근 권한 ( public인지 private인지. 디폴트 값은 private이고, 보통은 public으로 많이 구현 )

- 메소드의 매개 변수의 조건이라던가 매개 변수가 많으면 다른 함수로 구현하는게 나을 수도 있음

- 부작용 검토

 

사전 조건

 

메소드의 호출자가 지켜야 하는 요구사항

 

- 인자 값

- 객체의 상태

 

사전 조건이 위배된 경우에는?

 

- 예외 처리 ( throw 등)

- 아무것도 하지 않음

 

사후 조건

 

사전 조건에 따라 메소드가 호출되었을 때 메소드 실행 후 보장해야 하는 조건

 

- 반환 값의 정확성

- 객체의 상태

 

불변 조건

 

변하지 않는 조건 

 

- 루프 불변 조건 : 루프가 반복되는 동안 변하지 않는 조건ex) 1부터 n까지의 합을 더한 값을 sum이 갖고 있는다면,sum은 루프가 끝날 때까지 이 더한 값을 가리켜야 한다.

 

- 클래스 불변 조건 : 이 클래스의 객체가 항상 만족해야 하는 조건ex) 초등학생 학년 상태를 멤버 변수로 가지고 있다면,클래스의 불변 조건은 이 변수의 범위가 항상 1부터 6사이에 있어야 한다.

 

클래스를 설계할 때 어떤 불변 조건이 있는지 찾아내고, 메소드를 통해 상태가 변하더라도 불변 조건은 계속 만족하도록 구현해야 한다.

 

부작용

 

함수가 값을 생성하는 것 외에 상태를 변경하거나 호출한 함수 또는

외부와 의미 있는 상호작용을 한 경우, 부작용이 있다고 한다.

 

ex) void swap (int* a, int* b)

 

객체지향에서는 메소드가 호출된 객체 외에 다른 객체의 상태를 변경하면

부작용이 있다고 한다.

=> 바람직하지 않다

 

인자 전달 방식

 

자바에서는 값 전달 방식만 있다.

 

함수를 호출할 때, 인자로 값이 그대로 전달되는 것이 아닌, 복사가 되어 전달되는 것이, 

값 전달 (call-by-value)라고 한다.

 

하지만 원시 타입을 제외한 참조 타입 (객체) 들은 값 전달 방식을 하면,

객체 자체를 전달 하는 것이 아닌, 주소를 전달하게 된다.

 

자바에서는 한 함수에서 가리키는 주소를 다른 함수에서 절대 바꿀 수 없다.

 

 

static 멤버 변수와 메소드

 

- static 멤버 변수

 

개별 객체가 유지하는 변수가 아니라 모든 객체가 공유하는 변수이다.

객체를 생성하지 않아도 접근이 가능하다.

 

 

- static 메소드

 

클래스 이름을 이용하여 호출함

숨겨진 매개 변수 this가 없는 메소드이다.

 

1. static 멤버 변수를 조작/접근하기 위한 메소드

2. 객체를 생성하는 메소드

3. 객체 메소드가 아닌 일반 함수를 정의하기 위해 사용

 

상수

 

상수 변수 : 한번 값을 할당하면 더 이상 변경할 수 없다.

선언은 fianl 키워드를 이용한다.

 

ex) final double PI = 3.142;

 

클래스의 객체마다 필요없을 경우 => static 사용

외부에서 접근은 할 수 있게 할 경우 => public (하지만 final 때문에 값을 변경 불가)

 

Static 멤버 변수

 

public class BankAccount{
	private int balance=0;
    private int accountNumber;
    private static int lastAssignedNumber=0;
    public BankAccount(){
    	++lastAssignedNumber;
        accountNumber = lastAssignedNumber;
    }
    public BankAccount(int amoubt){
    	this();
        deposit(amount);
    }
}

public class BankAccount{
	private int balance = 0;
    private int accountNumber = assignNumber();
    private static int assignNumber(){
    	return ++lastAssignNumber;
    }
}


public class BankAccount{
	private int balance = 0;
    private int accountNumber;
    private static int lastAssignedNumber = 0;
    {
    	++lastAssignedNumber;
        accountNumber = lastAssignedNumber;
    }
    public BankAccount(){}
    public BankAccount(int amount){
    	deposit(amount);
    }
}